Ich entwerfe ein Spiel mit zufällig generierten Dungeons. Ich möchte dies als ein verbundenes, ungerichtetes Diagramm betrachten, in dem Knoten Räume und Kanten Türen oder Korridore sind. Dann wähle ich einen "Seiten" -Knoten als Dungeoneingang, berechne den Abstand zwischen diesem Eingang und allen anderen Knoten und entscheide, dass einer der am weitesten entfernten Knoten das "Ziel" des Dungeons ist (der Ort des Schatzes, des Chefs, Prinzessin usw.).
Ich habe zwei Möglichkeiten gesehen, um die endgültige Dungeontopographie zu erstellen:
- Generieren Sie zuerst ein zufälliges Diagramm und versuchen Sie dann, die 2D-Welt mit Räumen an zufälligen Orten zu füllen, wobei Sie die Randverbindungen berücksichtigen. Ich dachte, das wäre manchmal schwierig, weil die Raumgeneration "verschlossen" werden könnte, um Räume an unmöglichen Orten unterzubringen.
- Generieren Sie die ersten Räume, platzieren Sie sie zufällig dort, wo sie passen, und ordnen Sie das Ergebnis dann Knoten und Kanten zu. Ich habe beschlossen, dies zu versuchen.
Meine Idee besteht aus:
- Generiere zuerst einen großen Raum, der den gesamten Dungeon enthalten würde.
- Stellen Sie an einer zufälligen Stelle eine Wand in den großen Raum und teilen Sie den großen Raum in zwei kleinere Räume mit unterschiedlichem Bereich.
- Dann teile ich jeden Raum weiter in 2, bis sie zu klein sind oder die Gesamtzahl der Räume ein Maximum erreicht (oder eine andere Bedingung). Jeder neue Raum ist ein Knoten.
- Sobald ich fertig bin, überprüfe ich jeden Raum und finde alle angrenzenden anderen Räume, wobei ich die 2 Knoten als durch eine Kante verbunden markiere.
Auf diese Weise stelle ich sicher, dass alle Räume einen möglichen Standort in der 2D-Welt haben und von einem verbundenen Diagramm korrekt abgebildet werden.
Mein Problem ist, dass es zu viele Türen und Korridore gibt, die die Räume verbinden.
Ich möchte also einen Algorithmus, der die Anzahl der Kanten eines verbundenen ungerichteten Graphen reduziert , ihn aber am Ende in Verbindung hält (alle Knoten bleiben erreichbar).