¿Cómo haría para usar una semilla aleatoria para generar un nivel de juego? La misma semilla siempre debe generar exactamente el mismo nivel.
Para este ejemplo, sería un nivel de estilo Worms . Por lo tanto, cada nivel tendría un tema (praderas, nieve, etc.), terreno base, diferentes objetos como árboles.
Entonces, ¿dónde comenzaría a crear este tipo de generador de niveles? ¿Qué estaría involucrado? ¿Qué conceptos usa?
Puntos de bonificación por cualquier enlace bueno ( puntos de bonificación de bonificación por cualquier cosa relacionada con cómo se hizo en gusanos o similares).
Gracias.
algorithm
procedural-generation
random
Adam Harte
fuente
fuente
srand(int)
. Las llamadas posteriores arand()
devolverán valores secuenciales que siempre se calculan en el mismo orden, en función de esta semilla. Establece la semilla una vez en su programa. Después de eso, si el algoritmo depende solo de los resultadosrand
, obtendrá el mismo resultado cada vez.Respuestas:
La clave para esto es usar su propio generador de números pseudoaleatorio personalizado que inicialice con el valor inicial conocido. El "Mersenne Twister" es un algoritmo popular, aquí está la entrada de Wikipedia y alguna fuente de muestra . Este y otros algoritmos PRNG en realidad producen una serie fija (muy larga) de números para los cuales el valor semilla sirve como punto de partida.
Siempre que siga exactamente el mismo procedimiento para generar su mundo cada vez, cada valor representará un mundo reproducible único.
fuente
Aquí hay un PRNG (generador de números pseudoaleatorios) implementado en ActionScript (disponible en AS2 o AS3). Es ligero y rápido, ideal para juegos: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/
La implementación anterior se basa en el PRNG Park-Miller-Carta . Este sitio le dará más información sobre las matemáticas detrás de todo esto.
Sin embargo, para construir un nivel similar a los gusanos, probablemente usaría una función de ruido Perlin . Si genera una imagen de ruido perlin con la altura de 1px y el ancho de su mundo de juego, básicamente obtendrá un mapa de altura, listo para usar. Las funciones de ruido de Perlin también siempre generan el mismo mapa con la misma semilla.
Luego puede usar el PRNG mencionado anteriormente para determinar dónde colocar objetos aleatorios en el mapa o dónde crear un agujero en el suelo. Para los hoyos, también puede aprovechar el ruido perlin nuevamente. Simplemente cree una imagen de ruido perlin con el tamaño de su mapa (x, y), y luego cree un agujero en su mapa donde el valor de píxel esté por debajo de un umbral determinado (por ejemplo, 0.2).
fuente
Teóricamente, si puede usar un generador de números pseudoaleatorio (como Perlin-Noise o Marsenne Twister) para compartir mapas a través de
números de semillas, entonces también puede crear mapas personalizados y reducirlos a semillas, resolviendo el problema de no poder crear
mapas personalizados cuando se usan PRNG. Sin embargo, esto se basa en algunas presunciones. Es decir, que los generadores de números pseudoaleatorios son
un proceso reversible y que CUALQUIER dato alimentado hacia atrás en un PRNG producirá una semilla válida, ¡mucho menos una semilla!
fuente