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.
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.
la source
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.
la source
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.
la source
vous pouvez le faire en utilisant cette méthode:
la source