public IHttpActionResult Play(PlayRequestDataModel request)
        {
            var currentUserId = this.userIdProvider.GetUserId();

            if (request == null || !ModelState.IsValid)
            {
                return(this.BadRequest(ModelState));
            }

            var idAsGuid = new Guid(request.GameId);

            var game = this.data.Games.Find(idAsGuid);

            if (game == null)
            {
                return(this.BadRequest("Invalid game id!"));
            }

            if (game.FirstPlayerId != currentUserId &&
                game.SecondPlayerId != currentUserId)
            {
                return(this.BadRequest("This is not your game!"));
            }

            if (game.State != GameState.TurnX &&
                game.State != GameState.TurnO)
            {
                return(this.BadRequest("Invalid game state!"));
            }

            if ((game.State == GameState.TurnX &&
                 game.FirstPlayerId != currentUserId)
                ||
                (game.State == GameState.TurnO &&
                 game.SecondPlayerId != currentUserId))
            {
                return(this.BadRequest("It's not your turn!"));
            }

            var positionIndex = (request.Row - 1) * 3 + request.Col - 1;

            if (game.Board[positionIndex] != '-')
            {
                return(this.BadRequest("Invalid position!"));
            }

            // Update games state and board
            var boardAsStringBuilder = new StringBuilder(game.Board);

            boardAsStringBuilder[positionIndex] =
                game.State == GameState.TurnX ? 'X' : 'O';
            game.Board = boardAsStringBuilder.ToString();

            game.State = game.State == GameState.TurnX ?
                         GameState.TurnO : GameState.TurnX;

            this.data.SaveChanges();

            var gameResult = resultValidator.GetResult(game.Board);

            switch (gameResult)
            {
            case GameResult.NotFinished:
                break;

            case GameResult.WonByX:
                game.State = GameState.WonByX;
                this.data.SaveChanges();
                break;

            case GameResult.WonByO:
                game.State = GameState.WonByO;
                this.data.SaveChanges();
                break;

            case GameResult.Draw:
                game.State = GameState.Draw;
                this.data.SaveChanges();
                break;

            default:
                break;
            }

            return(this.Ok());
        }
Пример #2
0
        public void GetResult_NoWinner_ShouldReturnGameStateNotFinished()
        {
            var result = validator.GetResult("OXOOOXXOX");

            Assert.AreEqual(GameResult.NotFinished, result);
        }