Prim ' s Algorithmus für die Generierung von einem Labyrinth: Immer die Nachbar-Zelle
Ich bin stützend einen Labyrinth-generator-Programm auf dem Prim-Algorithmus:
Dieser Algorithmus ist eine randomisierte version des Prim-Algorithmus.
- Beginnen Sie mit einem Netz voller Wände.
- Wählen Sie eine Zelle, markieren Sie Sie als Teil des Labyrinths. Fügen Sie die Wände der Zelle mit der Wandmalerei.
- Zwar gibt es Wände in der Liste:
- Wählen Sie eine zufällige Wand aus der Liste.
Wenn die Zelle auf der gegenüberliegenden Seite nicht in das Labyrinth noch:
- Machen die Wand ein Durchgang, und markieren Sie die Zelle auf der gegenüberliegenden Seite als Teil des Labyrinths.
- Fügen Sie die benachbarten Wände der Zelle mit der Wandmalerei.
- Wenn die Zelle auf der gegenüberliegenden Seite war schon in das Labyrinth, entfernen Sie die Wand aus der Liste.
(aus Wikipedia)
Verstehe ich den Algorithmus schon, ich bin nur fest auf diesen Teil:
"Zu wissen, ob der Nachbar Zelle bildet einen Teil des Labyrinths oder nicht" (das bedeutet, dass Immer der Nachbar Zelle zuerst)
Die Zellen sind eigentlich Knoten eines Baumes (das Labyrinth, ein bi-dimensionales array von Zellen) und die Wände sind die Kanten zwischen diesen Knoten, ich dachte, es wäre notwendig, zu erkennen, jede Wand mit einem paar von Punkten (x,y). Wie weiß ich, ob zwei Zellen miteinander verbunden sind durch eine Wand?
(denken Sie daran, dass jede Zelle hat 4 Wände)
Ich dachte über die Verwendung der equals () - Funktion. Ich Frage nur für einen pseudo-code oder Ihre beste Erklärung zu, würde die Dinge einfacher.
Meiner Wand Klasse hat drei Attribute: bool isWall(bestimmt, ob es eine Wand oder einen Durchgang zwischen den Zellen); int x; int y (Identifier).
Wenn Sie denken, dass ich brauchen würde, mehr Attribute ich das gerne wissen. Ich weiß, es gibt einen einfachen Weg, ich bin nur geklebt 😉
Vielen Dank für Ihre Zeit!
- Übrigens, ich bin stützend einige der Umsetzung auf diesen code, gepostet von @danny.lesnik: stackoverflow.com/questions/11459752/...
- Sie überlegen, eine Wand, definiert durch das jeweilige paar von Zellen trennt.
- Also das hinzufügen zu @bcr das bedeutet, dass ein Wand-Objekt hätte "isWall' und 'cell1' und 'cell2' als Attribute. Die Zellen sollten entweder die x -, y-Position in Ihnen, oder Sie würde schauen durch das Labyrinth-array, um es zu finden. Nur mit x und y ist ein problem für eine Wand-als das nicht definieren. Jede Wand kann verstanden werden als die Verbindung von zwei x,y-Stellungen, ob Sie denken, der Ecken einer Zelle in einem raster Punkt oder die Zentren der Zelle.
- Die Wand-Liste zu haben, eine Zelle + Wand-pair-Mädchen in ihm Sinn zu machen. Eine Wand allein hat kein "gegenüber" - Seite. Sie haben entweder eine Zelle, so dass Sie überprüfen können, die gegenüber einem ODER man könnte einfach beide Zellen. Man wird immer in das Labyrinth, weil das ist, wie die Mauern Holen Sie sich in die Liste der Wände. Der andere könnte oder nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lets sehen, was wir definieren können:
Kann ich keinen Kommentar hinzufügen, um die Diskussion so schlecht ist, Antworten Sie einfach mit einer Antwort. Im Grunde Lee Meandor hat die richtige Idee.
Dies ist die grundlegende Struktur der Zelle zu Wand zu Zelle Bezug.
So eine Zelle hat eine Nord-Süd-west-und Ost-Wand.
Einer Wand zwischen zwei benachbarten Zellen verbinden.
Die wichtige Sache im Auge zu behalten ist für die Zellen zu sein, zeigt auf die richtigen Wände.
Dass einige wichtige Logik funktioniert :).
Wenn Sie dabei Hilfe benötigen, werfen Sie einfach einen Kommentar.
Nun, ich verbrachte den ganzen Nachmittag Codierung der Labyrinth-generator, basierend auf Ihre Hilfe.
Nun ich bin immer diese Art von Labyrinthen (sorry für den big screen-shot habe ich nicht ein Bild-editor hier.
Ich denke, das problem ist, wie ich zurückkehren werde der Nachbar-Zelle. Vielleicht auch nicht.
Dies ist, wie ich zurückkehren werde der Nachbar-Zelle, ich habe es der @progenhard Weg, die Wand hat 2 Zellen, cell1 und cell2, wenn cell1 besetzt ist, zurück cell2 und Umgekehrt:
Nochmals vielen Dank!