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