public IHttpActionResult Update([FromBody] PlayRequestDataModel userRequest)
        {
            if (!this.ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var user = this.data.Users.All()
                       .Where(u => u.UserName == userRequest.UserName)
                       .FirstOrDefault();

            if (user == null)
            {
                return(BadRequest("Such user does not exists!"));
            }

            if (user.BestScore == null)
            {
                user.BestScore = 0;
                user.Games     = 0;
                this.data.SaveChanges();
            }

            user.Games++;
            user.BestScore += userRequest.Score;
            this.data.SaveChanges();

            return(Ok(user));
        }
        public IHttpActionResult Play(PlayRequestDataModel request)
        {
            var currentUserId = this.userInfoProvider.GetUserId();

            if (request == null || !this.ModelState.IsValid)
            {
                return(this.BadRequest(this.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 = this.resultValidator.GetResult(game.Board);

            this.ChangeGameState(gameResult, game);

            return(this.Ok());
        }
Exemplo n.º 3
0
        public IHttpActionResult Play(PlayRequestDataModel request)
        {
            var currentUserId = this.User.Identity.GetUserId();

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

            var gameIdAsGuid = new Guid(request.GameId);

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

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

            if(game.State == GameState.Draw ||
                game.State == GameState.FirstPlayerWon ||
                game.State == GameState.SecondPlayerWon)
            {
                return BadRequest("The game has ended!");
            }

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

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

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

            var positionIndex = (request.Row - 1) * 3 + request.Col - 1;
            if(game.Board[positionIndex] != '-')
            {
                return this.BadRequest("Invalid position!");
            }

            var gameBoardAsStringBuilder = new StringBuilder(game.Board);
            gameBoardAsStringBuilder[positionIndex] =
                game.State == GameState.TurnO ? 'O' : 'X';
            game.Board = gameBoardAsStringBuilder.ToString();

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

            this.data.SaveChanges();

            var gameResult = resultValidator.GetResult(game.Board);
            switch (gameResult)
            {
                case GameResult.NotFinished:
                    break;
                case GameResult.WonByO:
                    game.State = GameState.SecondPlayerWon;
                    this.data.SaveChanges();
                    break;
                case GameResult.WonByX:
                    game.State = GameState.FirstPlayerWon;
                    this.data.SaveChanges();
                    break;
                case GameResult.Draw:
                    game.State = GameState.Draw;
                    this.data.SaveChanges();
                    break;
                default:
                    break;
            }

            if(game.State == GameState.Draw)
            {
                return this.Ok("Draw!");
            }

            if (game.State == GameState.FirstPlayerWon)
            {
                return this.Ok("First player won!");
            }
            if (game.State == GameState.SecondPlayerWon)
            {
                return this.Ok("Second player won!");
            }

            return this.Ok();
        }
Exemplo n.º 4
0
        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 firstUser  = data.Users.Find(game.FirstPlayerId);
            var secondUser = data.Users.Find(game.SecondPlayerId);

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

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

            case GameResult.WonByX:
                game.State = GameState.WonByX;
                this.data.SaveChanges();
                firstUser.GamesWon++;
                secondUser.GamesLose++;
                this.data.SaveChanges();
                break;

            case GameResult.WonByO:
                game.State = GameState.WonByO;

                this.data.SaveChanges();
                firstUser.GamesLose++;
                secondUser.GamesWon++;
                this.data.SaveChanges();
                break;

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

                firstUser.GamesDraw++;
                secondUser.GamesDraw++;
                this.data.SaveChanges();
                break;

            default:
                break;
            }

            return(this.Ok());
        }
Exemplo n.º 5
0
        public IHttpActionResult Play([FromUri] PlayRequestDataModel request)
        {
            var userId = User.Identity.GetUserId();

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

            var gameIdAsGuid = new Guid(request.GameId);
            var game         =
                this.data.Games.All()
                .FirstOrDefault(
                    x => x.Id == gameIdAsGuid && (x.FirstPlayerId == userId || x.SecondPlayerId == userId));

            if (game == null)
            {
                return(this.NotFound());
            }

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

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

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

            if (game.Board[positionIndex] != '-')
            {
                return(this.BadRequest("This position is already taken. Please choose a different one."));
            }

            var board = new StringBuilder(game.Board);

            board[positionIndex] = game.State == GameState.TurnX ? 'X' : 'O';
            var boardAsString = board.ToString();

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

            var gameResult = this.CheckGameResult(game.Board);
            var user       = this.data.Users.All().First(u => u.Id == userId);

            switch (gameResult)
            {
            case GameResult.XWins:
                game.State   = GameState.GameWonByX;
                user.Scores += 100;
                break;

            case GameResult.OWins:
                game.State   = GameState.GameWonByO;
                user         = this.data.Users.All().First(u => u.Id == userId);
                user.Scores += 100;
                break;

            case GameResult.Draw:
                game.State = GameState.GameDraw;
                break;
            }

            this.data.SaveChanges();

            var gameDataModel =
                this.data.Games.All()
                .Where(x => x.Id == gameIdAsGuid && (x.FirstPlayerId == userId || x.SecondPlayerId == userId))
                .Project()
                .To <GameInfoDataModel>()
                .FirstOrDefault();

            return(this.Ok(gameDataModel));
        }
Exemplo n.º 6
0
        public IHttpActionResult Play(PlayRequestDataModel playRequest)
        {
            var currentUserId = this.userIdProvider.GetUserId();

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

            var idAsGuid = new Guid(playRequest.GameId);
            var game     = this.data.Games.Find(idAsGuid);

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

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

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

            if ((game.State == GameState.TurnFirstPlayerX && game.FirstPlayerId != currentUserId) ||
                (game.State == GameState.TurnSecondPlayerO && game.SecondPlayerId != currentUserId))
            {
                return(this.BadRequest("It is not your turn!"));
            }

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

            if (game.Board[positionIndex] != '-')
            {
                return(this.BadRequest("This field is not free!"));
            }

            var boardAsStringBuilder = new StringBuilder(game.Board);

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

            game.State = game.State == GameState.TurnFirstPlayerX
                             ? GameState.TurnSecondPlayerO
                             : GameState.TurnFirstPlayerX;

            this.data.SaveChanges();

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

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

            case GameResult.WonByFirstPlayerX:
            {
                game.State = GameState.WonByFirstPlayerX;
                this.data.SaveChanges();
                break;
            }

            case GameResult.WonBySecondPlayerO:
            {
                game.State = GameState.WonBySecondPlayerO;
                this.data.SaveChanges();
                break;
            }

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

            default:
            {
                throw new ArgumentOutOfRangeException();
            }
            }

            return(this.Ok());
        }
Exemplo n.º 7
0
        public IHttpActionResult Play(PlayRequestDataModel request)
        {
            var currentUserId = this.User.Identity.GetUserId();

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

            var idAsGuid = new Guid(request.GameId);

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

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

            if (game.FirstPlayerId != currentUserId &&
                game.SecondPlayerId != currentUserId)
            {
                return this.BadRequest("You are not part of this game");

            }

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

            if ((game.State == GameState.TurnX && game.FirstPlayerId != currentUserId) ||
                (game.State == GameState.TurnY && game.SecondPlayerId != currentUserId))
            {
                return this.BadRequest("Its not your turn to play!");
            }

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

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

            var sbBoard = new StringBuilder(game.Board);
            sbBoard[positionIndex] = game.State == GameState.TurnX ? 'X' : 'O';
            game.Board = sbBoard.ToString();
            game.State = game.State == GameState.TurnX ? GameState.TurnY : GameState.TurnX;

            this.data.SaveChanges();

            var gameResult = validator.GetResult(game.Board);
            switch (gameResult)
            {
                case GameResult.NotFinished:

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

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

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

            var gameId = request.GameId;

            var game = this.Data.Games.SearchFor(g => g.Id == gameId).FirstOrDefault();

            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.FirstPlayerTurn &&
                game.State != GameState.SecondPlayerTurn)
            {
                return(this.BadRequest("Invalid game state!"));
            }

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

            // Update games state and adding new guess number
            var guessNumber = request.GuessNumber;

            var newGuessNumber = new GuessNumber
            {
                Number   = guessNumber,
                GameId   = gameId,
                PlayerId = currentUserId
            };

            this.Data.GuessNumbers.Add(newGuessNumber);

            game.State = game.State == GameState.FirstPlayerTurn ?
                         GameState.SecondPlayerTurn : GameState.FirstPlayerTurn;

            this.Data.SaveChanges();
            var guess = new Guess
            {
                GuessingUserId = currentUserId,
                GuessNumber    = guessNumber.ToString()
            };
            var guessResult = this.gameValidator.GetResult(guess, Data);

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

            case GameResult.WonByFirstPlayer:
                game.State   = GameState.WonByFirstPlayer;
                game.GameEnd = DateTime.Now;
                this.Data.SaveChanges();
                break;

            case GameResult.WonBySecondPlayer:
                game.State   = GameState.WonBySecondPlayer;
                game.GameEnd = DateTime.Now;
                this.Data.SaveChanges();
                break;

            default:
                break;
            }

            return(this.Ok(guessResult));
        }
Exemplo n.º 9
0
        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)
            {
                var message = string.Format("The game is not currently playing! Game state is '{0}'", game.State);
                return(this.BadRequest(message));
            }

            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;

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

            switch (gameResult)
            {
            case GameResult.WonByX:
                game.State = GameState.WonByX;
                game.FirstPlayer.Wins++;
                game.SecondPlayer.Losses++;
                break;

            case GameResult.WonByO:
                game.State = GameState.WonByO;
                game.SecondPlayer.Wins++;
                game.FirstPlayer.Losses++;
                break;

            case GameResult.Draw:
                game.State = GameState.Draw;
                break;

            default:
                break;
            }

            this.data.SaveChanges();

            return(this.Ok(new GameInfoDataModel(game)));
        }