Augmentation de la probabilité de génération de tuiles similaires les unes à côté des autres

9

Je travaille sur un système de carte de tuiles, qui ressemble à ceci (le vert est l'herbe, l'air est blanc, la pierre est grise et le bleu est l'eau):

Carrelage

Il utilise un simple générateur de nombres aléatoires afin qu'il y ait 45% de chances que la tuile soit de l'herbe, 30% de chance qu'elle soit de l'eau et 25% de chance qu'elle soit de la pierre.

Y a-t-il de toute façon que je puisse augmenter la tendance des blocs d'herbe / pierre à s'agglutiner pour former des masses terrestres et à faire des blocs d'eau des océans (un peu comme ce qui pourrait être vu dans un jeu comme Minecraft)?

airplaneman19
la source

Réponses:

17

Vous pouvez utiliser un algorithme qui vérifie près des blocs et fait varier la probabilité en fonction de ce qui s'y trouve - mais je pense que c'est largement la mauvaise approche.

Ce que vous voulez regarder, ce sont les types de bruit fractal - dans ce cas, le bruit perlin ou simplex. Si vous générez du bruit, vous obtiendrez des valeurs de -1 à 1.

http://en.wikipedia.org/wiki/Perlin_noise

Vous pouvez ensuite ajuster votre niveau d'eau en réglant le seuil de ce qui fait l'eau. Pour les autres blocs, vous pouvez exécuter un deuxième ensemble de bruit pour basculer entre la roche et l'herbe. (de cette façon, vous pouvez avoir de grandes taches d'eau, mais de plus petits blocs de pierre).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Comme je pense que la méthode de scan et de lancer est trop compliquée et pas trop évolutive, je suggère une autre méthode que j'ai appréciée:

Étalez une grille sur votre carte, divisant la carte en grands carrés.

Générez un nombre aléatoire à chaque intersection (entre 0 et 1 fonctionnera pour vos pourcentages)

Subdivisez en coupant chaque carré en 4 carrés pairs - suivez les anciennes lignes, et où vous trouvez les lignes de subdivision, générez un nombre aléatoire entre les 2 points adjacents, de même, pour le centre de la croix, générez un point qui se situe entre le plus haut et les valeurs les plus basses.

Rincez et répétez. Vous obtiendrez le caractère aléatoire initial de la première passe, mais les dernières passes donneront une certaine uniformité Désolé pour les nombres pseudo-aléatoires:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

Cela fonctionne encore mieux pour les triangles, car vous n'avez pas la barre transversale perdue lorsque vous sous-divisez.

Bien sûr, le meilleur résultat absolu proviendra de la combinaison de ces méthodes - couche par couche, certaines techniques vous donneront de grandes masses terrestres, d'autres vous donneront de superbes grottes, d'autres travailleront pour les collines et d'autres fonctionneront pour les systèmes d'eau.

salmonmoose
la source
+1 Comme je pense que le saut dans le bruit est généralement là où cela mènera .. Je me demande si cela pourrait être un peu trop important, alors le premier `` scan around and alter the pourcentages '' m'a facilité le vote :)
James
3

Le bruit est une bonne solution, comme cela a déjà été mentionné. Une autre option consiste à effectuer un deuxième passage sur les données pour les pousser vers la mise en page souhaitée. Le flou gaussien est l'un des nombreux moyens d'y parvenir. Faire une passe avec ça devrait vous donner de belles taches "rondes" de chaque type.

Quelle que soit la méthode utilisée, une chose importante à garder à l'esprit est de stocker les résultats du processus dans un nouvel emplacement. Si vous modifiez la carte en place, les parties que vous avez déjà traitées commenceront à affecter l'algorithme et vous vous retrouverez avec des motifs étranges.

Jason Morales
la source
2

Une façon relativement simple de le faire serait de créer un certain nombre de noyaux à des positions aléatoires. Dessinez le diagramme de Voronoi de ces points. Attribuez un élément à chaque région du résultat.

Il en résulte quelque chose d'assez laid et mécanique. Muddy les frontières un peu et vous serez en bonne forme.

Si vous générez pour une grande carte, vous pouvez le faire à deux niveaux. Créez votre diagramme initial de Voronoi en utilisant, disons, 20 noyaux, et appelez chaque région résultante une nation. Créez un autre diagramme en utilisant 400 noyaux et appelez chaque région résultante un presbytère.

Tous les presbytères totalement contenus dans une nation auront l'élément de la nation. Les Vicarages partiellement contenus dans deux ou plusieurs nations prendront au hasard l'un des éléments de leur nation englobante.

Ce post mérite une photo, mais je suis trop paresseux pour en fournir une.

dhasenan
la source
2

Le générateur de cartes polygonales serait une bonne lecture pour créer une carte avec différentes «zones» qui vous donneraient également des cartes mieux formées. Il est basé sur des diagrammes voronoi mais je suppose que ce serait un bon début.

Vite Falcon
la source
0

vous pouvez le faire en utilisant cette méthode:

  • mettre toutes les tuiles dans une liste non spécifiée
  • alors qu'il y a une tuile dans la liste non spécifiée
  • commencer
  • choisissez une tuile de cette liste
  • vérifier les voisins de cette tuile et sélectionner un type en fonction de ses voisins
  • supprimer cette tuile de la liste non spécifiée
  • fin
Ali1S232
la source