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.
El ruido es una buena solución, como ya se ha mencionado. Otra opción es tomar una segunda pasada en los datos para empujarlos hacia el diseño que desee. Gaussian Blur es una de las muchas maneras en que puedes lograr esto. Hacer un pase con eso debería hacerte agradables manchas "redondas" de cada tipo.
Sin embargo, sin importar el método que utilice, una cosa importante a tener en cuenta es almacenar los resultados del proceso en una nueva ubicación. Si modifica el mapa en su lugar, las porciones que ya ha procesado comenzarán a afectar el algoritmo y terminará con algunos patrones extraños.
fuente
Una forma relativamente simple de hacer esto sería crear varios núcleos en posiciones aleatorias. Dibuja el diagrama de Voronoi de estos puntos. Asigne un elemento a cada región del resultado.
Esto da como resultado un aspecto bastante feo y mecánico. Enloda las fronteras un poco y estarás en buena forma.
Si está generando para un mapa grande, puede hacerlo en dos niveles. Cree su diagrama inicial de Voronoi usando, digamos, 20 núcleos, y llame a cada región resultante una nación. Cree otro diagrama usando 400 núcleos y llame a cada región resultante una vicaría.
Todos los vicarios totalmente contenidos dentro de una nación tendrán el elemento de la nación. Las vicaría parcialmente contenidas en dos o más naciones tomarán uno de los elementos de sus naciones al azar.
Esta publicación merece una foto, pero soy demasiado vago para proporcionarla.
fuente
Polygonal Map Generator sería una buena lectura para crear mapas con diferentes 'zonas' que también le darían mapas mejor formados. Se basa en diagramas voronoi, pero supongo que este sería un buen comienzo.
fuente
puedes hacerlo usando este método:
fuente