/// <summary> /// Делает ход "Не верю" /// </summary> /// <param name="move"></param> public void MakeDontBeleiveMove(DontBelieveMove 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.MakeDontBeleiveMove(move, out takedLoserCards, out loserId); } finally { _moveMutex.ReleaseMutex(); } }
public MakeDontBeliveMoveResult MakeDontBeliveMove(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 move = new DontBelieveMove(selectedCardId, playerId); var checkedCard = gameTable.GetCardFromCurrentRoundById(selectedCardId); gameTable.MakeDontBeleiveMove(move, out var takedLoserCards, out var loserId); return(new MakeDontBeliveMoveResult() { GameTableId = gameTable.Id, NextMoverId = gameTable.CurrentMover?.Id, 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(), NextPossibleMoves = gameTable.GameInProgress ? gameTable.GetNextPossibleMoves().Select(mt => MoveTypesUtils.GetMoveType(mt)).ToList() : new List <MoveType>() }); }
/// <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); } }