Cartes de donjon récursives représentées par un tableau 2D élastique


8

J'ai trouvé une méthode pour générer récursivement des cartes de donjon simples en commençant par une pièce et en y connectant de manière aléatoire de nouvelles pièces adjacentes.

Les cartes sont représentées sous forme de tableaux bidimensionnels où chaque cellule contient une valeur de 0 à 15. 0 ne représente aucune pièce tandis que chaque direction est représentée par nord = 1, est = 2, sud = 4, ouest = 8.

Je voulais commencer avec une seule pièce non ([[0]]), puis étendre le tableau 2d si nécessaire pour s'adapter à la carte générée. La difficulté que je rencontre avec cet arbre comme la récursivité est que si les tableaux doivent être décalés pour ajouter des lignes et des colonnes à gauche et en haut de la carte, je dois ajuster la position actuelle de la fonction, à quelle ligne et colonne elle se trouve . Cela fait en sorte que les branches distinctes ne soient pas au courant des ajustements d'index de tableau des autres branches, seules leurs fonctions enfants le sauront car leur position ajustée leur est transmise en tant qu'arguments de ligne et de colonne.

Y a-t-il un moyen de faire cela? J'ai essayé de stocker des valeurs de décalage de ligne et de colonne en dehors de la récursivité, mais cela n'a pas fonctionné pour une raison quelconque.

Réponses:


5

Y a-t-il une raison pour laquelle vous devez utiliser un tableau 2D, ou est-ce qu'une table de hachage ou un autre type de carte fonctionnerait? Ensuite, les indices x, y continuent juste dans un espace négatif, mais cela n'a pas d'importance.

Si vous êtes préoccupé par la mémoire ou la vitesse du processeur, 1) Ne le soyez pas, les tables de hachage sont très efficaces dans des choses comme des paires d'entiers denses, 2) vous pouvez créer le niveau dans une table de hachage, puis le post-traiter dans un tableau une fois que vous connaissez la taille finale.


donc la fonction de hachage accepterait un argument x et ay et cela serait mappé à un tableau associatif avec des clés comme 1x1, -1x3, etc.?

Ouais. En C ++, j'utiliserais simplement un std :: pair <int, int>; en Python, un dict avec (x, y) tuples pour les clés. Je ne sais pas quelle langue vous utilisez.

2

Je fais une chose similaire, en Python. (Ou au moins la partie élastique).

J'ai un dictionnaire de (x, y) tuples mappant sur les cellules. En pseudo code:

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

Une table de hachage serait très bonne pour ce genre de chose.


1

La solution d'effort minimum consiste à choisir une taille maximale (étendue X et Y) que vous souhaitez que le donjon atteigne, placez votre point de départ au centre de cela et ne permettez pas la croissance en dehors. Pas besoin de changer de vitesse. Cela dépend, bien entendu, de l'étendue fixe.


-1

Vous souhaitez utiliser un graphique au lieu du tableau 2D.

Chaque pièce serait un nœud dans le graphe et sait quelles autres pièces lui sont adjacentes:

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

De cette façon, vous n'avez pas à définir la taille de votre carte.

Les coordonnées x, y peuvent être utilisées comme clé unique dans une table de hachage pour un accès rapide à chaque pièce. L'ajout d'une nouvelle pièce ne ferait qu'ajouter des entrées aux listes adjacentRooms des pièces voisines.

Le graphique est également idéal pour les algorithmes de recherche de chemin, si vous en avez besoin.


Cela fonctionnera mal et nécessitera beaucoup plus de tenue de livres qu'une table de hachage ou un tableau. Il n'y a aucun avantage dans les pièces à avoir à la fois une touche de hachage X et Y et à former un graphique dirigé.

Comment feriez-vous un accès rapide aux pièces avec uniquement le graphique orienté? Comment feriez-vous la recherche de chemin avec seulement une clé de hachage X, Y? Cela nécessiterait une logique supplémentaire pour déterminer les pièces adjacentes. La clé de hachage est vraiment juste une autre vue du monde du jeu. Je suis d'accord que la manipulation d'un graphique est plus problématique, mais bénéficiera aux algorithmes utilisant le graphique. Les performances dépendent de la taille du monde du jeu. Il faut donc prototyper. Thx pour le vote négatif. À votre santé!
Stephen

Rien dans le pathfinding n'empêche d'utiliser un hachage de paires X, Y. Les états successeurs sont des états successeurs, peu importe si vous maintenez un graphique fou ou que vous le recherchez sur une table de hachage, sauf que la table de hachage est plus rapide et utilise moins de mémoire.

La solution de clé de hachage est moins abstraite. Comme je l'ai écrit auparavant, le pathfinder doit savoir quelles pièces sont adjacentes, comment calculer la distance de la pièce cible, etc. Vous mettriez des connaissances sur le monde du jeu dans votre algorithme de recherche de chemin. Si la configuration du monde du jeu change, par exemple, le mouvement des pièces qui sont en diagonale les unes par rapport aux autres est autorisé ou une troisième dimension est ajoutée, vous devrez changer chaque algorithme accédant au monde du jeu. Les graphiques résument cela. Rien de fou là-dessus. Il y a toujours un inconvénient à chaque solution.
Stephen

1
"Les graphiques résument cela." Il en va de même pour tout itérateur, générateur, coroutine ou méthode de création de liste, et ils ne nécessitent pas de structure O (n) ni de comptabilité lors de la construction.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.