public async Task <ApplyTurnResponse> ApplyTurnAsync(ApplyTurnRequest request) { var response = ServiceMessageFactory <ApplyTurnResponse> .CreateFrom(request); var playerRequest = ServiceMessageFactory <GetPlayerRequest> .CreateFrom(request); playerRequest.PlayerId = request.PlayerId; var playerResponse = await playerAccess.GetPlayerAsync(playerRequest); var playTurnRequest = ServiceMessageFactory <PlayTurnRequest> .CreateFrom(request); playTurnRequest.GameSessionId = request.GameSessionId; playTurnRequest.PlayerId = request.PlayerId; playTurnRequest.Address = request.Address; playTurnRequest.IsAutoPlay = playerResponse.Player.IsMachine; var playTurnResponse = await gamePlayEngine.PlayTurnAsync(playTurnRequest); if (playTurnResponse.HasErrors) { logger.LogError($"{InstanceId}: {playTurnResponse.Errors}"); } return(response); }
public async Task <FindWinnerResponse> FindWinnerAsync(FindWinnerRequest request) { var response = ServiceMessageFactory <FindWinnerResponse> .CreateFrom(request); var tilesRequest = ServiceMessageFactory <FindTilesRequest> .CreateFrom(request); tilesRequest.Filter = tile => tile.GameSessionId == request.GameSessionId; var tilesResponse = await tileAccess.FindTilesAsync(tilesRequest); var dictionary = tilesResponse.Tiles.ToDictionary(tile => tile.Address, tile => tile.Convert()); var playerId = Guid.Empty; // Check all possible vectors // A Col if (IsWinningVector(dictionary["A1"], dictionary["A2"], dictionary["A3"])) { playerId = dictionary["A1"].PlayerId; } // B Col else if (IsWinningVector(dictionary["B1"], dictionary["B2"], dictionary["B3"])) { playerId = dictionary["B1"].PlayerId; } // C Col else if (IsWinningVector(dictionary["C1"], dictionary["C2"], dictionary["C3"])) { playerId = dictionary["C1"].PlayerId; } // 1 Row else if (IsWinningVector(dictionary["A1"], dictionary["A2"], dictionary["A3"])) { playerId = dictionary["A1"].PlayerId; } // 2 Row else if (IsWinningVector(dictionary["B1"], dictionary["B2"], dictionary["B3"])) { playerId = dictionary["B1"].PlayerId; } // 3 Row else if (IsWinningVector(dictionary["C1"], dictionary["C2"], dictionary["C3"])) { playerId = dictionary["C1"].PlayerId; } // Right Diagonal else if (IsWinningVector(dictionary["A1"], dictionary["B2"], dictionary["C3"])) { playerId = dictionary["A1"].PlayerId; } // Left Diagonal else if (IsWinningVector(dictionary["A3"], dictionary["B2"], dictionary["C1"])) { playerId = dictionary["A3"].PlayerId; } var playerRequest = ServiceMessageFactory <GetPlayerRequest> .CreateFrom(request); playerRequest.PlayerId = playerId; var playerResponse = await playerAccess.GetPlayerAsync(playerRequest); response.Player = playerResponse.Player.Convert(); return(response); }
public async Task <GetGameBoardResponse> GetBoardAsync(GetGameBoardRequest request) { var response = ServiceMessageFactory <GetGameBoardResponse> .CreateFrom(request); var gameSessionRequest = ServiceMessageFactory <GetGameSessionRequest> .CreateFrom(request); gameSessionRequest.GameSessionId = request.GameSessionId; var gameSessionResponse = await gameSessionAccess.GetGameSessionAsync(gameSessionRequest); if (gameSessionResponse.HasErrors) { response.Errors = "Unable to get the selected game board. Session error."; return(response); } var gameSession = gameSessionResponse.GameSession; // Board for Tic-Tac-Toe var players = new List <Player>(); foreach (var playerId in gameSession.PlayerIds) { var playerRequest = ServiceMessageFactory <GetPlayerRequest> .CreateFrom(request); playerRequest.PlayerId = playerId; var playerResponse = await playerAccess.GetPlayerAsync(playerRequest); players.Add(playerResponse.Player); } response.GameBoard = new DataTable(); response.GameBoard.Columns.Add(new DataColumn(" ")); response.GameBoard.Columns.Add(new DataColumn("A")); response.GameBoard.Columns.Add(new DataColumn("B")); response.GameBoard.Columns.Add(new DataColumn("C")); var tileRequest = ServiceMessageFactory <FindTilesRequest> .CreateFrom(request); tileRequest.Filter = tile => tile.GameSessionId == request.GameSessionId; var tileResponse = await tileAccess.FindTilesAsync(tileRequest); var tiles = tileResponse.Tiles; if (tileResponse.HasErrors) { return(response); } var dataRow = response.GameBoard.NewRow(); dataRow[0] = 1; dataRow[1] = (tiles[0].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[0].PlayerId).GamePiece); dataRow[2] = (tiles[3].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[3].PlayerId).GamePiece); dataRow[3] = (tiles[6].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[6].PlayerId).GamePiece); response.GameBoard.Rows.Add(dataRow); dataRow = response.GameBoard.NewRow(); dataRow[0] = 2; dataRow[1] = (tiles[1].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[1].PlayerId).GamePiece); dataRow[2] = (tiles[4].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[4].PlayerId).GamePiece); dataRow[3] = (tiles[7].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[7].PlayerId).GamePiece); response.GameBoard.Rows.Add(dataRow); dataRow = response.GameBoard.NewRow(); dataRow[0] = 3; dataRow[1] = (tiles[2].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[2].PlayerId).GamePiece); dataRow[2] = (tiles[5].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[5].PlayerId).GamePiece); dataRow[3] = (tiles[8].PlayerId == Guid.Empty ? " " : players.First(i => i.Id == tiles[8].PlayerId).GamePiece); response.GameBoard.Rows.Add(dataRow); return(response); }