Você poderia usar um algoritmo que verifica perto de blocos e varia a probabilidade dependendo do que existe - mas acho que é em grande parte a abordagem errada.
O que você deseja observar são os tipos de ruído fractal - nesse caso, ruído perlin ou simplex. Se você gerar ruído, obterá valores de -1 a 1.
http://en.wikipedia.org/wiki/Perlin_noise
Em seguida, você pode ajustar o nível da água definindo o limiar do que faz a água. Para os outros blocos, você pode executar um segundo conjunto de ruído para alternar entre rochas e grama. (dessa forma, você pode ter grandes manchas de água, mas pequenos pedaços de pedra).
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 acho que o método de varredura e arremesso é excessivamente complicado e não muito robusto e escalonável, vou sugerir outro método que gostei:
Coloque uma grade em seu mapa, dividindo o mapa em quadrados grandes.
Gere um número aleatório em cada interseção (entre 0 e 1 funcionará para suas porcentagens)
Subdivida cortando cada quadrado em 4 quadrados pares - siga as linhas antigas e, onde você encontrar as linhas de subdivisão, gere um número aleatório entre os 2 pontos adjacentes, da mesma forma que para o centro da cruz, gere um ponto que fique entre os mais altos e valores mais baixos.
Enxague e repita. Você obterá a aleatoriedade inicial no primeiro passe, mas os últimos passes darão alguma uniformidade. Desculpe pelos números psuedo-random:
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
Isso funciona ainda melhor para triângulos, porque você não tem a barra cruzada perdida ao subdividir.
Obviamente, o melhor resultado absoluto virá da combinação desses métodos - camada após camada, algumas técnicas fornecerão grandes massas terrestres, outras darão impressionantes cavernas, outras funcionarão em colinas e outras funcionarão em sistemas de água.