Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 28.02.08 15:54 
Hat sich schon einer darüber Gedanken gemacht? Also ich will jetzt keinen Quellcode, mich interessiert nur die Logik dahinter. Ich hab einige Anläufe auf gut Glück gemacht, aber keine zufriedenstellenden Ergebnisse erhalten. Bei dem Einem sah das Labyrinth gut aus, hatte aber unzugängliche Bereiche, bei dem Anderen war jeder Bereich zugänglich, aber es gab zu viele unnötige Durchgänge.

Hat sich einer Gedanken darüber gemacht oder kennt eine Seite die sich darüber Gedanken gemacht hat?

Wie gesagt, ich will kein Quellcode und ich will auch keine Maus durch das Labyrinth führen, sondern ein Labyrinth berechnen.

_________________
Popov
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.02.08 16:11 
Guck dir mal bei meiner AStar Demo den Labyrinth Algorithmus an: www.michael-puff.de/...eloper/Delphi/Demos/
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 28.02.08 16:49 
Damit habe ich mich schon zum Pascal-Zeiten beschäftigt als ich mir ein Clone von einem Alten C+4 Spiel schreiben wollte.
Mein erster Algo hat Anfangs zwei Minuten sinnlos rumgerechnet. (aufm 25MHz Rechner) brachte aber ein Labyrinth bei dem es nur genau einen Weg zu jedem Punkt im Labyrinth gab.
Später hat ein Algo auf dem gleichen Rechner nur noch wenige Sekunden gebraucht. (mit dem gleichen Ergebnis)

Zur Technik:
Ich verwende dafür die, von mir so getaufte, Links-Oben-Technik.
- Also, man hat eine Matrix von N+1 zu M+1 Feldern.
- jedes der Felder kann einen der Zustände, Links oder Oben annhemen, aber auch beide zusammen.
- Links und Oben Stellen die beiden Wandungen eins Quadrates dar. (Rechts und Unten sind überflüssig).
- Darum benötigt man N+1 und M+1 um N*M abgeschlossene Quadrate zu erhalten.
- Als erstes werden nun die Randfelder so belegt das eine geschlossene Außenseite entsteht.

- Wiederhole folgendes bis Bedingung nicht mehr erfüllt:
- wähle ein zufälliges Feld, das, wenn dessen Nachbarfelder mit betrachtet werden,
-> an mindestens einer Seite eine Wand hat,
-> aber maximal zwei Wände hat.
- Stelle eine neue Wand links oder oben so,
-> das diese an einer bereits stehenden Wand ansetzt,
-> aber keines der Nachbarfelder auf allen 4 Seiten verschließt.
- und Wiederhohlen das ganze.

Heraus kam dann das was man auf dem Bild sieht. (nicht wesentlich verändertes Programm aus meinem Abschlussprojekt Clusterfach Grafische Datenverarbeitung)
Einloggen, um Attachments anzusehen!
_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 28.02.08 17:06 
@Luckie

Ein interessantes Labyrinth, allerdings will ich ein komplexes Labyrinth. Das von dir verwendete Labyrinth hat eher Wände im Weg. Wenn man sich immer runter und rechts Richtung Ziel bewegt, kommt man auch irgendwann an. Auch wenn man gelegentlich kurze Strecken zurück gehen muß. Ich dagegen suche eine etwas komplexere Variante, die einen über das ganze Feld hin und her jagt.

_________________
Popov
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 28.02.08 17:14 
@Sinspin

Ich werde mir deine Beschreibung heute abend etwas genauer ansehen und versuchen es umzusetzen. Das Sonderbare ist, daß ich es früher schon mal gemacht habe, aber es ist inzwischen so lange her, daß ich mich nicht mehr erinnern kann wie ich es damals gemacht habe. Das ärgert mich etwas.

_________________
Popov
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 617
Erhaltene Danke: 364

W7
Delphi 6 pro
BeitragVerfasst: So 02.03.08 11:24 
Schau mal nach bei www.delphi-forum.de/...generator_80543.html

Gruß
Fiete

_________________
Fietes Gesetz: use your brain (THINK)
minnime
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 171

Win 7
Delphi Prism 2011, C# (VS 2010)
BeitragVerfasst: So 02.03.08 18:25 
Auch recht einleuchtend finde ich diese Beschreibung [url=www.heindl.de/KI2004...Labyrinthgenerierung und Wegfindung[/url].
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.08 13:10 
user profile iconPopov hat folgendes geschrieben:
daß ich mich nicht mehr erinnern kann wie ich es damals gemacht habe. Das ärgert mich etwas.

Dewegen versuche ich so etwas irgendwie schriftlich festzuhalten, sei es als kleines Tutorial, wenn es etwas umfangreicher ist oder als Artikel auf meiner Seite: artikel.michael-puff.de
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 06.03.08 22:35 
So, ich glaube ich hab es hingekriegt. Dabei hatte ich eigentlich schon am ersten Tag die richtige Idee, aber irgendwie zweifelte ich daran oder hoffte, es geht auch anders. Wie auch immer, zum Schluß hat sich der erste Gedanke als richtig rausgestellt. Aber das wußte ich damals noch nicht.

Zuerst hatte ich die Idee von Sinspin umgesetzt, wo er meinte sich nur nach links und oben zu orientieren. Das Ergebnis war im ersten Moment auch sehr gut. Allerdings ergibt das doch kein eindeutiges Labyrinth, da das Ganze eher aus "Inseln" besteht und man letztendlich immer ans Ziel kommt wenn man nur die Richtung einhält. Hier und da muß man paar Schritte zurück, aber sonst gibt es zig Wege zum Ziel. Allerdings gebe ich zu mich nicht 100% an die Anleitung von Sinspin gehalten zu haben. Vielmehr habe ich seine Beschreibung als Ideengeber genutzt. Es kann also sein, daß eine genaue Einhaltung ein anderes Labyrinth ergibt. Hier aber ein Labyrinth wie er aussieht wenn man sich nach links und oben konzentriert.

Moderiert von user profile iconNarses: Siehe Labyrinth1 im Anhang

Neuen Anlauf nahm ich, als ich in der von minnimes empfohlenen Pdf-Beschreibung etwas von Stack gelesen habe. Danach habe ich eigentlich gar nicht mehr weitergelesen, denn das war was ich als Idee gesucht habe. Wie schon gesagt war meine erste Idee es rekursiv zu berechnen, aber irgendwie hatte ich keine Idee wie ich es machen soll. Die Lösung war also der Stack. Per Zufallsgenerator bohrt man sich einen Weg durch das Labyrinth und legt alle Positionen die man nochmal besuchen will auf Stack. Das Ganze war schnell umgesetzt und endete nach erster Begeisterung im zweiten Moment zuerst in einer Enttäuschung.

Moderiert von user profile iconNarses: Siehe Labyrinth2 im Anhang

Das sieht wie ein Labyrinth aus, aber wenn man sich das genauer ansieht, dann bemerkt man, daß man die ganze Zeit nur einen Kurs hat. Hier nicht ans Ziel kommen ist geradezu unmöglich, denn der Weg hat kaum Abzweigungen. Wer Weg windet sich, spaltet sich aber kaum. Und wenn, dann nur minimal. Also auch nicht der richtige Weg?

Der Code landete beinahe im Papierkorb, als ich dann die Idee hatte den Stack nicht von oben abzubauen, sondern von unten. Und siehe da, plötzlich hatte ich dieses Labyrinth

Moderiert von user profile iconNarses: Siehe Labyrinth3 im Anhang

Kleine Änderung, große Wirkung, denn jetzt kann man sich verirren.

Der Grund wieso das Labyrinth zu einfach war wenn ich den Stack von oben abbaute ist einfach. Das Programm bohrte sich per Zufallsgenerator seinen Weg. Ging es nicht weiter, ging es zu der letzten Stelle zurück und machte weiter. Die letzte Stelle war in der Regel aber gleich in der Nähe, so daß das Ergebnis nur ein großer Tunnel war. Nimmt man die Positionen aber von unten, so ergibt das einen ganz neuen Tunnel.

Zuletzt noch die Beschreibung wie ich es gemacht habe.

- von der aktuellen Zelle, in der man sich gerade befindet, alle vier Nachbarzellen untersuchen, also oben, rechts, unten, links. Hat eine der Nachbarzellen noch alle vier Wände, dann die Position der aktuellen Zelle auf Stack gelegt.
- per Zufallsgenerator eine der geschlossenen Nachbarzellen aussuchen, die Wand durchbrechen und in diese Zelle wechseln.
- Punkt 1 und 2 solange wiederholen bis man in eine Zelle kommt die keine Nachbarzelle(n) mit vier Wänden hat.
- Neue Position für aktuelle Zelle vom Stack (von unten) holen und ab Punkt 1 weitermachen.

Hat sich am Status der Zelle etwas geändert, d.h. die ehemals geschlossene Nachbarzelle ist inzwischen offen, dann wird das im Punkt 3 erkannt und im Punkt 4 holt man sich eine neue Zelle. Der Stack wächst also ziemlich an, denn am Anfang sind fast alle Nachbarzellen noch geschlossen, aber jede Position vom Stack wird nochmal besucht. Und ist die Nachbarzelle inzwischen offen, dann holt man sich eben den nähsten Wert.

- Ist der Stack abgearbeitet, ist man fertig.

Bei dieser Art des Labyrinths kann man jede Position erreichen und es gibt keine Inseln, so daß man, wenn man sich immer links hält, nicht irgendwann wieder an die gleiche Stelle landet. Es gibt also nur einen Weg zum Ziel.

Moderiert von user profile iconNarses: Bilder als Anhang hochgeladen, damit sie uns auch erhalten bleiben. ;)
Einloggen, um Attachments anzusehen!
_________________
Popov
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 07.03.08 14:00 
user profile iconPopov hat folgendes geschrieben:

Zuerst hatte ich die Idee von Sinspin umgesetzt, wo er meinte sich nur nach links und oben zu orientieren. Das Ergebnis war im ersten Moment auch sehr gut. Allerdings ergibt das doch kein eindeutiges Labyrinth, da das Ganze eher aus "Inseln" besteht und man letztendlich immer ans Ziel kommt wenn man nur die Richtung einhält. Hier und da muß man paar Schritte zurück, aber sonst gibt es zig Wege zum Ziel. Allerdings gebe ich zu mich nicht 100% an die Anleitung von Sinspin gehalten zu haben. Vielmehr habe ich seine Beschreibung als Ideengeber genutzt. Es kann also sein, daß eine genaue Einhaltung ein anderes Labyrinth ergibt. Hier aber ein Labyrinth wie er aussieht wenn man sich nach links und oben konzentriert.

Zugegeben, meine Beschreibung war auch ein bisschen übel, es ist halt schon mehr als 2 Jahre her das ich den Algo wirklich mal angefasst habe.

Aber mit der Technik bekommt man ein 1A Labyrinth mit genau einem Weg zu jedem Punkt. Bleibt man also die ganze Zeit mit der gleichen Hand an der Wand findet man irgendwann auch den Punkt wieder wo man losgelaufen ist, und hat dann alles gesehen was es zu sehen gab.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?