Variable aktualisiert sich nicht in rekursiver Methode

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?
 
Ich hab mir das nicht genau angeschaut, aber in Zeile 55 versuchst du einen Wert dem Methodenparameter "minDistance" zuzuweisen. Ist das gewollt? Oder geht es um this.minDistance (die Instanzvariable, die vom Parameter verdeckt wird)?

Bei "target" ebenfalls...

Es kann hilfreich sein, Parameter final zu machen, damit solche Fehler nicht versehentlich passieren:
Java:
private void search(final Point p, final boolean[][] visited, final Point target, final int minDistance) {
 
Zuletzt bearbeitet:
Wenn es um die Zuweisung in der Meehode search geht, dann ist das Problem vermutlich - so wie bereits geschrieben - dass dem Parameter etwas zugewiesen wird und nicht der Instanzvariable.

Java ist Call by Value, d.h. mit der Zuweisung hat man nur in der Methode etwas verändert.
 

Zurück
Oben