Exemplo n.º 1
0
        public async Task <IActionResult> MakeMove(string gameId, string playerId, [FromBody] MakeMoveResource resource)
        {
            resource.GameId   = gameId;
            resource.PlayerId = playerId;

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState.GetErrorMessages()));
            }

            var result = await _service.MakeMove(resource);

            if (!result.Success)
            {
                if (result.Status == ResponseStatus.NOT_PLAYERS_TURN)
                {
                    return(new StatusCodeResult(409));
                }

                if (result.Status == ResponseStatus.NOT_FOUND)
                {
                    return(NotFound());
                }

                return(BadRequest(result.Message));
            }

            return(Ok(resource));
        }
Exemplo n.º 2
0
        public async Task <MakeMoveResponse> MakeMove(MakeMoveResource resource)
        {
            var move = _mapper.Map <MakeMoveResource, Move>(resource);
            var game = await _repository.FindGameById(move.GameId);

            if (game == null || (game != null && !game.GamePlayers.Any(gp => gp.PlayerId == resource.PlayerId)))
            {
                return(new MakeMoveResponse(ResponseStatus.NOT_FOUND));
            }

            if (game.State == GameState.DONE)
            {
                return(new MakeMoveResponse(ResponseStatus.BAD_REQUEST));
            }

            // Validate Move & Turn
            if (!IsTurn(move.PlayerId, game))
            {
                return(new MakeMoveResponse(ResponseStatus.NOT_PLAYERS_TURN));
            }

            var board = HydrateBoard(game);

            if (!IsValidMove(move.Column, board))
            {
                return(new MakeMoveResponse(ResponseStatus.BAD_REQUEST));
            }

            try{
                await _repository.MakeMove(move);

                // Refactor -- rehydrate board to grab new move
                board = HydrateBoard(game);
                if (BoardContainsWin(board))
                {
                    game.WinnerId = move.PlayerId;
                    game.State    = GameState.DONE;
                    _repository.UpdateGame(game);
                }
                else if (BoardContainsDraw(board))
                {
                    game.State = GameState.DONE;
                    _repository.UpdateGame(game);
                }

                await _repository.CompleteAsync();

                return(new MakeMoveResponse(resource));
            }
            catch (Exception ex) {
                // Add logging...
                return(new MakeMoveResponse($"An error occurred when making the move: {ex.Message}"));
            }
        }