public static void TryShot(DbContext database, Game game, int index, ShotAt shotAt, List <GameEventDTO> gameEventDTOList) { if (game == null) { return; } GameEventDTO gameEventDTO = new GameEventDTO(); SetEventTime(game, gameEventDTO); gameEventDTO.GameNumber = game.Id; gameEventDTO.Sequence = game.Sequence; gameEventDTO.Tile = shotAt == ShotAt.aiTile ? game.AITiles[index].Type : game.PlayerTiles[index].Type; gameEventDTO.Index = index; var tiles = shotAt == ShotAt.aiTile ? game.AITiles : game.PlayerTiles; if (gameEventDTO.Tile == TileType.water) { tiles[index].Type = TileType.missed; database.Entry(tiles[index]).State = EntityState.Added; gameEventDTO.Tile = TileType.missed; gameEventDTOList.Add(gameEventDTO); } else if (gameEventDTO.Tile == TileType.ship && !CheckIfDrowned(index, tiles)) { tiles[index].Type = TileType.shot; database.Entry(tiles[index]).State = EntityState.Modified; gameEventDTO.Tile = TileType.shot; gameEventDTOList.Add(gameEventDTO); //If player tile was hit make diagonal tiles unavaible for smarter AI shots if (shotAt == ShotAt.playerTile) { MarkAnavailableDiagonalTiles(database, index, tiles); } } else if (gameEventDTO.Tile == TileType.ship && CheckIfDrowned(index, tiles)) { gameEventDTO.Tile = TileType.drowned; gameEventDTOList.Add(gameEventDTO); //If player tile was hit make diagonal tiles unavaible for smarter AI shots if (shotAt == ShotAt.playerTile) { MarkAnavailableDiagonalTiles(database, index, tiles); } AddOppositeDrownedTiles(database, gameEventDTOList, tiles, index, shotAt, game.Id); } }
public string CheckVictoryOrDefeat(int gameNumber, ShotAt shotAt) { var game = _database.Games.FirstOrDefault(g => g.Id == gameNumber); if (game == null) { return(Newtonsoft.Json.JsonConvert.SerializeObject(false)); } var tiles = shotAt == ShotAt.aiTile ? game.AITiles : game.PlayerTiles; if (tiles.Any(t => t.Value.Type == TileType.ship)) { return(Newtonsoft.Json.JsonConvert.SerializeObject(false)); } game.FinishDate = DateTime.Now; _database.Entry(game).State = EntityState.Modified; _database.SaveChanges(); return(Newtonsoft.Json.JsonConvert.SerializeObject(true)); }
public static void AddOppositeDrownedTiles(DbContext database, List <GameEventDTO> gameEventDTOList, Dictionary <int, Tile> tiles, int index, ShotAt shotAt, int gameNumber) { var indexList = tiles.Select(t => t.Key).ToList(); var oppositeTiles = LocateShipTool.AreOppositeTilesAvailable(indexList, index); tiles[index].Type = TileType.drowned; database.Entry(tiles[index]).State = EntityState.Modified; foreach (var item in oppositeTiles) { //find already shot tile next to drowned tile if (item.Value && tiles.ContainsKey(item.Key) && tiles[item.Key].Type == TileType.shot) { //change shot tile to drowned tile and add to list of events GameEventDTO oppositeGameEventDTO = new GameEventDTO(); oppositeGameEventDTO.IsVisible = false; oppositeGameEventDTO.GameNumber = gameNumber; oppositeGameEventDTO.Index = item.Key; oppositeGameEventDTO.Tile = TileType.drowned; gameEventDTOList.Add(oppositeGameEventDTO); //if there are any water tiles around mark them as missed for smarter AI shots if (shotAt == ShotAt.playerTile) { var tilesToMark = LocateShipTool.AreOppositeTilesAvailable(indexList, item.Key); foreach (var tile in tilesToMark) { if (tile.Value && tiles[tile.Key].Type == TileType.water) { tiles[tile.Key].Type = TileType.missed; database.Entry(tiles[tile.Key]).State = EntityState.Added; } } } AddOppositeDrownedTiles(database, gameEventDTOList, tiles, oppositeGameEventDTO.Index, shotAt, gameNumber); } } //if it is one-tile ship mark water tiles around as missed for smarter AI shots if (!tiles.Any(t => t.Value.Type == TileType.shot && oppositeTiles.Any(o => o.Key == t.Key && o.Value))) { foreach (var tile in oppositeTiles) { if (tile.Value && tiles[tile.Key].Type == TileType.water) { tiles[tile.Key].Type = TileType.missed; database.Entry(tiles[tile.Key]).State = EntityState.Added; } } } }