Java:
public class Path {
private final Terrain terrain;
private final int width;
private final int height;
private Point target;
private int minDistance;
public Path(Terrain terrain) {
this.terrain = terrain;
this.width = terrain.getWidth();// Anzahl der Spalten in der Karte
this.height = terrain.getHeight();// Anzahl der Zeilen in der Karte
this.target = null;
this.minDistance = MAX_VALUE;
}
// Zwei-dimensionales Array mit der Karte
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // mögliche Bewegungen in der Karte (Rechts, Runter, Links, Hoch)
Point start; // Ausgangspunkt
List<Point> targets = new ArrayList<>(); // Liste mit den Zielen
// Point-Klasse, um einen Punkt auf der Karte zu repräsentieren
// Findet den kürzesten Pfad zu einem Ziel
public Point findShortestPath() {
// Finde Ausgangspunkt und Ziele
for (int y = 0; y < this.height; y++) {
for (int x = 0; x < this.width; x++) {
if (terrain.getCoordinates()[y][x] == 'R') {
start = new Point(x, y, 0);
}
if (terrain.getCoordinates()[y][x] == 'x' || terrain.getCoordinates()[y][x] == 'X') {
targets.add(new Point(x, y, 0));
}
}
}
// Führe Breitensuche aus
boolean[][] visited = new boolean[this.height][this.width]; // Array zum Speichern, ob ein Punkt bereits besucht wurde
search(start, visited, target, minDistance);
return target;
}
// Führt die Breitensuche aus
private void search(Point p, boolean[][] visited, Point target, int minDistance) {
// Markiere Punkt als besucht
visited[p.y][p.x] = true; //es kann sein, dass hier x und y vertauscht werden müssen
// Prüfe, ob der Punkt ein Ziel ist
if (isTarget(p)) {
// Aktualisiere das Ziel und die kürzeste Entfernung, wenn nötig
if (p.distance < minDistance) {
System.out.println("Aktualisierung");
target = p;
minDistance = p.distance;
}
}
// Füge alle unbesuchten Nachbarn dem Suchbaum hinzu
for (int[] direction : directions) {
int x = p.x + direction[0];
int y = p.y + direction[1];
//wenn ein Punkt nicht: außerhalb des Bereichs liegt, ein Hindernis ist oder schon besucht wurde, führe Suche durch
if (x >= 0 && x < this.height && y >= 0 && y < this.width && !terrain.getObstacles().contains(terrain.getCoordinates()[y][x]) && !visited[y][x]) {
search(new Point(x, y, p.distance + 1), visited, target, minDistance);
}
}
}
// Prüft, ob ein Punkt ein Ziel ist
private boolean isTarget(Point p) {
return targets.contains(p);
}
}
Ich kann einfach nicht herausfinden, warum sich der Wert von target und minDistance nicht aktualisiert. Weiß jemand, wo der Fehler liegen kann?