Beispiel #1
0
        public static void SetEventTime(Game game, GameEventDTO gameEventDTO)
        {
            DateTime eventDate = DateTime.Now;
            DateTime startDate = game.Startdate;
            string   time      = GetTimeString(startDate, eventDate);

            gameEventDTO.Time = time;
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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;
                    }
                }
            }
        }