public List<Tile> AvailableNeighbours(Tile center) { var listToReturn = new List<Tile>(); var neighbours = center.GetNeighbours(); foreach (var tile in neighbours) { if (tile.Available) { listToReturn.Add(tile); } } return listToReturn; }
public Dictionary<TileMetrics.HexCoordinate, Tile> TilesInRange(Tile center, double range) { ClearMarkTilesInRange(); var visited = new Dictionary<TileMetrics.HexCoordinate, bool>(); visited.Add(center.Coordinate, center); var queueTiles = new Queue<Tile>(); var neighbours = center.GetNeighbours(); foreach (var tile in neighbours) { if (tile.Available) { if (center.Drag / 2 + tile.Drag / 2 <= range) { tilesInRange_.Add(tile.Coordinate, tile); tile.DistanceFromStart = center.Drag / 2 + tile.Drag / 2; queueTiles.Enqueue(tile); } } else { if (tile.Champion && !tilesWithEnemies_.ContainsKey(tile.Coordinate)) { tilesWithEnemies_.Add(tile.Coordinate, tile); } } } while (queueTiles.Count != 0) { var currentTile = queueTiles.Dequeue(); neighbours = currentTile.GetNeighbours(); foreach (var tile in neighbours) { if (tile.Available) { if (tilesInRange_.ContainsKey(tile.Coordinate)) { if (currentTile.DistanceFromStart + currentTile.Drag / 2 + tile.Drag / 2 < tile.DistanceFromStart) { tile.DistanceFromStart = currentTile.DistanceFromStart + currentTile.Drag / 2 + tile.Drag / 2; queueTiles.Enqueue(tile); } } else if (currentTile.DistanceFromStart + currentTile.Drag / 2 + tile.Drag / 2 <= range) { tilesInRange_.Add(tile.Coordinate, tile); tile.DistanceFromStart = currentTile.DistanceFromStart + currentTile.Drag / 2 + tile.Drag / 2; queueTiles.Enqueue(tile); } } else { if (tile.Champion && !tilesWithEnemies_.ContainsKey(tile.Coordinate)) { tilesWithEnemies_.Add(tile.Coordinate, tile); } } } } tilesInRange_.Remove(center.Coordinate); tilesWithEnemies_.Remove(center.Coordinate); markTilesInRange(); return tilesInRange_; }