Je fais un jeu avec un monde généré de manière procédurale créé au début du jeu, composé de plusieurs zones représentées par des grilles (disons, 8x8, 9x6, les tailles seraient idéalement arbitraires). Ces zones sont censées être connectées les unes aux autres via une liste de dépendances.
Une connexion existe lorsqu'au moins 3 espaces de cette grille sont exposés entre ces deux zones. Dans la cellule centrale de cette zone de connexion à 3 espaces se trouve la porte entre les zones:
J'ai essayé de trouver un moyen de les connecter, mais cela devient de plus en plus complexe au fur et à mesure que vous devez prendre en compte plusieurs domaines.
J'ai essayé du prototypage papier et bien que ce soit un processus très simple pour le faire visuellement, je n'ai pas trouvé un bon ensemble d'expressions mathématiques qui me permettent de placer des pièces avec la même efficacité par code.
Voici un exemple "simple" avec lequel je me bats en ce moment:
- La zone «a» doit être connectée à «b» et «c»
- La zone «b» doit être connectée à «a» et «d»
- La zone «c» doit être connectée à «a» et «d»
- La zone «d» doit être connectée à «b» et «c»
Considérez, pour simplifier, nous plaçons les chambres par leur ordre d'apparition sur la liste (j'en ai essayé d'autres). J'approche donc cela comme votre algorithme de génération de donjons procédural standard.
Nous plaçons 'a' n'importe où sur le tableau, car c'est le premier domaine. Ensuite, nous choisissons un mur au hasard et, comme rien n'est connecté à ce mur, nous pouvons y placer «b»:
Maintenant, nous devons placer «c», mais «a» est déjà sur le plateau et a un mur occupé, nous décidons donc de le placer sur un autre mur. Mais tous les emplacements ne feront pas l'affaire, car «d» arrive et il doit également être connecté à «b» et «c»:
J'ai essayé une limitation possible que 2 chambres qui ont le même ensemble de dépendances ne peuvent pas être sur des murs opposés, mais même cela ne garantit pas le succès:
Et dans d'autres cas, lorsque les zones ont des tailles différentes, le fait d'être sur des murs opposés peut fonctionner:
De plus, ne pas considérer un mur utilisé est une hypothèse erronée car elle exclut les solutions valides:
J'ai essayé de chercher des recherches sur d'autres algorithmes de génération procédurale ou similaires, tels que les algorithmes d'optimisation de rectangle et de mise en page graphique, mais généralement ces algorithmes ne prennent pas en compte toutes les contraintes de ce problème et sont difficiles à mélanger.
J'ai pensé à un tas d'approches, y compris le placement d'une zone et la marche arrière jusqu'à ce qu'un placement approprié soit trouvé, mais elles semblent très dépendantes des essais et des erreurs et coûteuses en termes de calcul. Mais, compte tenu des recherches approfondies sur les deux derniers problèmes que j'ai mentionnés, ce pourrait être la seule / meilleure solution?
Je voulais juste voir si quelqu'un avait eu des problèmes similaires dans le passé ou s'il était prêt à m'aider à comprendre cela et à me donner quelques conseils sur la façon de commencer avec l'algorithme. Ou, à défaut, je devrai envisager de desserrer les contraintes que j'ai définies.