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?
 

nrg

Top Contributor
du musst eine interrupt exception werfen oder catchen. in den meisten fällen kann die ignoriert werden:

Java:
try {
  Thread.sleep(...);
} catch (InterruptedException ignore) {}
 

nrg

Top Contributor
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.
 

papabaer1707

Aktives Mitglied
Hm, genau das ist mein Problem ... heißt eigener Thread eigene Methode oder Klasse?

Die Methode sucheWeg() enthält dann den Thread oder umgekehrt?
 

papabaer1707

Aktives Mitglied
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()?
 

nrg

Top Contributor
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: :oops: join nicht wait
 
Zuletzt bearbeitet:

nrg

Top Contributor
die methode muss ganz einfach in dem thread gestartet werden. ob das jetzt die ganze methode ist oder nur der aufruf ist egal.
 

papabaer1707

Aktives Mitglied
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?
 

papabaer1707

Aktives Mitglied
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Backtracking - Labyrinth/Irrgarten Java Basics - Anfänger-Themen 14
Fats Waller Wofür stehen diese Konstanten im Java Labyrinth ? Java Basics - Anfänger-Themen 5
MichelNeedhelp Brauche zu diesem Labyrinth ein Skript? Der Hamster soll im Urzeigersinn das ganze Labyrinth abgehen und wieder an seinem Ursprungsplatz sein. Java Basics - Anfänger-Themen 40
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
D Frage zum Labyrinth Java Basics - Anfänger-Themen 3
J Erste Schritte JavaKara Labyrinth Java Basics - Anfänger-Themen 17
S Labyrinth erstellen Java Basics - Anfänger-Themen 4
B Frage zu Labyrinth Java Basics - Anfänger-Themen 7
H Labyrinth kürzester Weg Java Basics - Anfänger-Themen 8
J Bewegen durch das Labyrinth Java Basics - Anfänger-Themen 7
Max246Sch 3D Box Filler BAcktracking Java Basics - Anfänger-Themen 1
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
districon Backtracking Java Basics - Anfänger-Themen 2
districon Backtracking Java Basics - Anfänger-Themen 14
districon Dynamisch Programmierung/Backtracking/Memoization Java Basics - Anfänger-Themen 3
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
O Backtracking Java Basics - Anfänger-Themen 5
C Rekursives Backtracking beim Spiel Peg Java Basics - Anfänger-Themen 22
A Backtracking Java Basics - Anfänger-Themen 56
R Backtracking Java Basics - Anfänger-Themen 1
V Feld sortieren mit Backtracking Java Basics - Anfänger-Themen 1
A Sudoku mit Backtracking lösen Java Basics - Anfänger-Themen 3
L Sudoku Backtracking Pseudocode Java Basics - Anfänger-Themen 3
I Backtracking Schach Java Basics - Anfänger-Themen 5
L Magisches Quadrat und Backtracking Java Basics - Anfänger-Themen 19
M Backtracking/Solve Methode Java Basics - Anfänger-Themen 7
D Sudoku lösen mit Backtracking Java Basics - Anfänger-Themen 20
E backtracking und Induktionsprinzip Java Basics - Anfänger-Themen 2
D Backtracking Waage Problem Java Basics - Anfänger-Themen 23
N Backtracking Solohalma Java Basics - Anfänger-Themen 2
W Backtracking und Frustration Java Basics - Anfänger-Themen 6
X Sudoku Backtracking Java Basics - Anfänger-Themen 6
J Solitaire via Backtracking Java Basics - Anfänger-Themen 7
A Backtracking - kennt Java keine Rücksprungmarken? Java Basics - Anfänger-Themen 15
G Backtracking mit globaler Variable Java Basics - Anfänger-Themen 5
M BackTracking Java Basics - Anfänger-Themen 22
J Backtracking Algorithmus Java Basics - Anfänger-Themen 16
N Verzögerte Berechnung "Lazy" Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben