示例#1
0
        /// <summary>
        /// Делает ход "Верю"
        /// </summary>
        /// <param name="move"></param>
        public void MakeBeleiveMove(BelieveMove move, out IReadOnlyCollection <IPlayingCardInfo> takedLoserCards, out Guid loserId)
        {
            if (move == null)
            {
                throw new ArgumentNullException(nameof(move));
            }

            try
            {
                _moveMutex.WaitOne();

                if (IsInvalid)
                {
                    throw new TrueFalseGameException("Игровой стол находится в инвалидном состоянии");
                }

                if (CurrentGame == null)
                {
                    throw new TrueFalseGameException("Игра еще не началась");
                }

                CurrentGame.MakeBeleiveMove(move, out takedLoserCards, out loserId);
            }
            finally
            {
                _moveMutex.ReleaseMutex();
            }
        }
        public MakeBeleiveMoveResult MakeBelieveMove(Guid playerId, int selectedCardId)
        {
            if (selectedCardId <= 0)
            {
                throw new ArgumentException(nameof(selectedCardId));
            }

            var player = _playerRepository.GetById(playerId);

            if (player == null)
            {
                throw new NullReferenceException($"Отсутствует пользователь с id = {playerId}");
            }

            var gameTable = _gameTableRepository.GetByPlayer(player);

            if (gameTable == null)
            {
                throw new Exception($"Игрок с Id = {playerId} не находится за игровым столом");
            }

            var checkedCard = gameTable.GetCardFromCurrentRoundById(selectedCardId);

            var move = new BelieveMove(selectedCardId, playerId);

            gameTable.MakeBeleiveMove(move, out var takedLoserCards, out var loserId);

            return(new MakeBeleiveMoveResult()
            {
                GameTableId = gameTable.Id,
                NextMoverId = gameTable.CurrentMover.Id,
                NextPossibleMoves = gameTable.GetNextPossibleMoves().Select(mt => MoveTypesUtils.GetMoveType(mt)).ToList(),
                CheckedCard = new PlayingCardDto()
                {
                    Id = checkedCard.Id,
                    Rank = (int)checkedCard.Rank,
                    Suit = (int)checkedCard.Suit
                },
                LoserId = loserId,
                TakedLoserCards = takedLoserCards.Select(c => new PlayingCardDto()
                {
                    Id = c.Id,
                    Rank = (int)c.Rank,
                    Suit = (int)c.Suit
                }).ToList()
            });
        }
示例#3
0
        /// <summary>
        /// Делает ход "Верю"
        /// </summary>
        /// <param name="move"></param>
        public void MakeBeleiveMove(BelieveMove 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()) // Проиграл
            {
                loser = GetPreviousMover();
                loser.GiveCards(loserCards);
            }
            else // Выиграл
            {
                gamePlayer.GiveCards(loserCards);
                loser = gamePlayer;
            }

            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);
            }
        }