public string StartGame(List <int> shipArray)
        {
            var game = _database.Games.Add(new Game());

            List <int> aiShips = LocateShipTool.GetRandomShips();

            List <Tile> tiles = new List <Tile>();

            //add player ship tiles to database
            foreach (var index in shipArray)
            {
                tiles.Add(new Tile
                {
                    Number = index,
                    Type   = TileType.ship,
                    GameId = game.Id,
                    Owner  = ShotAt.playerTile
                });
            }

            //add AI ship tiles to database
            foreach (var index in aiShips)
            {
                tiles.Add(new Tile
                {
                    Number = index,
                    Type   = TileType.ship,
                    GameId = game.Id,
                    Owner  = ShotAt.aiTile
                });
            }
            _database.Tiles.AddRange(tiles);
            _database.SaveChanges();
            return(Newtonsoft.Json.JsonConvert.SerializeObject(game.Id));
        }
        public string AIShot(int gameNumber)
        {
            List <GameEventDTO> gameEventDTOList = new List <GameEventDTO>();
            var game = _database.Games.FirstOrDefault(g => g.Id == gameNumber);

            if (game != null)
            {
                var tiles = game.PlayerTiles.Select(t => t.Key).ToList();

                Random     random         = new Random(Guid.NewGuid().GetHashCode());
                List <int> availableTiles = new List <int>();

                do
                {
                    availableTiles = game.PlayerTiles
                                     .Where(t => t.Value.Type == TileType.water || t.Value.Type == TileType.ship)
                                     .Select(t => t.Key)
                                     .ToList();

                    if (availableTiles.Count > 0)
                    {
                        //If there are shot player tiles make only opposite tiles avaible
                        if (game.PlayerTiles.Any(t => t.Value.Type == TileType.shot))
                        {
                            foreach (var playerTile in game.PlayerTiles.Where(p => p.Value.Type == TileType.shot))
                            {
                                var index = playerTile.Key;
                                availableTiles = new List <int>();

                                var avaibleTilesDictionary = LocateShipTool.AreOppositeTilesAvailable(tiles, index);
                                foreach (var availableTile in avaibleTilesDictionary)
                                {
                                    if (availableTile.Value && (game.PlayerTiles[availableTile.Key].Type == TileType.ship || game.PlayerTiles[availableTile.Key].Type == TileType.water))
                                    {
                                        availableTiles.Add(availableTile.Key);
                                    }
                                }
                                if (availableTiles.Count > 0)
                                {
                                    break;
                                }
                            }
                        }
                        var randomIndex = random.Next(0, availableTiles.Count - 1);
                        ShootTool.TryShot(_database, game, availableTiles[randomIndex], ShotAt.playerTile, gameEventDTOList);
                    }
                } while (gameEventDTOList[gameEventDTOList.Count - 1].Tile != TileType.missed && game.PlayerTiles.Any(t => t.Value.Type == TileType.ship));

                _database.SaveChanges();
            }
            return(Newtonsoft.Json.JsonConvert.SerializeObject(gameEventDTOList));
        }
        public string GetRandomShips()
        {
            var drawnIndexList = LocateShipTool.GetRandomShips();

            return(Newtonsoft.Json.JsonConvert.SerializeObject(drawnIndexList));
        }