Labyrinth, Backtracking, verzögerte Anzeige

papabaer1707

Aktives Mitglied
Hallo, ich weiß, dass es schon verschiedene Beiträge hierzu giebt, nur bekomme ich das nicht angepasst - evtl. kann mir da jemand unter die Arme greifen.

Ich möchte per Backtracking den Weg aus einem Labyrinth finden. Das ist im Grunde kein Prblem, nur möchte ich die Suche nachvollziehen können, d. h. die Anzeige soll nicht nur das Ergebnis anzeigen, sondern auch jeden einzelnen Schritt.

Da lese ich ne Menge zu wait(), sleep und Threads ... was brauche ich aber in meinem Problem.

Code:
    private boolean sucheWeg(Point aktPosition) {
        boolean fertig = false;

        // mögliche Wege finden
        ...

        // mögliche Wege abtesten
        while ((!wege.isEmpty()) && (!fertig)) {
            // aktuelle Position rücksetzen
            neuePosition.setX(aktPosition.getX());
            neuePosition.setY(aktPosition.getY());

            // nächste Richtung wählen
            ...

            if ((neuePosition.getX() == zielpunkt.getX()) &&
                    (neuePosition.getY() == zielpunkt.getY())) {
                // Zielpunkt wurde gefunden
                fertig = true;
            } else {
                // von neuer Position aus suchen
                myLabyrinth[aktPosition.getX()][aktPosition.getY()] = besucht;
                panelLabyrinth.repaint();
                sucheWeg(neuePosition);
                ...
            }
        }

        return fertig;
    }
Ich habe einiges rausgekürzt. Nach der Zeile panelLabyrinth.repaint();, in der auf dem Panel gezeichnet wird, sollte er etwas warten. Wie kann ich das realisieren?
 
du musst eine interrupt exception werfen oder catchen. in den meisten fällen kann die ignoriert werden:

Java:
try {
  Thread.sleep(...);
} catch (InterruptedException ignore) {}
 
weil der prozess bzw das thread.sleep den edt einfriert und somit dein gui auch nicht erneuert wird -> den algo in einem eigenen thread schreiben.
 
oje, sieht mächtig aus ...

d.h. um anzufangen muss ich meine ganze Klasse erweitern

Code:
public class LabyrinthGUI extends JFrame implements Runnable {

Die Methode run() umschließt meien Methode sucheWeg()?
 
probiers mal so:

Java:
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				// Aufruf von sucheWeg
			}		
		});
		t.start();
		try {
			t.join();
		} catch (InterruptedException ignore) {}

edit: musst du nicht unbedingt. du kannst es auch einfach in einer inner-class implementieren (siehe beispiel)

edit2: 😳 join nicht wait
 
Zuletzt bearbeitet:
die methode muss ganz einfach in dem thread gestartet werden. ob das jetzt die ganze methode ist oder nur der aufruf ist egal.
 
habs jetzt so probiert, dass ich den ersten Aufruf der gesamten Suche in den Thread gesetzt habe:

Code:
    public void btnStart_ActionPerformed(ActionEvent evt) {
        Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (sucheWeg(startpunkt)) {
                            JOptionPane.showMessageDialog(null,
                                "Ziel gefunden", "Suche im Labyrinth",
                                JOptionPane.OK_CANCEL_OPTION);
                        } else {
                            JOptionPane.showMessageDialog(null,
                                "Ziel nicht gefunden", "Suche im Labyrinth",
                                JOptionPane.OK_CANCEL_OPTION);
                        }
                    }
                });
        t.start();

        try {
            t.join();
        } catch (InterruptedException ignore) {
        }
    }
Jetzt stürzt es irgendwie ab ... kann das daran liegen, dass ich irgendwo noch start, stop, sleep oder so setzen muss?
 
ICH HABS:

Ich muss den Thread für die gesamte Klasse global definieren:
Code:
    Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    if (sucheWeg(startpunkt)) {
                        JOptionPane.showMessageDialog(null, "Ziel gefunden",
                            "Suche im Labyrinth", JOptionPane.OK_CANCEL_OPTION);
                    } else {
                        JOptionPane.showMessageDialog(null,
                            "Ziel nicht gefunden", "Suche im Labyrinth",
                            JOptionPane.OK_CANCEL_OPTION);
                    }
                }
            });

Dann kann ich ihn beim Klick auf den Button starten:
Code:
    public void btnStart_ActionPerformed(ActionEvent evt) {
        t.start();
    }

... und nach dem Zeichnen jeweils kurz schlafen legen:
Code:
                panelLabyrinth.repaint();

                try {
                    t.sleep(100);
                } catch (InterruptedException ignore) {
                }

Verstehe ich das richtig, dass der gesamte Programmaublauf, der innerhalb des Threads stattfindet, durch diesen beeinflusst wird?
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben