Ideas para el algoritmo de daño de ataque (lenguaje irrelevante)

8

Estoy trabajando en un juego y necesito ideas sobre el daño que se hará al enemigo cuando tu jugador ataque. Se llama la cantidad total de salud que tiene el enemigo enemyHealth, y tiene un valor de 1000. Empiezas con un arma que hace 40 puntos de daño (se puede cambiar). El jugador tiene una estadística de ataque que puedes aumentar, llamada playerAttack. Este valor comienza en 1 y tiene un posible valor máximo de 100 después de subir de nivel muchas veces y avanzar más en el juego. La cantidad de daño que hace el arma es cortada y seca, y resta 40 puntos del total de 1000 puntos de salud cada vez que el enemigo es golpeado. Pero lo que playerAttackhace es agregar a ese valor con un porcentaje. Aquí está el algoritmo que tengo ahora. (He sacado todas las interfaces gráficas de usuario, clases, etc. y le he dado a las variables nombres muy avanzados)

double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;

Esto pareció funcionar muy bien en su mayor parte. Entonces comencé a probar algunos valores ...

//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;

Si establezco estos valores, la cantidad de daño infligido al enemigo es de 125. Parecía un buen número, así que quería ver qué sucedería si el ataque de los jugadores se maximizara, pero con el arma inicial más débil.

weaponDamage = 50;
playerAttack = 100;

el Daño total termina siendo 300, lo que mataría a un enemigo en solo unos pocos golpes. Incluso con tu ataque tan alto, no quisiera que el arma más débil pueda matar al enemigo tan rápido. Pensé en agregar defensa, pero siento que el juego perderá consistencia y se desequilibrará a la larga. Posiblemente un algoritmo bien diseñado para un modificador de disminución de armas funcionaría para armas de nivel inferior o algo así. Solo necesito un descanso de tratar de descubrir la mejor manera de hacerlo, y tal vez alguien que tenga experiencia con los juegos y mantener la nivelación constante pueda darme algunas ideas / consejos.

Dillon
fuente
2
Creo que necesitamos un poco más de información. ¿Qué tan fácil es nivelar tu playerAttackestadí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?)
Lee

Respuestas:

14

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) :

el deseado 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:

n (a) yn (a) -1

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) :

n (a), n (a) -1 y 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

Una primera solución para H y D

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²

Una mejor solución para H y D

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) ...

Washington)

... 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.

jrsala
fuente
Esto combina una sólida comprensión de las matemáticas con el juego como punto de partida. Una excelente respuesta.
Marca Thomas el
1
@MarcksThomas Bueno, gracias! Desearía que más personas definieran sus necesidades claramente y construyeran sus juegos desde allí. Así veríamos juegos de calidad más completos y completos.
jrsala
Sí, estoy de acuerdo en que esta es la respuesta perfecta. Leí esto con placer :)
Grzegorz Sławecki
1
¡Fantástico! Desearía que este tipo de matemáticas fuera una parte más regular de la literatura de diseño de sistemas. (Tal vez debería escribir mi ensayo sobre el daño contra los escudos en algún momento ...)
Steven Stadnicki
Gran respuesta, pero ¿por qué debes usar variables de un carácter en tus ecuaciones? ¿Cuántas veces pregunto, "¿Qué asignifica nuevamente?" y desplazarse hacia arriba?
Daniel Kaplan
9

Te recomendaría que diseñaras tu juego desde la otra dirección: primero piensa en cómo quieres que juegue tu juego (en términos de experiencia del juego, no en términos de números), y luego diseña las fórmulas y los rangos de números para obtener ese resultado

Tu objetivo de juego es que se necesita un cierto número de golpes para matar a un enemigo. La cantidad de visitas depende de tres variables:

  • nivel de poder del enemigo
  • nivel de poder del personaje
  • nivel de potencia del arma

Primero debe crear una tabla de todas las combinaciones posibles de estas tres variables que sean de nivel bajo, medio o alto (todavía no hay números concretos, solo "bajo", "medio" o "alto") y cuántos golpes desea ser requerido para estas combinaciones.

Entonces debe intentar encontrar una fórmula y rangos de valores que se aproximen mejor a sus valores deseados.

Philipp
fuente
7

La forma más fácil es aumentar el daño de arma entre los niveles de arma exponencialmente.

Sin embargo, lo que importa es que también debes definir cómo crece el HP de los enemigos cuando se fortalecen. Entonces, cuando eres muy fuerte, deberías matar enemigos fáciles con solo unos pocos golpes, pero aquellos a tu nivel deberían ser relativamente más difíciles de matar que los enemigos que estaban a tu nivel al principio. Así que lo diseñaría para que se parezca un poco a continuación:

level   weapon  enemy   attack  total   hits needed
        dmg     hp      factor  dmg     to kill
======================================================
1       1       2       5       1.25    1.6
2       4       16      10      6       2.666666667
3       9       54      15      15.75   3.428571429
4       16      128     20      32      4
5       25      250     25      56.25   4.444444444
6       36      432     30      90      4.8
7       49      686     35      134.75  5.090909091
8       64      1024    40      192     5.333333333
9       81      1458    45      263.25  5.538461538
10      100     2000    50      350     5.714285714
11      121     2662    55      453.75  5.866666667
12      144     3456    60      576     6
13      169     4394    65      718.25  6.117647059
14      196     5488    70      882     6.222222222
15      225     6750    75      1068.75 6.315789474
16      256     8192    80      128     6.4
17      289     9826    85      1517.25 6.476190476
18      324     11664   90      1782    6.545454545
19      361     13718   95      2075.75 6.608695652
20      400     16000   100     2400    6.666666667
Dónde:
1. dmg total se calcula utilizando su fórmula
2. arma dmg = nivel * nivel (crecimiento exponencial)
3. HP enemigo = 2 * nivel * nivel * nivel (crecimiento exponencial)
4. factor de ataque = nivel 5 *
5. golpes necesarios describe cuántos golpes se necesitan para estar en el nivel x y usar armas en el nivel x, para matar a un enemigo en el nivel x

Ajusté esos factores constantes en las fórmulas solo para lograr resultados que creo que son aceptables, pero lo importante es dónde quieres crecimiento lineal y dónde quieres exponencial.

También deberías notar que, por ejemplo, matar al enemigo lvl 20 con 100 ataques y tener un arma lvl1 que requiere un total de 6 dmg tomará mucho tiempo. Si se necesita demasiado en tu opinión, juega con constantes.

Grzegorz Sławecki
fuente
¿Qué significa "factor de ataque"?
Daniel Kaplan
0

Creo que el método de World of War es uno de los mejores. Las estadísticas base de los jugadores tienen un bajo impacto en el daño total, y la mayoría del modificador de daño proviene de las estadísticas de bonificación en el equipo. Eso hace que sea mucho más fácil expandir el juego y equilibrarlo a medida que pasa el tiempo

ProtoJazz
fuente