示例#1
0
        /// <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);
        }
示例#2
0
        /// <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();
        }
示例#3
0
        /// <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
            {
            }
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
 private GamePlayer GetPreviousMover()
 {
     return(GamePlayers.FirstOrDefault(gp => gp.Player.Id == CurrentRound.GetLastMove().InitiatorId));
 }