Génération de donjons procéduraux: existe-t-il un algorithme simple pour s'assurer que toutes ces salles sont connectées en utilisant des couloirs minimaux?

9

Est-il possible d'obtenir une structure en forme de ruche, reliant toutes les pièces sans avoir trop de couloirs? (Trop de 3-4 + couloirs venant d'une seule pièce)

Vous trouverez ci-dessous la sortie de l'apparence de mes pièces, essentiellement placées au hasard.

sortie d'une grille de pièces, placées aléatoirement

Ce que j'espère obtenir dans le couloir.

http://i.imgur.com/9GUi6Yy.png

Blenderer
la source
Je ne pense pas que 3 ou 4 soit "trop ​​de couloirs". Surtout si vous avez 9 chambres dans votre donjon. De plus, je ne suis pas sûr de ce que vous entendez par "structure ressemblant à une ruche", pourriez-vous préciser quel look vous essayez de choisir?
fnord
Peut-être inclure une carte "terminée" pour montrer ce qui vous intéresse.
MichaelHouse
Ah oui, je voulais dire un maximum de 3 ou 4 couloirs venant de chaque chambre.
Blenderer
J'ai ajouté une image de ce vers quoi je travaille en ce qui concerne les couloirs.
Blenderer
2
Si vous n'avez 3 couloirs d'aucune pièce, vous ne pourrez faire qu'une simple jonction linéaire des pièces, et donc simplement en choisir une, et la joindre à ses deux voisins non joints les plus proches.
Nick

Réponses:

6

Eh bien, la façon la plus simple à laquelle je peux penser commence par s'assurer que toutes les pièces sont reliées par au moins 1 couloir:

  1. Commencez par la dernière ou la première pièce.
  2. Prenez une pièce au hasard à moins d'une distance, qui n'est pas déjà connectée à une pièce (toutes les pièces commencent à être déconnectées, vous en garderez la trace au fur et à mesure).
  3. S'il n'y en a pas, allez à la distance +1. Si vous pouvez passer par-dessus / sous une autre pièce, c'est plus facile, en supposant que vous ne voulez pas de couloirs de connexion.
  4. Parcourez votre pseudo-aléatoire jusqu'à ce que toutes les pièces soient connectées.

Nous savons maintenant que vous pouvez accéder à toutes les pièces, mais maintenant, si vous voulez plus que ce labyrinthe strictement linéaire, vous pouvez simplement parcourir vos pièces et créer au hasard un nouveau chemin pour connecter les pièces, jusqu'à une limite par pièce de 2-3, ou jusqu'à ce qu'un certain pourcentage de pièces atteigne le nombre maximal de connexions - etc.

Comme dernière étape, vous pouvez ajouter des règles qui modifieraient vos résultats pour s'adapter à diverses situations. Par exemple, vous pourriez observer que toute pièce avec seulement 1 couloir est, par définition, une impasse; Vous pourriez créer plus d'impasses ou les éliminer toutes en vous assurant que tout a au moins 2 connexions. Vous pourriez faire en sorte que les impasses aient un passage secret. Vous pouvez vous assurer qu'une salle de boss est une impasse. Vous pouvez vous assurer que votre salle de départ est une impasse, mais assurez-vous ensuite que la deuxième salle a un minimum de X connexions.À l'infini.

Chaque hypothèse et règle peut changer radicalement l'apparence de vos niveaux, mais cela fait partie du plaisir! Cela devrait au moins vous permettre de commencer par des pièces ressemblant à des ruches / grottes.

BrianH
la source
Ceci est assez proche de l'algorithme de Spanning Tree Minimum de Kruskal - cela modifie la condition en 2 de "pas déjà connecté à une pièce" à "pas déjà connecté au même cluster " qui corrige un bug dans les règles décrites ci-dessus où vous pourriez avoir un situation où chaque pièce est reliée à une pièce mais le donjon dans son ensemble forme toujours plusieurs îles déconnectées. Kruskal's est assuré de trouver un graphique de connexion avec une longueur totale minimale de couloir.
DMGregory
3

Construisez simplement vos pièces déjà connectées. Commencez avec une pièce, puis construisez 1 à 3 couloirs vers d'autres pièces. Puis récusez jusqu'à ce que vous ayez ajouté suffisamment de pièces.

Nicol Bolas
la source
2

Étant donné que ces pièces sont des sommets de graphes intégrés dans une plaine 2D, cela pourrait en théorie être fait en résolvant le problème du voyageur de commerce (ce qui serait bien avec seulement quelques pièces). De toute évidence, un simple heuristique serait très bien et permettrait une évolutivité raisonnable.

Vous calculez les bords (longueurs de couloir) entre toutes les pièces. Vous les triez par longueur. Vous ajoutez le couloir le plus court à moins qu'il ne crée un cycle ou n'augmente le degré du sommet (pièce) au-dessus de votre valeur maximale souhaitée (3-4) (Répéter). Pour vérifier les cycles, vous pouvez appliquer UnionFind ou effectuer un rapide BFS sur de petites données.

AturSams
la source
Cette réponse est meilleure que la réponse acceptée. Une stratégie gourmande consistant à choisir d'abord les couloirs de connexion les plus courts devrait fonctionner. Pour éviter les cycles, ne connectez pas les pièces qui ont déjà un couloir qui leur est connecté.
Jelle van Campen
@JellevanCampen Merci. ;) Vous pouvez avoir deux composants connectés isolés. Donc, vous voudrez probablement utiliser la recherche d'union ou vérifier avec BFS si les deux nœuds sont connectés.
AturSams
Ah ouais, tu as raison à ce sujet, ma mauvaise.
Jelle van Campen