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 playerAttack
hace 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.
fuente
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?)Respuestas:
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.
fuente
a
significa nuevamente?" y desplazarse hacia arriba?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:
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.
fuente
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:
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.
fuente
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
fuente