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.