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