Actualmente estoy haciendo un juego de defensa donde los enemigos aparecerán y atacarán al ejército del jugador. Es similar a un juego de Tower Defense, excepto que solo hay un nivel. Los enemigos seguirán engendrando hasta que finalmente el usuario muera o acumule un ejército lo suficientemente grande como para eliminar a cualquier enemigo que se genere instantáneamente (con suerte, será lo suficientemente desafiante como para que esto no suceda).
Con lo que estoy luchando en este momento es cómo hacer que este juego se vuelva cada vez más difícil y la probabilidad de que aparezca un enemigo básicamente llegue al 100%.
Hasta ahora tengo algo similar a lo siguiente
if(Math.random() < 1 - (1/elapsed_time) && spawnTimer <= 0 ){
spawnEnemy()
spawnTimer = rand(); // random number between 1 and 3
}
Pero parece demasiado uniforme para empezar. Por el momento solo estoy engendrando un tipo de enemigo, la idea es que los enemigos más duros se generan a medida que pasa el tiempo también.
También creo que necesito aleatorizar un spawnTimer
poco más y hacer que sea más rápido a medida que pasa el tiempo, pero simplemente no puedo entender cómo debería ser mi lógica para toda esta sección. ¿Alguien puede ayudar con una idea aproximada de este tipo de fórmula?
Actualmente estoy usando JavaScript para escribir el juego, pero obviamente se trata más del concepto.
Respuestas:
No es probable que la función que elija sea adecuada para su propósito. Primero, si sigue esta ruta, una condición aleatoria fallida debería ocasionar un retraso antes de la próxima vez que tire los dados. Además, es poco probable que mantener el temporizador de generación dentro de un rango constante sea bueno para su objetivo.
Sea
thresh
un umbral de dificultad que creas que es alto. Lo usamos más tarde para decidir cuándo reducir el ritmo al que el juego se vuelve más difícil.Deja que
rate
sea la cantidad de monstruos que quieres que entren cada minuto (o ronda).Sea
GROWTH_RATE
la tasa en la que aumenta la dificultad (por ahora será0.2
).Digamos que comienzas con
rate = 10
. Ahora el jugador mató a los5
monstruos para que puedas aumentar la tasaGROWTH_RATE * 5 = 1.0
y la nuevarate = 11
.Cómo implementar una condición que generará
rate
monstruos cada minuto:Temporizador desove conjunto a un número entre
0.5
a1.0
multiplied by 60 seconds or
-tiempo de idaand divided by
tasa. Also leave a
0.25` posibilidad de que ningún monstruo se genera cuando el temporizador llega a 0 y el tiempo es aleatorio nuevo.Si
rate
alguna vez llegathresh
necesita reducir la velocidad. Ahora, en lugar de aumentarrate
medianteGROWTH_RATE
, podría aumentarlo1 / math.sqrt(rate)
. De esa forma, el jugador no será destruido instantáneamente en la configuración más difícil.Puede restablecer
thresh
para ser alrededor del 80% del momentorate
en que el jugador perdió el juego.Si deseas aleatorizar la fuerza del monstruo, ten cuidado con el temporizador. Por ejemplo, si decide que
player-score
(determinado por los monstruos muertos hasta ahora) se utiliza para determinar la fuerza máxima de un monstruo que podría generar, se puede hacer algo como esto:max-monster-strength = player-score / 1000
. Entonces aleatorizar unfloat
odouble
entre0.0
a1.0
y multiplicar el resultado por sí mismo.Ahora, cuando aleatorices el temporizador, probablemente deberías tener en cuenta el nivel de potencia. Por ejemplo, podrías multiplicar el resultado del temporizador por la raíz cuadrada del siguiente poder de monstruos.
fuente
Hay muchas opciones, dos con su configuración actual:
Luego más con características adicionales:
En cuanto a hacer una curva de dificultad, realmente no hay una respuesta correcta. Se necesitarán muchas pruebas de juego y ajustes para hacerlo bien. Dependerá de cuánto dure el juego y de lo difícil que quieras que sea. Le sugiero que use Excel o un sitio como WolframAlpha y vea qué tipo de curva crean las diferentes funciones. Pruebe aumentos exponenciales, aumentos lineales, etc. Encuentre uno que funcione para usted.
fuente
En lugar de tener un número fijo de enemigos (uno) engendrados con una probabilidad variable, podrías darle la vuelta y tener un número variable de enemigos engendrados con una probabilidad fija.
En el nivel de dificultad 1, tendrá un 1% de probabilidad de generar un enemigo por tic.
En el nivel de dificultad 1000, generará hasta 1000 enemigos, cada uno con una probabilidad separada del 1%. Esto significa que en promedio se generarán 10 por marca, pero también podría ser más o menos. Existe la posibilidad de que se genere un número muy diferente de 10 a la vez, tal vez incluso todos los 1000. pero ese es un evento muy poco probable debido a cómo funciona la probabilidad (compárese: Ley de números grandes ).
Cuando agregas más enemigos diferentes con diferentes comportamientos y estadísticas, tal vez quieras que algunos de los enemigos más difíciles solo comiencen a aparecer en dificultades más altas e incluso con una baja densidad al principio. Para hacer esto, puede agregar un modificador de dificultad que se resta de la dificultad actual. De esa forma, el enemigo no se generará antes de que se alcance ese nivel de dificultad e incluso entonces solo con una menor probabilidad al principio:
fuente