private List <Location> GetWalkableAdjacentSquares(int x, int y, string[] map, Car car) { var proposedLocations = new List <Location>() { new Location { X = x, Y = y - 1 }, new Location { X = x, Y = y + 1 }, new Location { X = x - 1, Y = y }, new Location { X = x + 1, Y = y }, }; if (proposedLocations[0].Y == -1) { proposedLocations[0] = new Location { X = x, Y = 59 } } ; if (proposedLocations[1].Y == 60) { proposedLocations[1] = new Location { X = x, Y = 0 } } ; if (proposedLocations[2].X == -1) { proposedLocations[2] = new Location { X = 59, Y = y } } ; if (proposedLocations[3].X == 60) { proposedLocations[3] = new Location { X = 0, Y = y } } ; Pos jarda = new Pos(0, 0); Pos jarda2 = new Pos(0, 0); Pos korforgalom = new Pos(0, 0); //switch (car.Direction) //{ // case "UP": // jarda.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY; // jarda2.PosX = car.Position.PosX + 1; jarda2.PosY = car.Position.PosY + 1; // korforgalom.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY; // break; // case "DOWN": // jarda.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY; // jarda2.PosX = car.Position.PosX - 1; jarda2.PosY = car.Position.PosY - 1; // korforgalom.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY; // break; // case "LEFT": // jarda.PosX = car.Position.PosX; jarda.PosY = car.Position.PosY - 1; // jarda2.PosX = car.Position.PosX + 1; jarda2.PosY = car.Position.PosY - 1; // korforgalom.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY; // break; // case "RIGHT": // jarda.PosX = car.Position.PosX; jarda.PosY = car.Position.PosY + 1; // jarda2.PosX = car.Position.PosX - 1; jarda2.PosY = car.Position.PosY + 1; // korforgalom.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY; // break; //} //foreach (Location l in proposedLocations) //{ // if () //} return(proposedLocations.Where(l => map[l.Y][l.X] == 'S' || map[l.Y][l.X] == 'Z').ToList()); }
public Routing FindRoute(int StartX, int StartY, int TargetX, int TargetY, Car car) { this.myCar = car; Location current = null; var start = new Location { X = StartX, Y = StartY }; var target = new Location { X = TargetX, Y = TargetY }; var openList = new List <Location>(); var closedList = new List <Location>(); int currentDistanceFromStart = 0; route = new List <Location>(); target = CheckRoad(target.X, target.Y, map); openList.Add(start); while (openList.Count > 0) { var lowest = openList.Min(l => l.distanceScore); current = openList.First(l => l.distanceScore == lowest); closedList.Add(current); openList.Remove(current); if (closedList.FirstOrDefault(l => l.X == target.X && l.Y == target.Y) != null) { break; } var adjacentSquares = GetWalkableAdjacentSquares(current.X, current.Y, map, car); currentDistanceFromStart++; foreach (var adjacentSquare in adjacentSquares) { if (closedList.FirstOrDefault(l => l.X == adjacentSquare.X && l.Y == adjacentSquare.Y) != null) { continue; } if (openList.FirstOrDefault(l => l.X == adjacentSquare.X && l.Y == adjacentSquare.Y) == null) { adjacentSquare.distanceFromStart = currentDistanceFromStart; adjacentSquare.distanceFromTarget = ComputeEndDistance(adjacentSquare.X, adjacentSquare.Y, target.X, target.Y); adjacentSquare.distanceScore = adjacentSquare.distanceFromStart + adjacentSquare.distanceFromTarget; adjacentSquare.previousLocation = current; openList.Insert(0, adjacentSquare); } else { if (currentDistanceFromStart + adjacentSquare.distanceFromTarget > adjacentSquare.distanceScore) { adjacentSquare.distanceFromStart = currentDistanceFromStart; adjacentSquare.distanceScore = adjacentSquare.distanceFromStart + adjacentSquare.distanceFromTarget; adjacentSquare.previousLocation = current; } } } } while (current != null) { this.route.Add(new Location { X = current.X, Y = current.Y }); current = current.previousLocation; } this.route.Reverse(); return(this); }