Esempio n. 1
0
        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>());
        }