Ich habe mir einige Algorithmen und Artikel zum prozeduralen Generieren eines Dungeons angesehen. Das Problem ist, dass ich versuche, ein Haus mit Zimmern zu bauen, die meinen Anforderungen nicht entsprechen.
Zum einen haben Dungeons Korridore, in denen Häuser Hallen haben. Und während sie anfangs vielleicht gleich aussehen, ist eine Halle nichts anderes als der Bereich, der kein Raum ist, während ein Korridor speziell dafür ausgelegt ist, einen Bereich mit einem anderen zu verbinden.
Ein weiterer wichtiger Unterschied zu einem Haus besteht darin, dass Sie eine bestimmte Breite und Höhe haben und das Ganze mit Räumen und Hallen füllen müssen, während bei einem Verlies der Raum leer ist.
Ich denke, Hallen in einem Haus sind etwas zwischen einem Dungeon-Korridor (der Sie zu anderen Räumen führt) und einem leeren Raum im Dungeon (der nicht explizit im Code definiert ist).
Insbesondere sind die Anforderungen:
- Es gibt eine Reihe vordefinierter Räume, in denen
ich keine Wände und Türen im laufenden Betrieb erstellen kann. - Räume können gedreht, aber nicht in der Größe verändert
werden. Da ich über einen vordefinierten Satz von Räumen verfüge, kann ich sie nur drehen, nicht aber in der Größe verändern. - Die
Hausmaße sind festgelegt und müssen vollständig mit Räumen (oder Hallen) gefüllt sein. Das heißt, ich möchte ein 14x20-Haus mit den verfügbaren Räumen füllen, um sicherzustellen, dass es keinen leeren Raum gibt.
Hier sind einige Bilder, um dies etwas klarer zu machen:
Wie Sie sehen können, ist der "leere Raum" im Haus noch begehbar und bringt Sie von einem Raum zum anderen.
Nach alledem ist ein Haus vielleicht nur ein wirklich sehr dicht gedrängter Kerker mit Korridoren. Oder es ist einfacher als ein Dungeon. Vielleicht gibt es da draußen etwas, und ich habe es nicht gefunden, weil ich nicht wirklich weiß, wonach ich suchen soll.
Hier möchte ich Sie um Ihre Hilfe bitten: Können Sie mir Hinweise zum Entwurf dieses Algorithmus geben? Irgendwelche Gedanken darüber, welche Schritte es unternehmen wird? Wenn Sie einen Dungeon-Generator erstellt haben, wie würden Sie ihn an meine Anforderungen anpassen? Sie können so spezifisch oder allgemein sein, wie Sie möchten. Ich bin wirklich auf der Suche nach deinem Verstand.
Antworten:
Ich denke, dies ist ein guter Fall für die Verwendung von binären oder ternären Raumpartitionen.
Teilen Sie den Hausraum beim ersten Durchgang in Hallen und {Wohnblocks} auf. Holen Sie sich den nächsten großen Teil, teilen Sie ihn in {Halle und Teil} oder {2 Teile und Halle dazwischen} auf. Drehen Sie die Schnittrichtung bei jedem Schritt um 90 Grad. Stoppen Sie, wenn {keine großen Brocken mehr übrig sind} oder {die gesamte Hallenfläche das Limit erreicht hat}.
Teilen Sie beim zweiten Durchgang die verbleibenden Stücke in Räume auf. Holen Sie sich das nächste große Stück und teilen Sie es. Überspringen Sie die zufällige Aufteilung einiger weniger großer Stücke, um einige große Räume zu haben.
Wenn eine Halle einer viel älteren Halle zugewandt ist, platzieren Sie dort eine Wand (oder eine Wand mit Tür).
Verbinden Sie Räume mit Hallen direkt oder durch andere bereits verbundene Räume.
Zum Beispiel können Sie entweder mein manuell erstelltes Ergebnis oder C ++ sehen - ähnlich wie teilweise erstellten Pseudocode . Letzter Schuss:
quelle
L-system
.Sie können die Tatsache nutzen, dass Ihr gewünschtes Design die Räume in rechteckige Räume umgibt, die von Korridoren umgeben sind. In diesem Sinne würde ich Folgendes tun:
Das Auffüllen der großen Räume mit Räumen ist einfach, wenn Sie mit den Räumen an den Rändern beginnen - sie unterliegen bestimmten Einschränkungen, z. B. können die Räume, die einem Korridor zugewandt sind, eine Tür an dieser Wand haben, aber die Räume, die den „Außenwänden“ zugewandt sind. kann nicht (sie könnten vielleicht Fenster haben). Räume "innerhalb" der großen Blöcke der Räume benötigen mindestens einen Eingang.
quelle
Also, hier ist, wie ich dieses Problem gelöst habe. Aber zuerst möchte ich mich bei @Shadows In Rain und @egarcia für ihre Antworten bedanken. Sie gaben mir eine gute Richtung, die mir half, einige Ergebnisse zu erzielen.
Ich benutzte Shadows In Rain's Raumaufteilung, um ein einfaches Haus zu erstellen und folgte dann Egarcias Rat, um den Bereich mit Räumen auszufüllen.
Die Raumaufteilung war ziemlich unkompliziert, da 90% des Codes von Shadows erstellt wurden. Der Teil "Räume ausfüllen" war etwas herausfordernder. Ich entschied mich für ein Pseudo-KI-Planungssystem, das A * verwendet, um die Räume entsprechend zu positionieren. Das Gute an der Verwendung von Planung anstelle von nur A * ist, dass die Voraussetzungen dazu beitragen, den Suchraum erheblich zu verringern.
Hier sind einige Screenshots mit den Ergebnissen:
Grundrisserstellungsphase
Raumvergabephase
Jetzt mit Verbindungstüren!
quelle
Dahl & Rinde haben eine Abschlussarbeit über die prozedurale Erzeugung von Innenräumen verfasst, die einen Skelett- & Regions-Ansatz verwendet, um Gebäudeinnenräume mit Räumen und Fluren zu füllen. Das Papier enthält Klassendiagramme für ihren Prototyp. Es gibt auch einige gute Referenzen in ihrer Bibliographie, einschließlich der oben erwähnten A Pattern Language .
Ihre Arbeit war auf die folgenden vereinfachenden Annahmen ausgerichtet:
Hier ist ein kurzer Überblick über ihren Prozess:
Schließlich werden die Wohnungen anhand eines gewichteten Voronoi-ähnlichen Diagramms wie folgt in Räume unterteilt:
quelle