| Autor |
Beitrag |
ShuyiN
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 02.01.10 20:05
Hallo
In der Schule arbeiten wir an einem Programm, dass rekursiv alle Wege aus einem Labyrinth findet. Als Zusatzleistung habe ich eine 3D-Ansicht aus der Ego-Perspektive eingebaut, in der man sieht wie das Programm durchs Labyrinth läuft. Damit mein Lehrer das besser nachgucken könnte, wäre es gut einen Button zu haben, der das gesamte Programm für unbestimmte Zeit an irgendeiner Stelle pausieren und dann bei erneutem drücken weiterlaufen lassen kann. Mir fehlt eine Idee für eine möglichst einfache Umsetzung.
Gruß ShuyiN
Zuletzt bearbeitet von ShuyiN am Fr 08.01.10 03:19, insgesamt 1-mal bearbeitet
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 02.01.10 20:10
wie gehst du denn jetzt vor? Ich würde das ja im Prinzip so machen, dass ich ERST den gesamten Weg berechne, sei es backtracking oder anderes, und DANN über einen Algorithmus und OpenGL (was weiß ich, was du nutzt) das ganze dreidimensional nachbaue und abfahre. Dann sollte es reichen, in der Renderschleife, bzw. im Timer, der das zeichnet (weniger gute Lösung), einfach zu pausieren, sei es über eine Boolesche Variable oder eben über die "Enabled" Eigenschaft des Timers.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 02.01.10 20:11
Richtige Lösung:
Den Status jeweils speichern und dann jeweils fortsetzen. // EDIT: Oder siehe FinnO
Notlösung:
Eine boolsche Variable / Feld benutzen und mittels Application.ProcessMessages und einer Schleife darauf warten, dass diese wieder umgeschaltet wird. Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private FRunning: Boolean;
...
FRunning := False; while not FRunning do begin Sleep(10); Application.ProcessMessages; end; |
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 02.01.10 20:13
wobei die Notlösung RICHTIG dreckig ist.
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Sa 02.01.10 20:13
Ich würde nicht das Zeichnen, sondern die "Bewegung" des Programms durch das Labyrinth pausieren. Sonst bekommst du unschöne Effekte, wenn du das Fenster bewegst bzw. ein anderes darüberziehst, da deine aktuelle Ansicht nicht neugezeichnet wird.
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 02.01.10 20:17
was pausiert wird, sei dann dem geneigten Leser selbst überlassen. Man könnte auch aus langeweile einfach einen Screenshot vom Formular machen und vor das DC ballern, wo wir gerade bei Notlösungen sind 
|
|
ShuyiN 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 02.01.10 20:37
das programm startet von einem punkt aus, öffnet dann nacheinander 4 Funktionen, die jeweils prüfen, ob in die Richtung der Weg frei ist und wenn ja begibt er sich dorthin und öffnet dann wieder für jede richtung je eine abfrage.
das ist zwar sehr umständlich, aber so wurde es uns als standard-programm gegeben.
ich lass dann immer ein neues bild zeichnen bevor die richtung getestet wird:
- zeichnen: blick nach norden
- norden überprüfen
- zeichnen: blick nach osten
- osten überprüfen
- zeichnen: blick nach süden
- süden überprüfen
- zeichnen: blick nach westen
- westen überprüfen
und für jede dieser richtungen, die frei ist, wird dann die obige reihenfolge mit anderen x/y-Werten durchgegangen
(x+1y / x-1,y / x,y+1 / x,y-1).
das mit der abfrage einer variable, die durch einen button verändert wird hab ich mir auch schon gedacht, aber das sind ja sehr viele abfragen, da ja für jede getestete richtung eine abfrage gemacht werden müsste, was bei einem 20/20-felder-labyrinth schon im 5-6-stelligen bereich liegt.
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Sa 02.01.10 20:42
Aber du musst doch diese Funktionen irgendwie aufrufen, vermutlich über einen Timer oder OnIdle-Event der App.
Da kannst du doch eine If-Abfrage einbauen, dass deine Funktionen nur bei laufendem Programm ausgeführt werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if not Paused then begin - zeichnen: blick nach norden - norden überprüfen - zeichnen: blick nach osten - osten überprüfen - zeichnen: blick nach süden - süden überprüfen - zeichnen: blick nach westen - westen überprüfen end; |
edit:
Wenn es nicht zuviel Aufwand ist würde ich, wie von FinnO vorgeschlagen, erst den Weg berechnen und dann zeichnen.
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
ShuyiN 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 02.01.10 20:59
Zuletzt bearbeitet von ShuyiN am So 03.01.10 01:38, insgesamt 1-mal bearbeitet
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 02.01.10 23:23
naja, über backtracking o.Ä. (keine Ahnung, was genutzt wird), kriegt man ja einen Weg nach draußen. jetzt kannst du beim Zeichen ja effektiv nur diesen Pfad berücksichtigen. Das ganze war allerdings vom Ansatz her mehr auf OpenGL und 3D-Modellerstellung abgestimmt, da würdest du nämlich den Pfad dann abmodellieren und eine Kamerafahrt machen (oder natürlich das ganze Labyrinth modellieren und dann den Weg abfahren)
|
|
ShuyiN 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 02.01.10 23:45
achso, klar. das wär sinnvoll wenn ich ne realistische ansicht hätte.
mein modell ist nur eine geometrische vorstellung des labyrinths, wie bei diesem alten windows-bildschirmschoner.
|
|
ShuyiN 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 08.01.10 03:18
Ich hab jetzt 2 Lösungen für mein Problem gefunden:
1. einen Pause-Button erstellen mit dem Code ( ShowMessage('pause...'); ).
Das Program macht erst weiter, nachdem man das erscheinende Feld bestätigt hat!
2. Delay & Timer
Gruß ShuyiN
|
|