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))); }
private bool IsAllowedSpot(Spot spot) { return(spot.Type == ColliderType.Empty || spot.Type == ColliderType.Floor || spot.Type == ColliderType.Collectable); }
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); }