/// <summary> /// Возвращает карты игрока /// </summary> /// <param name="playerId"></param> /// <param name="cardIds"></param> /// <returns></returns> public IReadOnlyCollection <IPlayingCardInfo> GetPlayerCards(Guid playerId, IReadOnlyCollection <int> cardIds = null) { if (cardIds == null) { throw new ArgumentNullException(nameof(cardIds)); } if (!IsStarted) { throw new TrueFalseGameException("Игра еще не началась. Карты не розданы"); } if (IsEnded) { throw new TrueFalseGameException("Игра уже закончилась"); } var gamePlayer = GamePlayers.FirstOrDefault(gp => gp.Player.Id == playerId); if (gamePlayer == null) { throw new TrueFalseGameException($"Игрока с Id = {playerId} нет за игровым столом"); } if (cardIds != null) { return(gamePlayer.Cards.Where(c => cardIds.Contains(c.Id)).ToList()); } return(gamePlayer.Cards); }
/// <summary> /// Делает ход "Первый ход" /// </summary> /// <param name="move"></param> public void MakeFirstMove(FirstMove move) { if (!CanMakeMove()) { throw new TrueFalseGameException("В данный момент нельзя совершать ходы"); } if (CurrentRound.MovesCount > 0) { throw new TrueFalseGameException("Первый ход уже был сделан"); } if (move == null) { throw new ArgumentNullException(nameof(move)); } var gamePlayer = GamePlayers.FirstOrDefault(p => p.Player.Id == move.InitiatorId); if (gamePlayer == null) { throw new TrueFalseGameException($"Игрока с Id = {move.InitiatorId} нет за игровым столом"); } if (CurrentMover.Id != gamePlayer.Player.Id) { throw new TrueFalseGameException($"Ход вне очереди со стороны пользователя с Id = {move.InitiatorId}"); } if (!ValidateFirstMove(move)) { throw new TrueFalseGameException("Не валидный ход"); } gamePlayer.TakeCards(move.Cards.Select(c => c.Id).ToList()); CurrentRound.AddMove(move); SetNextMover(); }
/// <summary> /// Удаляет пользователя из игры /// </summary> /// <param name="player"></param> public void RemovePlayer(Player player) { throw new NotImplementedException(); if (player == null) { throw new ArgumentNullException(nameof(player)); } var gamePlayer = GamePlayers.FirstOrDefault(gp => gp.Player.Id == player.Id); if (gamePlayer == null) { throw new TrueFalseGameException($"Игрока с Id = {player.Id} нет в данной игре"); } if (!IsStarted || IsEnded) { GamePlayers.Remove(gamePlayer);// todo Убрать удаление игрока из коллекции, но проставить ему флаг типа он ливнул, чтобы не учитывать его при расчете некст хода } else { } }
/// <summary> /// Делает ход "Не верю" /// </summary> /// <param name="move"></param> public void MakeDontBeleiveMove(DontBelieveMove move, out IReadOnlyCollection <IPlayingCardInfo> takedLoserCards, out Guid loserId) { if (!CanMakeMove()) { throw new TrueFalseGameException("В данный момент нельзя совершать ходы"); } if (move == null) { throw new ArgumentNullException(nameof(move)); } if (CurrentRound.MovesCount == 0) { throw new TrueFalseGameException("В данный момент нельзя совершать ход этого типа"); } var gamePlayer = GamePlayers.FirstOrDefault(p => p.Player.Id == move.InitiatorId); if (gamePlayer == null) { throw new TrueFalseGameException($"Игрока с Id = {move.InitiatorId} нет за игровым столом"); } if (CurrentMover.Id != gamePlayer.Player.Id) { throw new TrueFalseGameException($"Ход вне очереди со стороны пользователя с Id = {move.InitiatorId}"); } var lastCards = CurrentRound.GetLastCards(); if (lastCards == null || lastCards.Count == 0) { throw new Exception("Ошибка логики кода. Ожидался не пустой список карт"); } var selectedCard = lastCards.FirstOrDefault(c => c.Id == move.SelectedCardId); if (selectedCard == null) { throw new TrueFalseGameException("Указанныая пользователем карта не может быть выбрана для проверки так как ее нет в картах последнего хода"); } var loserCards = CurrentRound.GetAllCards(); takedLoserCards = loserCards; GamePlayer loser; if (selectedCard.Rank == CurrentRound.GetRank()) // Проиграл { gamePlayer.GiveCards(loserCards); loser = gamePlayer; } else // Выиграл { loser = GetPreviousMover(); loser.GiveCards(loserCards); } CurrentRound.AddMove(move); CurrentRound.End(loser.Player); loserId = loser.Player.Id; if (GamePlayers.Where(gp => gp.Cards.Any()).Count() == 1) // Игра закончилась { End(loser); } else // Закончился раунд { NextRound(); SetNextMover(loser); } }
private GamePlayer GetPreviousMover() { return(GamePlayers.FirstOrDefault(gp => gp.Player.Id == CurrentRound.GetLastMove().InitiatorId)); }