Rekursive Dungeon-Karten, dargestellt durch ein elastisches 2d-Array


8

Ich habe eine Methode zum rekursiven Generieren einfacher Dungeonkarten entwickelt, indem ich mit einem Raum begonnen und rekursiv neue benachbarte Räume zufällig damit verbunden habe.

Karten werden als zweidimensionale Arrays dargestellt, wobei jede Zelle einen Wert von 0-15 enthält. 0 steht für keinen Raum, während jede Richtung durch Nord = 1, Ost = 2, Süd = 4, West = 8 dargestellt wird.

Ich wollte mit einem einzelnen Nicht-Raum ([[0]]) beginnen und dann das 2D-Array nach Bedarf erweitern, um es an die generierte Karte anzupassen. Die Schwierigkeit, mit der ich bei dieser baumartigen Rekursion konfrontiert bin, besteht darin, dass ich die aktuelle Position der Funktion anpassen muss, an welcher Zeile und in welcher Spalte sie sich befindet, wenn die Arrays verschoben werden müssen, um Zeilen und Spalten links und oben auf der Karte hinzuzufügen . Dies führt dazu, dass separate Zweige keine Anpassungen des Array-Index von anderen Zweigen kennen. Nur ihre untergeordneten Funktionen wissen dies, da ihnen die angepasste Position als Zeilen- und Spaltenargumente übergeben wurde.

Gibt es eine Möglichkeit, dies zu tun? Ich habe versucht, Zeilen- und Spaltenversatzwerte außerhalb der Rekursion zu speichern, aber es hat aus irgendeinem Grund nicht funktioniert.

Antworten:


5

Gibt es einen Grund, warum Sie ein 2D-Array verwenden müssen, oder würde eine Hash-Tabelle oder eine andere Art von Karte funktionieren? Dann setzen sich die x, y-Indizes einfach in den negativen Raum fort, aber das spielt keine Rolle.

Wenn Sie sich Gedanken über die Speicher- oder CPU-Geschwindigkeit machen, 1) seien Sie nicht, Hash-Tabellen sind sehr effizient bei Dingen wie dichten Ganzzahlenpaaren, 2) Sie können die Ebene in eine Hash-Tabelle einbauen und sie dann in eine nachverarbeiten Array, sobald Sie die endgültige Größe kennen.


Die Hash-Funktion würde also ein x- und ein ay-Argument akzeptieren und dies würde im Grunde einem assoziativen Array mit Schlüsseln wie 1x1, -1x3 usw. zugeordnet.

Ja. In C ++ würde ich nur ein std :: pair <int, int> verwenden; in Python ein Diktat mit (x, y) Tupeln für Schlüssel. Ich bin mir nicht sicher, welche Sprache Sie verwenden.

2

Ich mache eine ähnliche Sache in Python. (Oder zumindest der elastische Teil).

Ich habe ein Wörterbuch mit (x, y) Tupeln, die den Zellen zugeordnet sind. Im Pseudocode:

map = dictionary( (0,0) : cell at (0,0), (1,0) : cell at (1,0) ... (2, 2) : cell at (2,2)
getCell(x,y):
    return map[(x,y)]
    catch error if out of bounds:
         map[(x,y)] = new cell and return

Eine Hash-Tabelle wäre für so etwas sehr gut.


1

Die Lösung mit minimalem Aufwand besteht darin, eine maximale Größe (X- und Y-Ausdehnung) auszuwählen, die der Dungeon erreichen soll, Ihren Startpunkt in die Mitte zu setzen und kein Wachstum außerhalb des Dungeons zuzulassen. Keine Verschiebung erforderlich. Kommt natürlich darauf an, dass ein fester Umfang akzeptabel ist.


-1

Sie möchten ein Diagramm anstelle des 2D-Arrays verwenden.

Jeder Raum wäre ein Knoten in der Grafik und weiß, welche anderen Räume daneben liegen:

Room {
    long x;
    long y;
    List adjacentRooms;
}

Auf diese Weise müssen Sie nicht definieren, wie groß Ihre Karte werden kann.

Die x, y-Koordinaten können als eindeutiger Schlüssel in einer Hashmap für den schnellen Zugriff auf jeden Raum verwendet werden. Wenn Sie einen neuen Raum hinzufügen, werden lediglich Einträge zu den Listen der angrenzenden Räume der Räume in der Nähe hinzugefügt.

Das Diagramm eignet sich auch hervorragend für Pfadfindungsalgorithmen, wenn Sie diese benötigen.


Dies funktioniert schlecht und erfordert viel mehr Buchhaltung als eine Hash-Tabelle oder ein Array. Es gibt keinen Vorteil in den Räumen, die sowohl einen X-, Y-Hash-Schlüssel als auch einen gerichteten Graphen bilden.

Wie würden Sie mit nur der gerichteten Grafik schnell auf Räume zugreifen? Wie würden Sie die Pfadfindung nur mit einem X, Y-Hash-Schlüssel durchführen? Dies würde zusätzliche Logik erfordern, um die angrenzenden Räume zu bestimmen. Der Hash-Schlüssel ist wirklich nur eine andere Ansicht der Spielwelt. Ich bin damit einverstanden, dass die Handhabung eines Diagramms schwieriger ist, aber Algorithmen, die das Diagramm verwenden, zugute kommen. Die Leistung hängt von der Größe der Spielwelt ab. Das muss also ein Prototyp sein. Danke für die Abstimmung. Prost!
Stephen

Nichts in der Pfadfindung schließt die Verwendung eines Hash von X, Y-Paaren aus. Nachfolgestatus sind Nachfolgestatus. Es spielt keine Rolle, ob Sie ein verrücktes Diagramm pflegen oder es in einer Hash-Tabelle nachschlagen, außer dass die Hash-Tabelle schneller ist und weniger Speicher benötigt.

Die Hash-Key-Lösung ist weniger abstrakt. Wie ich zuvor geschrieben habe, muss der Pfadfinder wissen, welche Räume nebeneinander liegen, wie die Entfernung zum Zielraum berechnet wird usw. Sie würden Wissen über die Spielwelt in Ihren Pfadfindungsalgorithmus einfließen lassen. Wenn sich das Setup der Spielwelt ändert, z. B. Bewegungen aus diagonal zueinander liegenden Räumen zulässig sind oder eine dritte Dimension hinzugefügt wird, müssen Sie jeden Algorithmus ändern, der auf die Spielwelt zugreift. Grafiken abstrahieren dies weg. Nichts Verrücktes daran. Jede Lösung hat immer einen Nachteil.
Stephen

1
"Grafiken abstrahieren dies weg." Dies gilt auch für Iteratoren, Generatoren, Coroutinen oder Listenerstellungsmethoden, und sie erfordern weder ein Aufblähen der O (n) -Struktur noch mehr Buchhaltung während der Erstellung.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.