web-dev-qa-db-fra.com

Algorithme de génération de carte de tuiles 2D aléatoire

Quelqu'un peut-il me dire un moyen de générer des structures d'îles ou des structures de collines comme dans Minecraft?

Je cherche juste une THÉORIE appropriée pour cette génération de formes aléatoires, mais elle devrait garder un motif de base défini.

comme: les îles devraient être arrondies mais varier en forme et en échelle (largeur et hauteur min/max).

ou: les rivières ne doivent pas être des lignes droites, elles doivent avoir des courbes et une largeur aléatoire.

ou même: générer une sorte de forêt, où les arbres sont placés de manière à ce que l'utilisateur puisse toujours marcher à travers la forêt (c'est simple je pense, dites simplement que certains blocs autour d'un arbre doivent rester vides, si le code essaie de mettre plus d'arbres autour du dernier)

Quel genre de mathématiques puis-je utiliser pour faire de telles choses?

Je serais heureux de quelques liens pour des tutoriels ou des références. J'ai fait des recherches sur le Web pendant des heures, mais tout ce que j'ai pu trouver était des livres à acheter, comme "Mathématiques de jeu" ou quelque chose, mais mon budget est fixé à zéro.

ÉDITER:

Tout d'abord, je suis désolé pour mon mauvais anglais.

Secondaire, je tiens à vous remercier tous pour vos réponses. Ce sont d'excellentes références et je vais consacrer beaucoup de temps à approfondir cela.

22
Ace

Je vous recommande vivement de consulter Amit’s Game Programming Information et les autres articles de blog de lui. Il avait toute une série sur la création de cartes réalistes avec des rivières, des côtes, etc.

Construire des mondes

Bien que la génération de cartes procédurales puisse être appliquée à des mondes sans grille, elle est le plus souvent utilisée avec des grilles. Vues à un seul moment, les cartes de jeu générées sont rarement aussi agréables que les mondes fabriqués à la main. Cependant, ils ont trois avantages: (1) un coût par monde inférieur s'il y a beaucoup de mondes à créer, (2) plus de valeur de rejeu parce que la prochaine fois à travers le monde est différent, et (3) le potentiel du monde évoluant tandis que le le jeu progresse.

  • Générateur de cartes du monde d'Amit
  • Génération de contenu procédural: génération de terrain, de villes, de bâtiments
  • Génération de donjons dans Unangband
  • Génération de mondes de jeu avec une structure verrouillable afin que certaines pièces nécessitent des objets d'autres pièces
  • Algorithme de construction de rivières
  • Ajout de rivières à un terrain généré aléatoirement
  • L'algorithme Rogue original pour générer des donjons
  • 11 algorithmes de génération de labyrinthe avec des démos et du code
  • Utilisation de fonctions de bruit pour générer des cavernes telles que celles de Terraria et Minecraft
  • Pièces de forme irrégulière, algorithme simple
  • Régions de pièce intérieure redimensionnables
  • Algorithme de tunnelier pour creuser des donjons dans DungeonMaker
  • Guide des techniques de génération de terrain aléatoire
  • Guide wiki pour la génération de contenu procédural
  • Simuler de grands mondes virtuels

Amit's Génération de cartes polygonales pour les jeux (premier élément de la liste) est un article extrêmement impressionnant qui parle de la logique de génération de sens côtes façonnées, îles, rivières, montagnes, etc. Travail extrêmement impressionnant!

Une méthode de "croissance" des rivières dans un monde généré de façon aléatoire [inclus dans la liste ci-dessus] algorithme assez simple pour générer une rivière chemin basé sur les autres "tuiles" de la carte, par exemple leur type et leur élévation.

32
Ray Hayes

J'ai trouvé une fois un excellent site pour la théorie quand j'ai fait un roguelike. Jetez un oeil .

3
Mizipzor

Assez souvent, les cartes sont logiquement divisées en couches/superpositions comme la "hauteur du terrain de base", le "niveau de l'eau", les "hautes terres", les "arbres", le "logement", etc.

Ensuite, pour chaque couche, un générateur différent est exécuté. Très souvent, les fractales sont utilisées car elles ont tendance à générer des formes intéressantes et difficiles à prévoir. Mais seule une partie de la fractale est utilisée. Utiliser un ensemble exposerait instantanément la structure (les fractales de niveau supérieur sont très répétitives) et les téléspectateurs le remarqueraient. Ainsi, la fractale générée est ensuite déformée/modifiée/filtrée/coupée de sorte que ce ne sera pas évident. Par exemple, vous pouvez générer le niveau de terrain de base avec un simple oscillateur trigonométrique XY, puis le résumer avec une partie de votre image fractale, limitée à certaines valeurs min-max, et vous obtiendrez un terrain inégal avec des collines et des chutes notables ..

Pour toutes les autres couches, vous ne pouvez généralement pas "résumer", car les couches autres que le terrain ne concernent pas la "hauteur" ou la "densité" mais plutôt 0/1 - placer l'arbre ici ou ne pas placer l'arbre ici? Mais encore une fois, vous le faites de la même manière: vous générez une image (peut-être encore une fractale), puis inspectez les nombres et définissez une valeur de seuil: partout où le nombre est supérieur/inférieur à X, vous placez/ne placez pas la chose. Vous pouvez également le filtrer ou le ramifier: par exemple, si un arbre heurte une position sous-marine, placez-y un poisson ou ne placez pas l'arbre du tout.

Je suis surpris que vous ne puissiez pas trouver de ressources dessus. Il y a quelques années, googler pour les "algorithmes de génération de terrain" renvoyait de nombreux hits!

3
quetzalcoatl