Beispiel #1
0
 private float Heuristic(Spot neighbor, Spot stop)
 {
     return((float)Math.Sqrt(Math.Pow(stop.Position.X - neighbor.Position.X, 2) + Math.Pow(stop.Position.Y - neighbor.Position.Y, 2)));
 }
Beispiel #2
0
 private bool IsAllowedSpot(Spot spot)
 {
     return(spot.Type == ColliderType.Empty || spot.Type == ColliderType.Floor ||
            spot.Type == ColliderType.Collectable);
 }
Beispiel #3
0
        private List <Spot> FindPath(Spot start, Spot stop)
        {
            var moves = new List <Spot>();

            closedSet = new List <Spot>();
            openSet   = new List <Spot>()
            {
                start
            };
            while (openSet.Any())
            {
                var winner = 0;
                for (int i = 0; i < openSet.Count; i++)
                {
                    if (openSet[i].f < openSet[winner].f)
                    {
                        winner = i;
                    }
                }
                var current = openSet[winner];

                if (current.Position == stop.Position)
                {
                    var tmpCurrent = current;
                    moves.Add(tmpCurrent);

                    while (tmpCurrent.previous != null)
                    {
                        moves.Add(tmpCurrent.previous);
                        tmpCurrent = tmpCurrent.previous;
                    }
                    break;
                }
                openSet.Remove(current);
                closedSet.Add(current);
                var neighbors = current.GetNeighbors(GameMap);
                for (int i = 0; i < neighbors.Count; i++)
                {
                    var neighbor = neighbors[i];

                    if (!closedSet.Contains(neighbor))
                    {
                        var tempG = current.g + 1;

                        if (openSet.Contains(neighbor))
                        {
                            if (tempG < neighbor.g)
                            {
                                neighbor.g = tempG;
                            }
                        }
                        else
                        {
                            neighbor.g = tempG;
                            openSet.Add(neighbor);
                        }
                        neighbor.h        = Heuristic(neighbor, stop);
                        neighbor.f        = neighbor.g + neighbor.h;
                        neighbor.previous = current;
                    }
                }
            }
            return(moves);
        }