Was ist eine gute Strategie einen gerichteten Graphen für eine Spielkarte (in Python) für den Bau?

StackOverflow https://stackoverflow.com/questions/610892

Frage

Ich entwickle eine prozedural generierten Spielwelt in Python. Die Struktur der Welt ähnlich sein wird, zu dem Schlamm- / MUSH Paradigma des Zimmers und tritt als ein gerichteten Graphen angeordnet (Räume sind Knoten, Ausfahrten sind Kanten). (Beachten Sie, dass dies nicht unbedingt ein azyklischer Graph, obwohl ich bin bereit, azyklische Lösungen zu berücksichtigen.)

Zum Welterzeugungsalgorithmus, Zimmer verschiedener Art wird von jedem Raum des „Tags“ Attribute (eine Reihe von Strings) unterschieden werden. Sobald sie instanziiert wurden, können Zimmer abgefragt und durch Tags (Single-Tag, Tag Kreuzung, Tag Vereinigung, Best-Kandidat) ausgewählt werden.

werde ich bestimmte Arten von Zimmern werden die Schaffung eines verherrlichten System von Vorlagenobjekten und Factory-Methoden verwenden - ich glaube nicht, die Details hier wichtig sind, wie die aktuelle Implementierung wird wahrscheinlich die gewählte Strategie anzupassen ändern. (Zum Beispiel wäre es möglich, Tags und Tag-Anfragen an der Raumvorlage System hinzuzufügen.)

Für ein Beispiel, werde ich Zimmer dieser Art haben:

side_street, main_street, plaza, bar, hotel, restaurant, shop, office

Schließlich ist die Frage: Was ist eine gute Strategie für die Instanziierung und Anordnung dieser Räume eine Grafik zu erstellen, die zu bestimmten Regeln entsprechen könnten?

Einige Regeln könnten gehören: ein Platz pro 10.000 Einwohner; main_street Verbindung zu plaza; side_street verbindet oder main_street side_street; hotel begünstigt main_street oder plaza Verbindungen und erhält weitere Tags entsprechend; etc.

Bonuspunkte, wenn eine vorgeschlagene Strategie wäre eine datengesteuerte Implementierung ermöglichen.

War es hilfreich?

Lösung

Zuerst müssen Sie ein Gefühl für Ort. Ihre verschiedenen Objekte belegen eine gewisse Menge an Raum koordinieren.

Sie müssen entscheiden, wie regelmäßig diese verschiedenen Dinge sind. Im trivialen Fall, können Sie sie in Ihre Koordinatenraum als einfache Rechtecke (oder Quadern) fallen können an Orte einfacher zu machen zu planen.

Wenn die Dinge sind unregelmäßig - und dicht gepackte -. Leben ist etwas komplexer

Definieren Sie eine Karte Standorte enthalten. Jede Position hat eine Spannweite von Koordinaten; wenn Sie mit einfachen Rechtecken arbeiten, dann kann jeder Standort einen (links, oben, rechts, unten) Tupels.

Ihre Karte wird Methoden benötigen, um zu bestimmen, die in einem bestimmten Raum aufhält, und das, was in den Raum angrenzenden ist, etc.

Sie können dann diese Einheit Test mit einem festen Satz von Orten, die Sie gearbeitet haben, dass alle in die Karte abgeworfen werden und einige grundlegende Plausibilitätsprüfungen für nicht-Konflikt, angrenzend passieren, und dergleichen.


Zweitens müssen Sie eine Art „Labyrinth-Generator“. Ein einfach zusammenhängender maze ist leicht als Baumstruktur erzeugt wird, die nach oben in den gegebenen Raum gefaltet wird.

Das Labyrinth / Baum hat eine „Wurzel“ -Knoten, der das Zentrum des Labyrinths ist. Nicht unbedingt die physische Mitte des Raumes, sondern der Wurzelknoten wird die Mitte des Labyrinths Struktur sein.

Idealerweise ein Zweig von diesem Knoten enthält einen „Eingang“, um den gesamten Raum.

Der andere Zweig von diesem Knoten enthält einen „Exit“ aus dem gesamten Raum.

Jemand kann vom Eingang wandern zu verlassen, eine Menge „dead-end“ Stellen auf dem Weg zu besuchen.

Wählen Sie eine Art von Raum für den Wurzelknoten. Drop in Ihren Map Raum.

Dies hat 1 - n Eingänge, von denen jeder ein Teilbaum mit einem Wurzelknoten und 1 - n Eingänge. Es ist das Multiple-Eingang Geschäft, das einen Baum für diese Struktur eine natürliche Passform macht. Auch ein richtiger Baum ist immer gut verbunden, dass Sie nie Abschnitte isoliert haben, die nicht erreicht werden kann.

Sie über - rekursiv - Auffächerung von dem Wurzelknoten, Standorte Kommissionierung und sie in den verfügbaren Raum fallen.

Unit-Test dies sicherzustellen, dass es Raum füllt einigermaßen gut.


Der Rest Ihrer Anforderungen sind die Feinabstimmung auf dem Weg der Labyrinth-Generator nimmt Standorten.

Am einfachsten ist es, eine Tabelle von Gewichten und zufälliger Auswahl zu haben. Wählen Sie eine Zufallszahl, vergleichen sie mit den Gewichten zu sehen, welche Art von Position identifiziert wird.


Ihre Definition von Raum kann 2D oder 3D sein - beide sind ziemlich vernünftig. Für Bonusguthaben, überlegen, wie Sie einen 2D-Raum mit Sechsecken der Quadrate statt geflieste implementieren würde.

Diese "Geometrie" kann eine Strategie sein Plug-in für die verschiedene Algorithmen. Wenn Sie Platz 2D mit hexagonalem 2D ersetzen können, haben Sie eine gute Arbeit des OO-Designs gemacht.

Andere Tipps

Überprüfen Sie die Diskussionen über der MUD-Connector aus - gibt es einige große Diskussionen über die Welt Layout und die Erzeugung und verschiedene Arten von Koordinaten / Navigationssysteme im "Advanced Coding and Design" (oder ähnlich) Forum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top