public IEnumerable <Tile> FindPath(Tile startTile, Tile finishTile, IEnumerable <Tile> tiles) { var start = new WeightedTile(startTile); var finish = new WeightedTile(finishTile); var allTiles = tiles.ToList(); start.SetDistance(finish.Position); var activeWeightedTiles = new List <WeightedTile>(); activeWeightedTiles.Add(start); var visitedWeightedTiles = new List <WeightedTile>(); while (activeWeightedTiles.Any()) { var checkTile = activeWeightedTiles.OrderBy(t => t.CostDistance).First(); if (checkTile.Position.Equals(finish.Position)) { var lastTile = checkTile; var path = new List <WeightedTile>(); while (lastTile != null) { path.Add(lastTile); lastTile = lastTile.Parent; } return(path.Select(weightedTile => new Tile(TileType.Floor, weightedTile.Position)).ToList()); } visitedWeightedTiles.Add(checkTile); activeWeightedTiles.Remove(checkTile); var walkableTiles = GetWalkableTiles(checkTile, finish, allTiles); foreach (var walkableTile in walkableTiles) { if (visitedWeightedTiles.Any(t => t.Position.Equals(walkableTile.Position))) { continue; } if (activeWeightedTiles.Any(t => t.Position.Equals(walkableTile.Position))) { var existingTile = activeWeightedTiles.First(t => t.Position.Equals(walkableTile.Position)); if (existingTile.CostDistance > checkTile.CostDistance) { activeWeightedTiles.Remove(existingTile); activeWeightedTiles.Add(walkableTile); } } else { activeWeightedTiles.Add(walkableTile); } } } Console.Out.WriteLine($"[!] Couldn't find a path!"); return(new List <Tile>()); }