Aumentando la probabilidad de que fichas similares se generen una al lado de la otra

9

Estoy trabajando en un sistema de mapa de mosaico, que se ve así (verde es hierba, aire es blanco, piedra es gris y azul es agua):

Losas

Utiliza un generador de números aleatorios simple para que haya un 45% de posibilidades de que el azulejo sea hierba, un 30% de posibilidades de que sea agua y un 25% de posibilidades de que sea piedra.

¿De todos modos puedo aumentar la tendencia de los bloques de hierba / piedra a agruparse para formar masas de tierra y hacer que los bloques de agua formen océanos (algo así como lo que se podría ver en un juego como Minecraft)?

aeroplano19
fuente

Respuestas:

17

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.

salmón
fuente
+1 Como creo que el salto al ruido es generalmente a dónde conducirá esto ... Me pregunto si eso podría ser un salto demasiado grande, así que el 'escanear y alterar los porcentajes' iniciales me facilitó la votación :)
James
3

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.

Jason Morales
fuente
2

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.

dhasenan
fuente
2

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.

Vite Falcon
fuente
0

puedes hacerlo usando este método:

  • poner todas las fichas en una lista no especificada
  • mientras hay un mosaico en la lista no especificada
  • empezar
  • elige un mosaico de esa lista
  • verifique los vecinos de ese mosaico y seleccione un tipo dependiendo de sus vecinos
  • eliminar ese mosaico de la lista no especificada
  • final
Ali1S232
fuente