Pour répondre brièvement à votre question principale, les principaux avantages d'un monde de jeu généré de manière procédurale sont les suivants:
Le monde peut être immense , beaucoup plus grand que n'importe quel monde de jeu conçu manuellement.
Le monde (ou au moins des parties de celui-ci) peut être régénéré pour chaque jeu, augmentant potentiellement la valeur de rejeu, car le joueur aura toujours quelque chose de nouveau à découvrir.
Inversement, les principaux inconvénients de la génération procédurale sont les suivants:
Selon les méthodes de génération utilisées, il peut être difficile de s'assurer que le monde est toujours jouable, c'est-à-dire que le joueur ne peut pas rester bloqué sans aucun moyen de procéder simplement parce qu'il est malchanceux avec la génération mondiale.
Même si vous pouvez éviter de générer des mondes complètement illisibles, la génération aléatoire de mondes peut conduire à un niveau de difficulté très variable: parfois, le joueur peut trouver tout ce dont il a besoin juste aligné pour la prise, parfois il peut durer longtemps sans trouver quoi que ce soit d'utile .
Sur de longues périodes, de telles fluctuations aléatoires ont tendance à se résumer en moyenne, mais si la difficulté du jeu est par exemple fortement chargée (typique pour les jeux de survie), un mauvais départ pourrait ruiner un jeu tandis qu'un départ très chanceux pourrait le priver de tout défi.
Une génération procédurale mal faite peut rendre le monde monotone et ennuyeux: après avoir vu une douzaine de labyrinthes générés au hasard, ils commencent tous à se ressembler, même s'ils diffèrent dans les détails.
De plus, si le monde du jeu est complètement régénéré pour chaque jeu, il n'y aura pas de lieux fixes ou de fonctionnalités que le joueur pourrait reconnaître à partir des jeux précédents. Un tel manque de familiarité pourrait rendre plus difficile pour le joueur de s'engager avec le jeu sur le plan émotionnel ou de partager des expériences avec d'autres joueurs.
Il y a aussi une chose que vous pouvez compter dans l'une ou l'autre liste: dans un jeu où le monde est régénéré de manière aléatoire pour chaque jeu, il ne peut pas y avoir de guide de «visite virtuelle», car chaque jeu sera différent.
(Cette non-répétabilité pourrait également être un problème pour les tests et le débogage, bien qu'elle puisse être au moins partiellement évitée en permettant de spécifier la graine RNG, au moins en mode débogage, et / ou en fournissant une commande "cheat" qui peut être utilisée pour avance rapide à différentes étapes.)
Cependant, si vous regardez la liste des inconvénients, vous verrez qu'elle décrit principalement les inconvénients de la génération procédurale pure ; beaucoup d'entre eux peuvent être évités en mélangeant du contenu généré manuellement et procéduralement .
Par exemple, le joueur peut toujours commencer dans une ville fixe, conçue manuellement, peut-être entourée d'une région d'origine plus ou moins fixe, mais des endroits plus éloignés de la ville peuvent être générés de manière aléatoire pour toujours fournir des régions inconnues au joueur.
Il pourrait également y avoir d'autres villes conçues manuellement ou d'autres endroits placés (plus ou moins) au hasard dans le monde, de telle sorte que le joueur devra les trouver, mais saura à quoi s'attendre une fois qu'il y sera. Inversement, des éléments saillants tels que des montagnes pourraient être placés manuellement (au moins à proximité de l'emplacement de départ fixe), mais les détails de leur terrain pourraient être randomisés.
En ce qui concerne le placement aléatoire provoquant des blocages et des variations de difficulté, cela peut être résolu en implémentant diverses vérifications de cohérence et d'équilibre en plus de votre algorithme de génération de monde procédural. Par exemple, si le joueur a besoin d'un élément particulier pour pouvoir traverser l'eau, vous pouvez inclure un code garantissant qu'au moins un tel élément est placé de sorte que le joueur puisse l'atteindre sans traverser l'eau.
De même, vous pouvez également modifier vos règles de placement des objets afin qu'aucune baguette de génialité ne soit placée avant que le joueur n'atteigne le niveau x , et peut-être pour s'assurer qu'au moins une est placée dans un endroit fixe où le joueur peut atteindre avant d'arriver au stade où ils en auront besoin pour survivre.
Soit dit en passant, une façon courante de rendre le contenu procédural et généré manuellement plus ou moins transparente est de démarrer le processus de génération manuelle en utilisant le générateur de monde procédural (peut-être adapté de manière appropriée, par exemple pour générer un village ou un sommet de montagne où vous le souhaitez). ) pour initialiser la région que vous concevez, puis l'ajuster manuellement pour ajouter et ajuster les détails souhaités. (Cela peut également permettre un stockage de niveau très compact, en enregistrant uniquement les modifications manuelles et la valeur de départ du générateur et les paramètres utilisés.)
D'autres façons de combiner le contenu manuel et procédural incluent de laisser des espaces vides dans vos niveaux conçus manuellement, à remplir par du contenu aléatoire (par exemple, un château pourrait inclure un labyrinthe généré aléatoirement dans les donjons, avec seulement le contour et les sorties fixes), ou la conception manuelle pourrait spécifier uniquement les grandes lignes de certaines parties du niveau (par exemple l'emplacement des maisons dans une ville) et laisser les détails (tels que l'apparence exacte de chaque maison) être choisis au hasard.
En fait, même de nombreux jeux dont le monde du jeu est entièrement fixe utilisent une certaine forme de génération procédurale dans le cadre de leur processus de conception de niveaux, car il existe certains aspects de la génération du monde (comme la production d'un terrain d'apparence naturelle ou le placement d'arbres individuels dans une forêt). qui sont difficiles et / ou fastidieux à faire à la main, mais relativement faciles à automatiser.
À l'inverse, la plupart des générateurs de monde procédural utiliseront au moins certains objets et éléments conçus manuellement pour construire le monde à partir de. On pourrait même facilement avoir plusieurs niveaux de génération aléatoire / manuelle imbriquée: par exemple, un monde généré par procédure pourrait inclure une ville générée manuellement entourée de bois générés par procédure avec un contour dessiné manuellement, avec des arbres générés par procédure portant des feuilles conçues manuellement.
Notez également que la génération de contenu procédural n'est pas nécessairement incompatible avec un monde fixe: vous pouvez simplement choisir une graine RNG fixe et l'utiliser pour générer votre monde. Cela peut être utile si vous voulez explorer un monde immense pour les joueurs, mais que vous voulez qu'il reste le même pour chaque jeu et pour chaque joueur.
Notez que si vous faites cela (ou peut-être même si vous ne le faites pas), vous devez vraiment concevoir votre générateur de monde pour qu'il fonctionne de manière hiérarchique, en utilisant plusieurs instances RNG, de sorte que, par exemple, le générateur de carte global conserve une seule instance RNG qu'il utiliserait pour générer des sous-régions, en attribuant à chaque sous-région une valeur d'amorçage différente que le générateur de région utiliserait ensuite pour amorcer une instance RNG distincte qu'il utiliserait pour générer la région, etc. C'est pour éviter "l'effet papillon", où le fait de changer même le moindre détail de la plus petite partie de la carte pourrait désynchroniser le RNG et faire en sorte que tout le reste du monde soit complètement différent.
Un autre moyen important d'éviter l'effet papillon, en particulier si vous générez le monde "à la volée" pendant que le joueur l'explore, est d'éviter complètement les RNG normaux (sauf pour les processus qui se produisent "instantanément" du point de vue du joueur, comme générer un nouveau niveau lorsque le joueur y entre) et utiliser à la place des méthodes de génération de nombres aléatoires qui ne stockent aucun état interne. Par exemple, lors du choix de la graine pour une sous-région que le joueur est sur le point d'entrer, le générateur de monde global pourrait prendre les coordonnées de la sous-région (et sa propre graine globale) et les alimenter à une fonction de hachage pour générer la graine de la sous-région. De cette façon, chaque région sera toujours la même, quel que soit l'ordre dans lequel le joueur y entre.
Ps. Après toute cette digression, permettez-moi de répondre brièvement à votre dernière question sur le code réel utilisé pour la génération procédurale. Hélas, je ne pense pas que ce soit vraiment responsable dans un sens, sans beaucoup plus de détails que vous n'en avez fournis, car il existe littéralement autant de façons différentes de générer un monde procédural que de jeux les utilisant.
Par exemple, l'arrière-grand-papa de tous les jeux d'exploration générés de manière procédurale est probablement Rogue , dont l'algorithme de génération de niveau consistait simplement à placer au hasard un tas de pièces rectangulaires dans un niveau rectangulaire plus grand, et à relier ces pièces à des passages (et à placer un escalier pour le niveau suivant dans l'un d'eux). Ses divers successeurs , de Nethack à la série Diablo , ont élaboré ce système de nombreuses manières, mais la plupart ont conservé l'idée de base de niveaux distincts constitués de salles, de donjons et de labyrinthes placés plus ou moins au hasard sur une carte quadrillée.
À l'inverse, pour les jeux proposant des paramètres extérieurs ouverts, vous voudrez probablement commencer par une sorte d' algorithme de génération de terrain fractal et construire d'autres fonctionnalités (rivières, forêts, villes, etc.) en plus de cela. Ou vous pourriez faire quelque chose comme ce que fait Minecraft , et générer une texture procédurale 3D aléatoire déterminant respectivement les parties de votre paysage qui sont au sol et à l'air (mises à l'échelle et biaisées de sorte que les blocs inférieurs sont plus susceptibles d'être meulés), puis superposez des fonctionnalités comme l'eau , sol / roche, végétation, etc. au-dessus.
Bien sûr, rien de ce qui précède ne s'applique si vous écrivez, par exemple, un jeu d' exploration spatiale , auquel cas vous aurez juste besoin de générer un tas de systèmes stellaires placés au hasard selon une fonction de densité, puis de générer un aléatoire ensemble d'étoiles et de planètes dans chacun d'eux. Ou peut-être que vous incitez vos joueurs à explorer un paysage non euclidien , auquel cas vous serez confronté à un ensemble de défis complètement différents (tels que le fait que le volume dans un rayon donné augmente de façon exponentielle plutôt que polynomiale, ce qui en fait vraiment difficile de garder une grande carte en mémoire).