La respuesta proporcionada por Grzegorz Sławecki ya es buena, pero quería explicar la justificación de su método y darle las herramientas para adaptar las soluciones a sus necesidades de juego.
Los parámetros del problema actual son el nivel de ataque del jugador a , el daño del arma w , el daño total infligido en un ataque d , la salud del enemigo H y el número mínimo de golpes necesarios para matar al enemigo, llamémoslo n .
Si quieres que el jugador mate en n golpes, entonces su daño total d debe ser tal que
(n-1) .d <H ≤ nd o, en otras palabras, n = ceil (H / d) .
d depende del daño del arma w y del nivel de ataque del jugador a y podemos esperar que las armas mejoren a medida que aumenta el nivel, así que escriba d (a) y w (a) en lugar de simplemente d y w . También se espera que los enemigos que enfrenta el jugador se vuelvan más duros, por lo que, nuevamente, H (a) . Todas estas son funciones crecientes de a , y desea que satisfagan las inecuaciones anteriores. Las incógnitas del problema son funciones. Establece uno como restricción y encuentra los otros. Sin embargo, tienes grados de libertad, lo cual es algo bueno.
Si entiendo bien tu pregunta, tienes una jugabilidad precisa en mente, y esta jugabilidad se representa principalmente aquí por el número de golpes necesarios para matar al enemigo, n (a) . Por lo tanto, establezca n (a) según la jugabilidad que visualice para el juego y luego encuentre el resto de las variables del problema . Esto es lo que siempre debe hacer porque, como lo muestra su pregunta, su primer intento fue probar un algoritmo que pensó que podría hacer y luego se dio cuenta de que resultó en un juego no deseado.
Supongamos, por ejemplo, que quieres que el jugador tenga que golpear más y más veces a medida que avanza en el juego. También desea que, a medida que aumenta el número requerido de golpes, aumente cada vez menos, de modo que el jugador pase una parte más larga del juego golpeando 5 veces que 2 veces. Así es como se ve n (a) :
La función utilizada es n (a) = ceil (2 / 3.sqrt (a)) .
Queremos que H (a) / d (a) permanezca dentro de los rangos de valores que hacen que n (a) tenga el valor deseado y dado que n (a) = ceil (H (a) / d (a)) , estos rangos son los siguientes rectángulos:
y H (a) / d (a) puede establecerse naturalmente en 2 / 3.sqrt (a) para que obtengamos el siguiente gráfico, con la curva roja como H (a) / d (a) :
Observación: podemos encontrar fácilmente H (a) / d (a) aquí porque sabemos la función de la cual n (a) es el techo, pero si nuestra especificación para n fuera menos agradable, tendríamos que hacer nuestro propio ajuste función utilizando varios trucos. ¡No todos los problemas son tan agradables!
Por lo tanto, queremos que H (a) / d (a) se parezca a una función de raíz cuadrada personalizada y sabemos que H y d deben ser funciones crecientes. Las soluciones son muchas. Por ejemplo,
H (a) = a. 2 / 3.sqrt (a) y d (a) = a
Pero nos gustaría que el daño y el HP del enemigo aumenten muchísimo para que haya números grandes e impresionantes al final del juego, solo por estilo, por lo que establecemos
H (a) = a². 20 / 3.sqrt (a) y d (a) = 10.a²
El punto entero, y lo mejor de todo, es la siguiente: usted sabe que sus soluciones al problema ( H (a) y d (a) ) obedecer las especificaciones ( n (a) ), por lo que se obtiene el mismo n (a) Pero tienes libertad. Sabes exactamente la libertad que tienes y puedes usarla para personalizar la experiencia. Siempre debe tratar de darse esa libertad mientras satisface sus necesidades más importantes, siempre que sea posible.
Ahora que hemos elegido el daño de un golpe d (a) , y dado que d (a) depende del daño del arma w (a) , podemos usar d (a) como nuestra especificación e intentar encontrar a w (a ) que nos da esto d (a) . Los principios son los mismos, el problema es diferente: queremos que el jugador cause más daño a medida que aumenta su nivel, incluso si el arma sigue siendo la misma, y también queremos que el daño aumente cuando el arma solo mejore y el nivel se mantenga lo mismo.
Pero, ¿qué importancia debe tener cada factor? Supongamos que queremos que el nivel sea más importante que las armas: una parte mayor de las variaciones de d (a) = a² debería ser independiente de w (a) , por ejemplo con
w (a) = 22.sqrt (a) y, por lo tanto, d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))
Obtenemos el siguiente gráfico para w (a) ...
... y sigue siendo la misma d (a) , porque nuevamente encontramos una solución que obedeció la especificación , aquí d (a) , y tenemos las propiedades mencionadas anteriormente con w y una contribución al daño (supongamos que miramos d como una función de a y w : entonces si a fuera fijo y tuviéramos w variar en la ecuación d (a, w) = a / 30.w , d seguiría siendo una función creciente de w , y lo mismo es cierto si arreglas w y haces una variación).
Esta w (a) podría darte el valor que se mostrará en la descripción del juego en el arma: obtendríamos "Daño de arma: 220" con la mejor arma del juego, por ejemplo.
Podríamos haber usado una especificación completamente diferente para nuestra jugabilidad y, por lo tanto, para n (a) , por ejemplo, una que hace que el número de golpes requeridos aumente rápidamente a medida que el juego progresa y luego se estabiliza, y las soluciones resultantes habrían sido diferentes.
playerAttack
estadística a 100? Teniendo en cuenta que este es el valor máximo, ¿no sería apropiado matar al enemigo en unos pocos golpes? (¿Es el enemigo de 1000 HP algo que verías al comienzo del juego? ¿Un enemigo estándar? ¿Jefe?)