Podría usar un algoritmo que verifique los bloques cercanos y varíe la probabilidad según lo que haya allí, pero creo que es en gran medida el enfoque equivocado.
Lo que desea observar son los tipos de ruido fractal, en este caso, perlin o ruido simplex. Si genera ruido, obtendrá valores de -1 a 1.
http://en.wikipedia.org/wiki/Perlin_noise
Luego puede ajustar su nivel de agua estableciendo el umbral de lo que produce agua. Para los otros bloques, puede ejecutar un segundo conjunto de ruido para cambiar entre roca y hierba. (de esta manera puede tener grandes parches de agua, pero pequeños grupos de piedra).
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
}
Como creo que el método de escaneo y lanzamiento es demasiado complicado y no demasiado escalable, sugeriré otro método que disfruté:
Coloque una cuadrícula en su mapa, dividiéndolo en cuadrados grandes.
Genere un número aleatorio en cada intersección (entre 0 y 1 funcionará para sus porcentajes)
Subdivida cortando cada cuadrado en 4 cuadrados pares: siga las líneas antiguas y, donde encuentre las líneas de subdivisión, genere un número aleatorio entre los 2 puntos adyacentes, de manera similar, para el centro de la cruz, genere un punto que se encuentre entre los más altos y valores más bajos.
Enjuague y repita. Obtendrá la aleatoriedad inicial de la primera pasada, pero las últimas pasadas le darán algo de uniformidad Perdón por los números aleatorios de psuedo:
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
Esto funciona aún mejor para los triángulos, porque no tienes la barra cruzada perdida cuando subdivides.
Por supuesto, el mejor resultado absoluto vendrá de la combinación de estos métodos: capa sobre capa, algunas técnicas te darán grandes masas de tierra, otras te darán cuevas increíbles, otras trabajarán para colinas y más trabajarán para sistemas de agua.