Estoy buscando una función para generar un mapa aleatorio basado en mosaicos a medida que cambian los límites visuales del mapa (al pasar por el mapa). Quiero que el mapa sea infinitamente grande y tenga una estructura tipo laberinto.
Sin embargo, si el mundo es infinito, volver a donde un jugador ya estuvo antes plantea un problema. El juego debe recordar cómo se veía todo allí.
Entonces, estaba pensando: "¿Cómo resuelve Minecraft este problema?" y pensé para mí mismo que debían estar usando algún tipo de función de número aleatorio con una semilla, que puede avanzar pero también retroceder, y de esa manera, volver a generar mosaicos antiguos exactamente como eran, pero en casos nuevos.
¿Qué piensas sobre esto?
tiles
random
minecraft-modding
tilemap
Mathias Lykkegaard Lorenzen
fuente
fuente
Respuestas:
Lo que has notado es la diferencia entre un generador de números aleatorios y una función de ruido . Un generador de números aleatorios escupe un número diferente cada vez que lo llama. Una función de ruido toma algunos argumentos, por ejemplo, un mapa x e y, y escupe números con propiedades estadísticas similares al azar , pero el mismo valor para los mismos argumentos cada vez , es decir, es una función matemática adecuada.
Los dos están muy relacionados. Una función de ruido puede simular un generador de números aleatorios, haciendo pasar en un valor diferente cada vez - por ejemplo
noise(1)
,noise(2)
y así sucesivamente. Y un generador de números aleatorios, arrojado a una mesa gigante, puede actuar como una función de ruido. Sin embargo, en ambos casos, está utilizando la herramienta incorrecta para el trabajo.Minecraft en particular usos Perlin ruido , un tipo de ruido que es barato para calcular, y tiene una propiedad deseable de ser continua en tantas dimensiones como sea necesario - si se hace un gráfico
f(x)
quef(x + 1)
, no habrá ningún saltos bruscos. Esto lo hace muy útil para muchas cosas como la modulación de textura, nubes y gases volumétricos y la generación de terreno.Si estás buscando una implementación para comenzar a jugar, el generador de ruido Perlin mejorado de Ken Perlin es una de las implementaciones más simples.
fuente
La forma en que Minecraft controla su generación es creando una semilla de nivel que se usa para sembrar toda la generación de números aleatorios para el juego. Si no existe un fragmento en el disco cuando se solicita, se generará utilizando la función de generación de Notch basada en la semilla del nivel; luego se guarda en el disco para más tarde.
Parece que está buscando lograr un comportamiento similar, por lo que es una forma segura de hacerlo.
fuente
Como Joe señaló, estás buscando una función hash. En general, las funciones aleatorias son solo funciones hash sembradas con el último número devuelto. Entonces, si se
Random()
devuelveHash(seed)=1234
, una segunda llamadaRandom()
volveríaHash(1234)
, etc.Si está buscando una función de hash simple para números pseudoaleatorios, consulte MurMurHash . Lo he implementado en C # y puedo publicarlo en algún lugar si estás interesado. Aquí se puede encontrar información más detallada de Perlin Noise, que utiliza una función de hash de este tipo , y su implementación en C # es aquí .
Toda esta información proviene de una pregunta que hice hace un año aquí en Stack Overflow. Lo que estás buscando se llama generación de contenido procesal, así que si necesitas más información, haz una búsqueda. ¡Feliz generación de terreno!
fuente