Problème à résoudre: Générez une carte de donjon 2D aléatoire pour un jeu basé sur des tuiles où toutes les pièces sont connectées.
Je recherche de meilleures solutions que celles que j'ai actuellement.
Ma solution actuelle consiste à exécuter deux algorithmes. Le premier génère le donjon avec ses chambres. Les seconds s'assurent que toutes les pièces sont connectées. Je suis curieux de savoir quelles autres solutions peuvent exister. Plus rapide et / ou plus facile, etc. La vitesse n'est pas vraiment un problème, mais si la vitesse peut être gagnée sans réel coût, eh bien, c'est une bonne chose. Le plus important est que moi, et d'autres qui lisons, apprenions différentes façons d'aborder et de résoudre le problème.
Voici ma mise en œuvre actuelle. Les chambres n'ont actuellement aucune sortie ou sortie dans 2, 3 ou 4 directions.
Génération des salles de donjon
Configuration: définissez la pièce actuelle sur la pièce en haut à gauche.
- Obtenez un type de chambre valide pour la chambre (où le type de chambre valide est un type sans sortie du donjon et dont les sorties correspondent aux sorties de la salle au-dessus et de la salle à gauche. Il suffit de vérifier ci-dessus et vers le gauche en raison de l'étape 2 ci-dessous).
- Baissez la pièce et avancez d'un pas la coordonnée x. Si la coordonnée x dépasse la largeur du donjon, définissez la coordonnée x sur 0 et avancez la coordonnée y d'un pas. Si la coordonnée y dépasse la hauteur du donjon, nous avons terminé.
- Répétez à partir de # 1.
Je vérifie ensuite si toutes les pièces sont connectées.Si elles ne sont pas toutes connectées, je lance un deuxième algorithme qui, d'une manière non sexy mais certainement assez bonne en termes de disposition de donjon, parcourt les pièces et les change pour que tout finisse jusqu'à être connecté.
Vérification pour voir si toutes les chambres sont connectées
Configuration: créez une carte 2D d'entiers représentant des chemins et initialisez les entrées à une valeur "non traitée" (pas encore traversée), -1. Définissez un entier d'index de chemin de départ qui garde la trace du chemin actuel sur 1. Définissez la pièce actuelle dans la pièce en haut à gauche en l'ajoutant à une pile de pièces à vérifier.
- Si la pile contient des pièces à vérifier, ouvrez-la pour définir l'index de chemin de la pièce sur l'index de chemin actuel. Si la pile ne contient aucune pièce, augmentez l'index du chemin et essayez d'obtenir une pièce en avançant colonne par colonne, ligne par ligne, jusqu'à ce que nous obtenions une pièce qui n'a pas encore été traitée. Si aucune pièce ne peut être trouvée, nous avons terminé.
- Vérifiez si la pièce a une sortie à gauche. S'il a ajouté la pièce de gauche à la pile si elle n'y est pas déjà.
- Répétez l'étape 2 pour les directions vers le bas, la droite et le haut (puisque nous utilisons une pile qui signifie que les pièces sont traversées dans le sens des aiguilles d'une montre, en commençant par la direction du haut).
- Répétez à partir de l'étape 1.
- Si le nombre d'indices de chemin est supérieur à un, il y a des salles déconnectées.
S'il y a des pièces déconnectées, je regroupe les pièces par leur indice de chemin, récupère l'index du plus grand chemin et connecte toutes les autres pièces à ces pièces. Il s'agit d'un travail en cours, mais mon plan (actuel, "brutal") consiste à parcourir chaque pièce d'un groupe de pièces (sauf la première) pour vérifier s'il y a un chemin horizontal ou vertical vers le groupe de pièces biggeset, et si c'est le cas, créez-y un chemin horizontal / vertical en injectant / mettant à jour les pièces entre elles. Rincez et répétez. Moche, oui, mais c'est quelque chose qui ne sera pas perceptible en termes de modèle visuel, donc cela fonctionne dans ce sens.