예제 #1
0
        public async Task <ActionResult <GameStateDTO> > CreateGuessWord(Guid gameRoomId, Guid guessWordId,
                                                                         NewGuessLetterRequestDTO newGuessLetterRequestDTO)
        {
            var newGuessLetterDTO = new NewGuessLetterDTO
            {
                GameRoomId  = gameRoomId,
                GuessWordId = guessWordId,
                PlayerId    = newGuessLetterRequestDTO.PlayerId,
                GuessLetter = newGuessLetterRequestDTO.GuessLetter
            };

            _logger.LogInformation("New guess letter creation: {@newGuessLetterDTO", newGuessLetterDTO);

            var validator        = new NewGuessLetterValidator(_gameRoomServiceAsync, _playerServiceAsync);
            var validationResult = validator.Validate(newGuessLetterDTO);

            if (!validationResult.IsValid)
            {
                return(BadRequest(validationResult.Errors));
            }

            var gameStateDTO = await _gameRoomServiceAsync.UpdateGameRoundState(newGuessLetterDTO);

            return(StatusCode(201, gameStateDTO));
        }
예제 #2
0
        public async Task <GameStateDTO> UpdateGameRoundState(NewGuessLetterDTO newGuessLetterDTO)
        {
            var guessWord = await GetGuessedWord(newGuessLetterDTO.GuessWordId);

            var newGuessLetterString = newGuessLetterDTO.GuessLetter;

            _logger.LogInformation("Persisting new player's move...");
            await CreateGuessLetter(guessWord !, newGuessLetterString);  // previously validated guess word

            var gameRound       = guessWord !.Round;
            var allGuessLetters =
                guessWord.GuessLetters.Select(letter => letter.Letter); // with new guess letter already
            var updatedGameState = new GameStateDTO()
            {
                GuessWord      = null,
                IsOver         = false,
                PlayerHealth   = guessWord.Round.Health,
                GuessWordSoFar = _gameLogic.GetGuessWordSoFar(allGuessLetters, guessWord.Word),
                GuessedLetters = allGuessLetters,
            };

            if (_gameLogic.IsGuessedLetterInGuessWord(newGuessLetterString, guessWord.Word))
            {
                _logger.LogInformation("Player guessed a right letter. Checking if turn is over...");
                if (_gameLogic.HasPlayerHasDiscoveredGuessWord(allGuessLetters, guessWord.Word))
                {
                    _logger.LogInformation("Guess word {:l} has been found! Turn is over...", guessWord.Word);
                    gameRound = _gameLogic.FinishGameRound(gameRound);
                    await _repositoryGameRound.Update(gameRound);

                    _logger.LogInformation("Setting final game state for return...");
                    updatedGameState.IsOver    = true;
                    updatedGameState.GuessWord = guessWord.Word;
                }
            }
            else
            {
                _logger.LogInformation("Player has guessed a wrong letter. Punishing him with a health hit...");
                gameRound = _gameLogic.ReducePlayerHealth(gameRound);

                if (_gameLogic.HasPlayerBeenHung(gameRound))
                {
                    _logger.LogInformation("Player has been hung and is dead! Turn is over...");
                    gameRound = _gameLogic.FinishGameRound(gameRound);

                    _logger.LogInformation("Setting final game state for return...");
                    updatedGameState.IsOver    = true;
                    updatedGameState.GuessWord = guessWord.Word;
                }

                await _repositoryGameRound.Update(gameRound);
            }

            updatedGameState.PlayerHealth = gameRound.Health;

            _logger.LogInformation("Returning updated game state data...");
            return(updatedGameState);
        }