public void DeleteGameAndNotifyMyOpponent(int gameId, string sessionKey) { try{ Game game; User opponent; game = GameServise.GetGameById(gameId); opponent = GameServise.GetAnotherOpponentInGame(gameId, sessionKey); GameServise.DeleteGame(sessionKey, gameId); Clients.All.nothifyAllClientForOpenGames(); if (opponent == null) { return; } GameState gameState = new GameState() { GameId = gameId, Title = game.Title, Opponent = opponent.Nickname, }; if (game.GameStatus == GameStatusType.InProgress) { gameState.Winner = opponent.Nickname; } Clients.Client(opponent.ConnectionId).deletedGame(gameState); } catch (ServerErrorException ex) { Clients.Caller.serverErrorException(ex.Message); } }
public Game MakeGuess(GuessModel guessModel, out GameState gameState) { if(guessModel==null) { throw new ArgumentNullException("GuessModel is null"); } gameState = new GameState(); ValidateSessionKey(guessModel.SessionKey); User user = GetUserBySessionKey(guessModel.SessionKey); Game game = GetGameById(guessModel.GameId); if (game.GameStatus != GameStatusType.InProgress) { throw new ServerErrorException("Game is not in progress", "INV_OP_GAME_STAT"); } ValidateUserInGame(game, user); //check userInTurn if (game.UserInTurn != user.Id) { throw new ServerErrorException("Not your turn", "INV_OP_TURN"); } CheckPosition(guessModel.Position); PlaceMarker(game, user, guessModel.Position); gameState.gameOver= CheckGameOver(game); bool isWinner = false; int[] arrayOfMarkedPositions = game.Guesses.Where(g => g.User.Id == user.Id).Select(p => p.Position).ToArray(); isWinner = CheckWinner(arrayOfMarkedPositions); if (isWinner) { gameState.gameOver = true; game.Winner = user; gameState.Winner = user.Nickname; } if (gameState.gameOver) { game.GameStatus = GameStatusType.Finished; gameState.GameId = (int)game.Id; gameState.Title = game.Title; } else { var otherUser = (game.RedUser == user) ? game.BlueUser : game.RedUser; game.UserInTurn = otherUser.Id; } this.Data.Games.Update(game); this.Data.SaveChanges(); return game; }
public GameState GetGameState(int gameId, string sessionKey) { //TODO: Optimization method ValidateSessionKey(sessionKey); User user = GetUserBySessionKey(sessionKey); Game game = GetGameById(gameId); ValidateUserInGame(game, user); GameState gameState = new GameState(); if (game.RedUser == user) { gameState.Symbol = "O"; } else { gameState.Symbol = "Y"; } gameState.GameId = gameId; gameState.Title = game.Title; gameState.State = game.GameStatus; if (game.Winner != null) { gameState.Winner = game.Winner.Nickname; } gameState.Opponent = GetAnotherOpponentInGame(gameId, sessionKey).Nickname; gameState.O = game.Guesses.Where(g => g.User == game.RedUser).Select(p => p.Position).ToArray(); gameState.X = game.Guesses.Where(g => g.User == game.BlueUser).Select(p => p.Position).ToArray(); return gameState; }
public void LeaveGameAndRestartState(int gameId, string sessionKey) { try{ Game game; User user; User opponent; string gameStatus; user = UserServise.GetUserBySessionKey(sessionKey); game = GameServise.GetGameById(gameId); gameStatus = game.GameStatus; opponent = GameServise.GetAnotherOpponentInGame(gameId, sessionKey); GameServise.RestartGameState(sessionKey, gameId, GameStatusType.Open); GameServise.LeaveGame(gameId, sessionKey); GameState gameState = new GameState() { GameId = gameId, Title = game.Title, Opponent = user.Nickname, }; if (gameStatus == GameStatusType.InProgress) { gameState.Winner = opponent.Nickname; } Clients.Client(opponent.ConnectionId).leftGame(gameState); Clients.All.nothifyAllClientForOpenGames(); } catch (ServerErrorException ex) { Clients.Caller.serverErrorException(ex.Message); } }