Créer un générateur de donjons

Un donjon procédural ne se résume pas à placer quelques salles au hasard. Il faut créer une structure complète, relier les différentes zones, préserver des passages praticables et identifier les pièces pour pouvoir ensuite y placer des portes, des objets ou des adversaires. Cette ressource construit le donjon en plusieurs étapes : un réseau de couloirs est d’abord creusé, puis des salles viennent se superposer à cette structure.

Génération procédurale

Générateur de donjons

Un réseau de couloirs est creusé par retour arrière, puis des salles, des portes, une entrée et une sortie sont ajoutées.

Salles 0 Portes 0 Étape 0/3
Mur Couloir Salle Porte Entrée Sortie

Cliquer sur la carte génère immédiatement un nouveau donjon complet.


Télécharger la ressource

Le besoin : générer un niveau structuré et entièrement praticable

Dans un jeu d’exploration, un donjon doit offrir des espaces variés tout en restant compréhensible. Les couloirs organisent la circulation, les salles créent des zones de respiration et les portes marquent les transitions. Une génération purement aléatoire produit facilement des pièces isolées, des chevauchements incohérents ou des zones impossibles à atteindre. L’algorithme doit donc imposer une ossature avant d’ajouter les volumes.

La méthode choisie commence par créer un labyrinthe à pas réguliers. Ce labyrinthe garantit qu’un réseau continu traverse la carte. Des salles rectangulaires sont ensuite ajoutées par-dessus, puis les tuiles sont analysées pour conserver les couloirs utiles, ouvrir les angles et poser les portes aux endroits où une salle rencontre le réseau.

Construire d’abord une ossature de couloirs

La carte est initialement remplie de murs. Le générateur part de l’entrée et avance par pas de trois cellules dans l’une des quatre directions cardinales. Lorsqu’une direction encore inutilisée est disponible, les cellules intermédiaires sont creusées afin de former un passage continu. La position atteinte est mémorisée dans une pile.

Lorsqu’aucune direction n’est possible, le générateur revient à une ancienne position grâce à cette pile et cherche un autre embranchement. Ce principe de retour arrière permet de parcourir progressivement la grille sans perdre la continuité du réseau. Le résultat forme une base proche d’un labyrinthe, mais suffisamment espacée pour accueillir ensuite de grandes pièces.

Découper la carte en cellules de construction

La grille de 48 × 48 cellules est divisée en blocs de 8 × 8. Chaque bloc reçoit une salle rectangulaire dont la largeur et la hauteur sont choisies aléatoirement. Une salle peut donc occuper une petite partie du bloc ou s’étendre presque jusqu’à ses limites. Cette organisation répartit les pièces sur l’ensemble de la carte.

Chaque salle reçoit également un identifiant unique. Cet identifiant est conservé dans une grille séparée. Il permet de savoir à quelle pièce appartient une cellule et devient utile au moment de poser les portes ou de placer plus tard des éléments spécifiques dans chaque salle.

Superposer les salles au réseau existant

Une fois les salles créées, leurs cellules sont reportées dans la grille principale. Les couloirs déjà creusés ne disparaissent pas : ils traversent ou rejoignent les nouvelles pièces. La carte contient alors trois familles de cellules : les murs, les couloirs et les salles.

Cette superposition produit volontairement quelques irrégularités. Certaines cellules se retrouvent entourées de plusieurs passages, d’autres forment des angles ou des croisements. Une seconde analyse locale est donc nécessaire pour déterminer la forme finale de chaque tuile.

Analyser les voisins directs et diagonaux

Pour chaque cellule praticable, le générateur examine les quatre directions cardinales ainsi que les quatre diagonales. Il compte le nombre de côtés ouverts, la quantité de diagonales occupées et la présence éventuelle d’un angle complètement dégagé. Ces informations permettent de distinguer un couloir droit, une intersection, une extrémité ou une zone appartenant à une salle.

Cette étape ne déplace aucune pièce. Elle interprète simplement la structure déjà créée. Les couloirs qui ne mènent nulle part peuvent être fermés, tandis que les cellules placées au contact d’une salle sont conservées ou transformées en portes.

Placer les portes entre couloirs et pièces

Une porte apparaît lorsqu’une cellule de couloir touche directement une cellule de salle. La tuile de passage est alors marquée comme porte et reçoit l’identifiant de la pièce voisine. Cette association permet de savoir immédiatement vers quelle salle mène chaque ouverture.

Dans un jeu, cet identifiant peut servir à verrouiller une salle, déclencher un événement, compter ses entrées ou rattacher des objets à une zone précise. La porte devient donc un point de connexion entre le réseau général et la logique propre à chaque pièce.

Conserver une entrée et une sortie identifiables

L’entrée est placée près du coin supérieur gauche et sert de point de départ au creusement des couloirs. La sortie est positionnée à l’opposé de la carte. Ces deux emplacements sont ensuite rendus avec des tuiles distinctes afin qu’ils restent immédiatement visibles.

Cette organisation donne une direction générale au niveau sans imposer un chemin unique. Le joueur peut traverser plusieurs salles, suivre des embranchements et revenir sur ses pas, mais la structure globale conserve deux repères stables.

Séparer les données du rendu Canvas

Le donjon utilise plusieurs tableaux complémentaires. La grille principale contient le type final de chaque cellule. Une seconde grille mémorise l’identifiant des pièces et une troisième conserve les objets associés aux portes. Le Canvas ne fait qu’interpréter ces valeurs pour afficher les murs, les couloirs, les salles, les portes, l’entrée et la sortie.

Cette séparation permet de remplacer facilement les couleurs par des sprites, une carte de tuiles ou un système de collisions. Le même donjon peut aussi être exporté, analysé ou utilisé sans affichage graphique.

Observer la génération étape par étape

La démonstration permet d’afficher uniquement le labyrinthe, d’ajouter ensuite les salles, puis de finaliser les portes et les identifiants. Cette progression rend visible le rôle de chaque couche. On comprend ainsi que les salles ne remplacent pas le labyrinthe : elles s’appuient sur lui pour rester connectées au reste du niveau.

Un bouton de génération complète construit immédiatement un nouveau donjon. La taille reste volontairement fixée à 48 × 48 afin de conserver la logique de l’algorithme, tandis que la graine permet de reproduire une même configuration.

Une base à enrichir pour un jeu

Une fois le plan généré, chaque salle peut recevoir un rôle : départ, sortie, trésor, combat, énigme ou repos. Les identifiants facilitent le placement d’objets sans mélanger plusieurs pièces. Les couloirs peuvent accueillir des pièges, tandis que les portes peuvent devenir verrouillées ou déclencher une transition.

La ressource fournit une base volontairement claire et commentée. Elle montre comment combiner plusieurs techniques simples — labyrinthe, découpage spatial, analyse de voisinage et identification des pièces — pour produire un donjon procédural cohérent et directement exploitable dans un jeu JavaScript.

À lire également

Remonter en haut de page
Gérer les cookies