Espace de génération et espace d'opportunité

Dans ce tutoriel, je vais parler de deux termes que j'utilise pour décrire les générateurs procéduraux: un espace génératif et un espace de possibilité . Nous définirons ces deux termes et considérerons ensuite des exemples interactifs pour comprendre la différence entre eux. Ces termes sont vraiment utiles pour décrire un générateur procédural et pour comprendre la différence entre deux générateurs. Commençons!


Imaginez un énorme livre qui fournit une capture d'écran de chaque monde Minecraft individuel. Chaque capture d'écran est marquée d'une graine aléatoire , un numéro unique que vous pouvez entrer dans Minecraft et générer ce monde. La premiÚre page montre le monde généré à partir de seed = 0, la page suivante montre le monde à partir de seed = 1, etc. En général, le générateur de monde Minecraft contient 2 64 valeurs de génération aléatoires, et c'est un nombre énorme: le jeu peut générer 18 446 744 073 709 551 616 mondes. Chaque fois que vous cliquez sur «Nouveau monde», un monde est créé à partir de l'une de ces graines. Le nombre 2 64 est la taille de l'espace de génération Minecraft, beaucoup de tout ce que le jeu peut générer.


Imaginez maintenant que le monde Minecraft se compose uniquement d'herbe ordinaire, se rĂ©pandant sans fin dans toutes les directions. En dessous, il n'y a pas de grottes, pas de pierre, pas d'arbres et de collines, pas d'animaux. Une seule couche de tuiles d'herbe. En plus d'ĂȘtre trĂšs ennuyeux, un tel monde ne sera jamais gĂ©nĂ©rĂ© dans Minecraft (sauf si le modding est utilisĂ©). Nous pouvons l'imaginer, nous pouvons le dĂ©crire, mĂȘme ouvrir Minecraft et le crĂ©er nous-mĂȘmes manuellement - mais Minecraft ne peut pas le gĂ©nĂ©rer. Comment le savons-nous? Vous pouvez le prouver de diffĂ©rentes maniĂšres, mais la façon la plus simple de se souvenir des biomes de Minecraft est dans des zones telles que le dĂ©sert ou la jungle dispersĂ©es Ă  travers le monde. Dans notre exemple avec le monde de l'herbe, ils ne sont pas, donc, nous savons qu'il ne peut pas ĂȘtre créé avec un gĂ©nĂ©rateur standard.

Le monde de l'herbe se trouve dans ce que nous appelons l' espace des opportunitĂ©s des mondes Minecraft - l'ensemble de tous les mondes Minecraft possibles que nous pouvons imaginer, imaginer ou dĂ©crire. Mais le monde de l'herbe n'est pas dans l' espace de gĂ©nĂ©ration Minecraft, car il ne peut pas ĂȘtre créé par le gĂ©nĂ©rateur procĂ©dural du jeu. Nous pouvons imaginer le monde Minecraft avec une rĂ©plique exacte de PersĂ©polis Ă  l'Ă©chelle, ou le monde sous la forme de votre sculpture en pierre assis et lisant cet article - ce sont tous des mondes Minecraft possibles , mais ils ne seront pas gĂ©nĂ©rĂ©s par le jeu.


Le diagramme ci-dessus nous donne une idĂ©e de ce Ă  quoi tout cela ressemble. Tout ce qui se trouve dans l'espace de gĂ©nĂ©ration de Minecraft doit Ă©galement ĂȘtre dans son espace de possibilitĂ©s, car si Minecraft peut gĂ©nĂ©rer quelque chose, il devrait ĂȘtre possible de le crĂ©er dans Minecraft! Mais tout l'espace des possibilitĂ©s n'est pas dans l'espace de gĂ©nĂ©ration, y compris notre exemple avec un monde composĂ© d'herbe. Mais l'Ă©chelle n'est pas respectĂ©e dans ce schĂ©ma. En fait, l'espace des possibilitĂ©s de Minecraft est beaucoup, beaucoup plus grand que son espace de gĂ©nĂ©ration.

Pour comprendre sa taille, calculons la taille d'un seul monde Minecraft. Le volume est la largeur multipliée par la hauteur, multipliée par la profondeur. Par défaut, les mondes Minecraft ont une hauteur de 256 tuiles, et ils commencent à se diviser en environ 30 000 000 de tuiles dans toutes les directions à partir du point de départ, c'est-à-dire que le volume approximatif du monde est:

256 x 60 000 000 x 60 000 000 = 921 600 000 000 000 000

Chacun de ces blocs peut ĂȘtre n'importe quel Ă©lĂ©ment: pierre, herbe, eau, air. Pour notre Ă©valuation, nous serons gĂ©nĂ©reux et n'utiliserons que des "blocs du monde", qui, selon le wiki Minecraft, sont de 64 types . Cela signifie que chaque bloc dans le monde Minecraft a 64 Ă©tats possibles. La formule de calcul du nombre de mondes possibles est Ă©gale au nombre d'options d'Ă©tat pour chaque bloc Ă©levĂ© Ă  la puissance du nombre de blocs:

64 921 600 000 000 000 000 Minecraft

Ce nombre est si grand que je n'ai pas pu trouver sur Internet une calculatrice capable de le calculer.


Pour aller encore plus loin dans les espaces de gĂ©nĂ©ration et de possibilitĂ©s, nous avons besoin d'un exemple que nous pourrions mieux mettre en tĂȘte. Par consĂ©quent, dans le reste du tutoriel, nous examinerons les niveaux d'un jeu de plateforme 2D pour des jeux comme Super Mario Bros. ou Spelunky . Nous examinerons plusieurs gĂ©nĂ©rateurs de niveaux pour les plateformes 2D. Dans l'article d'origine, ils sont tous interactifs, vous pouvez donc gĂ©nĂ©rer vos propres niveaux. Au cours de leur Ă©tude, nous poserons des questions sur leur espace de gĂ©nĂ©ration. Tous les exemples sont disponibles sur notre GitHub sous forme d'esquisse open source Ă©crite dans Processing .

En cours d'étude, je vais poser des questions en gras, par exemple: quelle est la taille de l'espace d'opportunités pour ces niveaux de plateforme? Vous pouvez les ignorer en toute sécurité si vous voulez simplement lire l'article et jouer avec des exemples. J'ajoute parfois des conseils pour répondre aux questions, par exemple:

Astuce: les niveaux ont une largeur de 40 tuiles et une hauteur de 10 tuiles, et chaque tuile peut ĂȘtre l'un des trois Ă©lĂ©ments: un vide, un sol ou un bloc bonus.

Vous pouvez faire une pause Ă  l'invite et ne pas faire dĂ©filer la page si vous ne voulez pas lire la rĂ©ponse finale. Jetons donc un Ɠil Ă  notre premier gĂ©nĂ©rateur.

Algorithme 1: aléatoire


Notre gĂ©nĂ©rateur de premier niveau est trĂšs simple - il est complĂštement alĂ©atoire. Chaque carte a une tuile dĂ©part gauche et une tuile sortie droite. Toutes les autres tuiles de carte ont 33% de chances d'ĂȘtre vides, 33% d'ĂȘtre occupĂ©es et 33% d'ĂȘtre un bloc bonus.


Vous avez probablement remarquĂ© que ce n'est pas un trĂšs bon gĂ©nĂ©rateur de niveau. En fait, la plupart de ces niveaux sont mĂȘme impossibles Ă  jouer, sans parler de leur intĂ©rĂȘt. GĂ©nĂ©rez quelques niveaux supplĂ©mentaires et rĂ©flĂ©chissez Ă  la question: quelle est la taille de l'espace de gĂ©nĂ©ration d'un tel gĂ©nĂ©rateur par rapport Ă  l'espace des possibilitĂ©s?

Astuce: pouvez-vous trouver un niveau qui soit dans l'espace des possibilités, mais pas dans l'espace de la génération? Pouvez-vous trouver un niveau que ce générateur ne peut pas créer?

La bonne rĂ©ponse est que l'espace de gĂ©nĂ©ration de ce gĂ©nĂ©rateur est le mĂȘme que l'espace des possibilitĂ©s. N'importe quelle tuile sur la carte peut prendre n'importe quelle valeur, donc tout niveau que nous pouvons imaginer se trouve dans l'espace de gĂ©nĂ©ration. Les niveaux les plus fascinants et les plus intĂ©ressants se trouvent dans cet espace de gĂ©nĂ©ration, mĂȘme la carte sur laquelle SUPER MARIO EST IMPRESSIONNANT est Ă©crite en blocs bonus. Malheureusement, l'espace de gĂ©nĂ©ration est si grand qu'il est extrĂȘmement peu probable de trouver un bon niveau. Comme vous pouvez le voir en cliquant sur le gĂ©nĂ©rateur, la plupart des niveaux ne sont que des ordures.

Algorithme 2: dessiner des formes aléatoires


Notre prochain algorithme est un peu plus compliquĂ©, et il crĂ©e des niveaux qui ressemblent davantage Ă  ce que vous pouvez appliquer dans le jeu. À partir d'un niveau vide, il sĂ©lectionne un point alĂ©atoire quelque part, puis trace une ligne ou un carrĂ© de blocs de bonus ou de terrain. Il effectue cette opĂ©ration 20 fois, crĂ©ant plusieurs formes tirĂ©es au hasard sur le niveau. Comme prĂ©cĂ©demment, vous pouvez cliquer sur l'exemple de l'article d'origine pour redĂ©marrer l'algorithme et gĂ©nĂ©rer un nouveau niveau.


Cela commence déjà à ressembler à un niveau pour le jeu de plateforme, non? Lorsque vous générez des niveaux, imaginez mentalement comment vous les jouez (soyez généreux si nécessaire - ajoutez la capacité de double saut, si nécessaire, ou la capacité de sauter en dehors du plafond de la carte).

Combien de niveaux doivent ĂȘtre gĂ©nĂ©rĂ©s avant d'en trouver au moins un que vous pouvez traverser?

Ne vous efforcez pas d'obtenir une précision absolue dans vos procédures mentales, faites simplement une estimation approximative.

Lorsque je fais cet exercice avec le public, il faut gĂ©nĂ©ralement environ 10 tentatives pour trouver le niveau en moyenne. De combien aviez-vous besoin? Rappelez-vous ce nombre et regardez maintenant la variation du mĂȘme gĂ©nĂ©rateur illustrĂ© ci-dessous. Le gĂ©nĂ©rateur est le mĂȘme que nous venons de voir, mais maintenant il dessine au niveau non pas 20, mais 10 chiffres. Maintenant, comptez encore: combien de niveaux devez-vous gĂ©nĂ©rer avant de trouver celui que vous pouvez traverser?


Il vous a probablement fallu moins de temps pour trouver un niveau jouable. ArrĂȘtons-nous une minute et rĂ©flĂ©chissons aux diffĂ©rences entre les deux gĂ©nĂ©rateurs, qui sont presque identiques, Ă  l'exception d'une lĂ©gĂšre diffĂ©rence de paramĂštres. Quel gĂ©nĂ©rateur a un plus grand espace de gĂ©nĂ©ration - un gĂ©nĂ©rateur Ă  20 chiffres ou Ă  10?

Astuce: pensez au niveau créé par un générateur à 10 chiffres - un générateur à 20 chiffres peut-il le créer? Et puis pensez à l'exemple inverse.

La bonne rĂ©ponse est qu'un gĂ©nĂ©rateur Ă  20 chiffres a un plus grand espace de gĂ©nĂ©ration; en fait, il contient tout l'espace de gĂ©nĂ©ration du gĂ©nĂ©rateur Ă  10 chiffres. Pour le montrer, imaginez n'importe quel niveau d'un gĂ©nĂ©rateur Ă  10 chiffres. Notre gĂ©nĂ©rateur Ă  20 chiffres peut le crĂ©er en rendant accidentellement les mĂȘmes dix chiffres, puis en les dessinant accidentellement une deuxiĂšme fois les uns sur les autres. Cependant, aucun niveau Ă  vingt chiffres sĂ©parĂ©s ne peut ĂȘtre tracĂ© Ă  l'aide d'un gĂ©nĂ©rateur Ă  10 chiffres.

Cela signifie que le gĂ©nĂ©rateur Ă  20 chiffres a plus de niveaux, y compris des niveaux intĂ©ressants. Mais il convient de rappeler qu'il Ă©tait beaucoup plus facile de trouver un niveau jouable avec un gĂ©nĂ©rateur Ă  10 chiffres. Si vous deviez choisir un gĂ©nĂ©rateur pour votre jeu vidĂ©o, lequel utiliseriez-vous? Il n'y a pas de rĂ©ponses correctes, mais c'est une dĂ©cision trĂšs importante, qui doit souvent ĂȘtre prise lorsque l'on travaille avec des gĂ©nĂ©rateurs procĂ©duraux. Un gĂ©nĂ©rateur peut gĂ©nĂ©rer plus de variabilitĂ© et a plus de surprises, l'autre est plus fiable et moins stressant pour le joueur.

Algorithme 3: Fragments de niveau


Cet algorithme est basé sur le générateur de niveau utilisé dans Spelunky; Vous pouvez en lire plus ici . Le générateur de niveau sélectionne au hasard un fragment d'un niveau créé par une personne (moi) et l'insÚre dans un niveau. Il sélectionne ensuite un autre fragment aléatoire du niveau et l'insÚre cÎte à cÎte, et ainsi de suite, jusqu'à ce que le niveau soit terminé. Voici le générateur, le fond est assombri pour que les bordures des fragments soient clairement visibles:


Combien de temps faut-il maintenant pour gĂ©nĂ©rer un niveau jouable? Vous constaterez que presque tous les niveaux sont jouables. Nous savons exactement ce qu'il y a dans chaque fragment, c'est-Ă -dire que nous pouvons garantir qu'il y aura des objets intĂ©ressants au niveau sur lesquels vous pourrez sauter et des obstacles que vous devrez Ă©viter. En mĂȘme temps, il est plus dynamique que le niveau statique - nous ne savons pas quels fragments y apparaĂźtront et dans quel ordre. L'algorithme Spelunky est encore plus riche que cela, il prend en compte le mouvement vertical et des variations alĂ©atoires sont ajoutĂ©es Ă  chaque fragment. Darius Casemi a créé le gĂ©nial gĂ©nĂ©rateur de niveau interactif Spelunky, que vous pouvez trouver ici .

De tels gĂ©nĂ©rateurs sont un bon compromis entre d'agrĂ©ables surprises et la capacitĂ© de contrĂŽle. Lorsqu'un gĂ©nĂ©rateur effectue une sĂ©lection Ă  partir d'un catalogue d'Ă©lĂ©ments et les connecte entre eux (parfois selon des rĂšgles spĂ©ciales, comme dans Spelunky), nous l'appelons un gĂ©nĂ©rateur basĂ© sur la grammaire . La grammaire nous permet de dĂ©cider quels blocs de construction un gĂ©nĂ©rateur procĂ©dural doit utiliser, mais moins rigoureux sur la façon de les connecter. Mais ce contrĂŽle et cette sĂ©curitĂ© ont un prix. Examinez Ă  nouveau le gĂ©nĂ©rateur, puis rĂ©flĂ©chissez aux exemples prĂ©cĂ©dents. À quelle frĂ©quence un tel gĂ©nĂ©rateur de niveau nous surprendra-t-il?

Au dĂ©part, le gĂ©nĂ©rateur est plein de surprises, car nous rencontrons chaque fragment pour la premiĂšre fois. Mais si vous jouez plus, vous commencez rapidement Ă  remarquer oĂč se termine l'un et oĂč commence un autre fragment. MĂȘme s'il y a des centaines de combinaisons de fragments dans ce gĂ©nĂ©rateur, en quelques niveaux vous commencez Ă  vous sentir comme si vous les aviez tous vus. La simplicitĂ© et la facilitĂ© de comprĂ©hension de la grammaire des fragments sont excellentes pour les dĂ©veloppeurs, mais elles peuvent ĂȘtre un inconvĂ©nient en termes de plaisir pour les joueurs.

Algorithme 4: Conception humaine


Comme dernier exemple, nous ne considérerons pas un algorithme, mais un type de processus créatif trÚs différent: le travail des personnes en level design. Cliquez sur le générateur dans l'article original et vous obtiendrez l'un des deux premiers niveaux de Super Mario Bros. (plus précisément, leur tout début).


En commençant par une coĂŻncidence absolue, nous nous sommes retrouvĂ©s avec cela, l'un des exemples les plus cĂ©lĂšbres de conception de plateformes 2D dans l'histoire. Bien sĂ»r, ce n'est pas un gĂ©nĂ©rateur, mais dans un sens, ces niveaux peuvent ĂȘtre perçus comme des gĂ©nĂ©rateurs qui ne crĂ©ent qu'un seul niveau de haute qualitĂ©. Le compromis maximum entre contrĂŽle et qualitĂ©. En regardant ce niveau, pensez Ă  tous les gĂ©nĂ©rateurs que nous avons examinĂ©s aujourd'hui et rĂ©flĂ©chissez Ă  la question: lequel de ces gĂ©nĂ©rateurs contient ces fameux niveaux dans leur espace de gĂ©nĂ©ration? .

  • GĂ©nĂ©ration alĂ©atoire
  • GĂ©nĂ©ration de 20 formes
  • GĂ©nĂ©ration de 10 formes
  • Fragments de niveau

Seul le premier générateur est capable de créer de tels niveaux. Les générateurs de formes pourraient les créer si nous augmentions le nombre de formes possibles à dessiner, mais cela augmenterait également considérablement le nombre de niveaux mauvais ou étranges. Un générateur de fragments de niveau pourrait le faire si nous lui donnions un ensemble différent de fragments, mais toutes les autres combinaisons de ces fragments seraient-elles jouables?

Cela nous montre combien il est difficile de crĂ©er un gĂ©nĂ©rateur procĂ©dural. Nous voulons considĂ©rer nos gĂ©nĂ©rateurs comme le contenu habituel du jeu, imaginer comment le joueur passe par un certain niveau et l'apprĂ©cie. Mais en tant que concepteurs de gĂ©nĂ©ration, nous devons penser Ă  tout l'espace de gĂ©nĂ©ration, et pas seulement Ă  un seul exemple de celui-ci. Quelle est la taille de l'espace? Quelle est sa richesse en surprises? À quelle frĂ©quence cela crĂ©e-t-il quelque chose d'ennuyeux ou de mauvais? Pouvons-nous dĂ©tecter et filtrer ces cas, ou devons-nous rechercher une solution? Ce ne sont que quelques-uns des problĂšmes que vous devez prendre en compte lors de la crĂ©ation de quelque chose pour la gĂ©nĂ©ration.


Pour résumer


Aujourd'hui, nous avons découvert les concepts suivants:

Espace de génération


L'espace de génération du générateur de contenu procédural (par exemple, le générateur de monde Minecraft) est l'ensemble de tous les résultats qu'il peut générer. Si nous changeons l'algorithme ou définissons une valeur différente pour la variable, l'espace de génération changera.

Espace d'opportunité


L'espace des possibilités pour un certain type de contenu (par exemple, le monde Minecraft) est l'ensemble de tous les exemples d'un tel contenu que nous pouvons présenter ou décrire. Habituellement, mais pas toujours, il est beaucoup plus grand que l'espace de génération d'un générateur procédural.

Plus n'est pas toujours mieux


Un générateur avec un grand espace de génération a généralement plus de bon contenu, un contenu plus inattendu et un contenu plus diversifié. Mais généralement, il a plus de contenu indésirable, plus de contenu ennuyeux et plus de contenu inapproprié.

Un générateur avec moins d'espace de génération est plus facile à contrÎler, plus facile à tester et plus facile à comprendre. Mais cela peut le rendre plus prévisible et moins surprenant.

Trouver des moyens d'équilibrer les forces et les faiblesses de ces deux opposés est l'art de créer des logiciels de génération!

Lecture supplémentaire et remerciements


Ceci conclut mon tutoriel! Merci d'avoir lu.

Parmi les documents intéressants sur le sujet que nous avons examiné, je recommande ce qui suit:

Source: https://habr.com/ru/post/fr439968/


All Articles