Ich mache ein Spiel mit einer prozedural erzeugten Welt, die zu Beginn des Spiels erstellt wurde und aus mehreren Bereichen besteht, die durch Gitter dargestellt werden (z. B. 8x8, 9x6, die Größen wären idealerweise beliebig). Diese Bereiche sollen über eine Abhängigkeitsliste miteinander verbunden sein.
Eine Verbindung besteht, wenn mindestens drei Bereiche dieses Rasters zwischen diesen beiden Bereichen freigelegt sind. In der mittleren Zelle dieses 3-Raum-Verbindungsbereichs befindet sich die Tür zwischen den Bereichen:
Ich habe versucht, einen Weg zu finden, sie zu verbinden, aber es wird immer komplexer, je mehr Bereiche Sie gleichzeitig berücksichtigen müssen.
Ich habe einige Papier-Prototypen ausprobiert, und obwohl dies visuell sehr einfach ist, habe ich keine guten mathematischen Ausdrücke gefunden, mit denen ich Räume mit der gleichen Effizienz per Code platzieren kann.
Hier ist ein "einfaches" Beispiel, mit dem ich gerade zu kämpfen habe:
- Bereich 'a' muss mit 'b' und 'c' verbunden werden
- Bereich 'b' muss mit 'a' und 'd' verbunden sein
- Bereich 'c' muss mit 'a' und 'd' verbunden sein
- Bereich 'd' muss mit 'b' und 'c' verbunden sein
Nehmen wir zur Vereinfachung an, wir platzieren die Räume in der Reihenfolge ihres Auftretens auf der Liste (ich habe andere ausprobiert). Ich betrachte dies als Ihren standardmäßigen prozeduralen Dungeon-Generierungsalgorithmus.
Wir platzieren 'a' irgendwo auf dem Brett, da es der erste Bereich ist. Als nächstes wählen wir zufällig eine Wand und da nichts mit dieser Wand verbunden ist, können wir dort 'b' platzieren:
Jetzt müssen wir 'c' platzieren, aber 'a' befindet sich bereits auf der Tafel und hat eine besetzte Wand. Deshalb entscheiden wir uns, sie an eine andere Wand zu hängen. Aber nicht jede Platzierung ist ausreichend, da "d" ansteht und auch mit "b" und "c" verbunden werden muss:
Ich habe eine mögliche Einschränkung ausprobiert, dass 2 Räume mit denselben Abhängigkeiten nicht an gegenüberliegenden Wänden liegen können, aber auch das garantiert keinen Erfolg:
Und in anderen Fällen, in denen die Bereiche unterschiedlich groß sind, kann es funktionieren, wenn Sie sich an gegenüberliegenden Wänden befinden:
Auch die Nichtberücksichtigung einer gebrauchten Wand ist eine fehlerhafte Annahme, da sie gültige Lösungen ausschließt:
Ich habe versucht, mich mit anderen Algorithmen zur Prozedurgenerierung oder ähnlichen zu befassen, z. B. mit Optimal Rectangle Packing- und Graph Layout-Algorithmen. In der Regel berücksichtigen diese Algorithmen jedoch nicht alle Einschränkungen dieses Problems und sind schwer miteinander zu mischen.
Ich habe über eine Reihe von Ansätzen nachgedacht, einschließlich Platzieren eines Bereichs und Zurückverfolgen, bis eine geeignete Platzierung gefunden ist, aber sie scheinen sehr abhängig von Versuch und Irrtum und in Bezug auf die Berechnung kostspielig zu sein. Aber angesichts der umfangreichen Nachforschungen zu den beiden zuletzt genannten Problemen könnte es die einzige / beste Lösung sein?
Ich wollte nur sehen, ob jemand in der Vergangenheit ähnliche Probleme hatte oder bereit ist, mir dabei zu helfen, dies herauszufinden, und mir ein paar Hinweise zu geben, wo ich mit dem Algorithmus beginnen sollte. Andernfalls muss ich mich mit der Lockerung der von mir festgelegten Einschränkungen befassen.