Retorno decreciente simple con tapa

19

Problema

El jugador obtiene 5 puntos por nivel hasta el nivel 80 con un máximo de 400. Hay 5 estadísticas para distribuir y no hay límite máximo de cuánto puede agregar a una estadística.

  • Fuerza
  • Resistencia
  • Inteligencia
  • Agilidad
  • Suerte - Otorga probabilidad crítica y daño crítico

Me gustaría implementar una ecuación de retorno decreciente en digamos Suerte. Para una probabilidad crítica, no deseo que el jugador pueda alcanzar una probabilidad crítica del 100%.

Habrá un límite al que alcanzará a medida que el crecimiento cada vez más decreciente llegue a 0 por punto agregado.

Por ejemplo, si la probabilidad crítica máxima que quiero que tenga el jugador es del 40%, cada punto de suerte aumentará la probabilidad crítica cada vez menos, hasta que la probabilidad crítica alcance el 40%. Por el cual 1 suerte dará una cantidad muy muy minúscula.

¿Alguna solución? ¡Gracias y su ayuda es muy apreciada!

Mella
fuente
Posible duplicado de ¿Cómo desarrollar fórmulas de daño RPG? - tl; dr la palabra clave que estás buscando es curva sigmoidea
BlueRaja - Danny Pflughoeft
@BlueRaja Creo que eso no es un duplicado. Esta pregunta es acerca de las funciones de retorno decreciente en general, esa es sobre el cálculo del daño. Resulta que las respuestas a esa han discutido principalmente sobre las funciones de retorno decreciente, pero creo que las preguntas siguen siendo claramente diferentes.
Anko

Respuestas:

30

Desea comenzar con una función asintótica. Es decir, uno que comienza en un número ay se acerca a otro número b, pero en realidad nunca lo alcanza. Probablemente será más fácil si a = 0y b = 1. Tomarás esta ecuación, ingresarás el número de puntos de estadística (puntos de suerte) que tiene el personaje y obtendrás el valor de estadística real (probabilidad de crítico) como salida.

Un ejemplo muy simple es y = x / (x + n)donde nhay alguna constante positiva. Aquí xestá su entrada, donde introduce el número de puntos de estadísticas, y yes su salida, donde obtiene el valor de estadística final.

Para n = 5ver cómo se ve:

y = x / (x + 5) gráfico para x en [0,100]

Cuando te alimentas x = 0, obtienes y = 0, pero no importa cuán grande xlo pones, ynunca llega a 1. Perfecto.

Ahora, puede ajustar esto al deseo de su corazón. Puede multiplicar por un factor de escala para establecer el 'límite' a lo que desee. y = a * x / (x + 5). Si desea que el límite sea del 40%, multiplique por .4. y = .4 * x / (x + n). Ahora, cuando alimente en x's, yaumentará, pero nunca llegará a .4.

Ajuste npara establecer qué tan rápido o lento aumenta la ecuación. n = 100va a aumentar mucho más lento que n = 5:

y = x / (x + 100) gráfico para x en [0,400]

Puede resolver esta ecuación nsi sabe que desea el valor de estadística que desea alcanzar en un número específico de puntos de estadística. Digamos que el personaje debería tener un 35% de probabilidad de crítico con 100 puntos de suerte. Resolviendo .35 = .4 * 100 / (100 + n)para nlos rendimientos n = 14.29.

Estos números tampoco tienen que ser constantes en bruto. Tal vez otras estadísticas entran en el cálculo de los valores de n. Tal vez algunos personajes tienen diferentes n's para que escalen mejor en su estadística' preferida '.

Si desea una curva que tenga una forma diferente o sea más compleja, hay muchos otros ejemplos de funciones asintóticas que también podría usar. Te dejaré para explorar eso como quieras.

Adán
fuente
3
Mi curva favorita es la exponencial. Simplemente tome una proporción fija del grupo restante con cada nivel.
John Dvorak
@ JanDvorak para completar, ¿puedes dar un ejemplo? Hay muchas curvas exponenciales y un lector puede no saber cómo aplicar su sugerencia solo del comentario anterior.
Adam
Este es un buen punto de partida y las matemáticas se explican bien, pero tenga en cuenta que no puede elegir una función que se vea bien; Este problema requiere una cuidadosa consideración y muchos ajustes. Por ejemplo, uno de los inconvenientes de este método es su desaliento de especialización. Si las cinco estadísticas son igualmente viables, los puntos gastados en el menos desarrollado serán los más valiosos (y el menos desarrollado). La construcción ideal sería una distribución equitativa de puntos, lo que hace que la elección del jugador sobre cómo gastarlos sea menos interesante.
Marcks Thomas
@MarcksThomas Eso supone que no hay sinergia entre los atributos, o la capacidad de aislar tácticamente un atributo y "ganar" con él. Como ejemplo, imagina un arquero increíble que aumenta su agilidad hasta el punto de que los enemigos mueren antes de alcanzarlos: incluso si la agilidad tuviera una efectividad decreciente, la táctica elegida hace que los otros atributos no sean importantes. Otra táctica que involucra fuerza puede ser igualmente efectiva, por lo que los atributos son de "igual valor", pero las tácticas a menudo significan que la especialización es dominante. Si su sistema de atributos también recompensa la especialización, el juego diverge.
Yakk
Yo llamo a esto el sistema de "sacar piedras de una bolsa". El valor P = x/(x+n)es la probabilidad, dada una bolsa con n piedras negras y x piedras blancas, de que saque una piedra blanca de la bolsa ciega. Un enfoque que puede hacer es establecer los criterios X = su suerte y N = su suerte. Tu oportunidad de criticar es del 50% si tienes la misma suerte que tu enemigo. Si desea que la probabilidad básica sea del 10%, entonces nosotros X = su suerte, N = 9x su suerte.
Yakk
10

Una buena base sería una función como arctan, ya que pasa a través del origen y exhibe una asíntota horizontal.

arctan

Escala por 40 / (pi/2)o 80/pipara el límite deseado. Luego, transforma luckpara obtener la inclinación de la curva que deseas.

critical = 80/pi * arctan(f(luck))
jmegaffin
fuente
8

Me gusta mucho la forma en que los juegos de Souls abordan este problema. En lugar de hacer que cada estadística otorgue bonificaciones basadas en una función continua como se ha sugerido, otorga bonificaciones en una función lineal por partes.

No puedo recordar los números exactos de la parte superior de mi cabeza, pero las funciones están en la línea de lo siguiente (cada estadística tiene sus propias constantes)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0.5x + 120}

Trama

Este método proporciona muchos beneficios para el diseñador y el jugador. El diseñador se beneficia ya que puede ajustar el beneficio exacto por punto en una habilidad de manera bastante trivial, y el jugador se beneficia ya que saben exactamente cuánto beneficio verán de un nivel a otro.

En el caso de una función continua, algunos niveles pueden dar un beneficio que no se refleja en los números debido al alias de medición. Seguro que el último nivel te dio un aumento de 0.9 en la bonificación XYZ, pero como el valor real pasó de 23.52 a 24.42, y redondeas el número antes de mostrarlo, el jugador no se da cuenta de que algo ha cambiado.

Desde una perspectiva UX, definitivamente sugeriría ir con una función lineal por partes. Sin embargo, usar una función continua puede ser más fácil de sintonizar más adelante, ya que los jugadores no estarán tan apegados a las constantes de ronda.

Kaslai
fuente
1
Aproximación de una curva que no requiere mucha matemática y que es fácil de cambiar. Me gusta. :)
Casey Kuball
> Redondea el número antes de mostrarla => una forma de compensar es ceilla cantidad aumento antes de añadir, y sólo permiten entero niveles de estadísticas. o floorentonces x <= 0: x = 1para evitar accidentalmente pasarse de la tapa suave.
Bob
1
Si bien aún puede hacer una función por partes, no tiene el efecto que está buscando aquí. El valor de la suerte es un porcentaje, con una calificación máxima de 400. Esto significa que cada punto de calificación debe resultar en una ganancia de valor inferior al 1%, incluso en una función lineal con 100% de suerte. El truco es mostrar suficientes puntos decimales para que y (399) sea diferente de y (400). Su función hace lo mismo al hacer que crezca mucho para que los aumentos siempre puedan ser integrales. En x = 40, y es más de 4 veces el valor de x.
MichaelS
@MichaelS Solo estaba dando un ejemplo del tipo de función utilizada en Dark Souls. Tendría que equilibrarse de manera diferente dependiendo de la situación a la que se aplica, pero mi punto sigue siendo que los jugadores comprenderán el efecto de una función lineal por partes mucho más fácilmente que una curva o sección cónica arcotangente.
Kaslai
3

Jan Dvorak señala la función exponencial en un comentario. Lo explicaré aquí.

Tenga en cuenta que las operaciones exponenciales (y trigonométricas) son considerablemente más costosas desde el punto de vista computacional que incluso las operaciones de raíz cuadrada, que son mucho peores que las matemáticas básicas, por lo que probablemente sea mejor con el enfoque de Adam si va a hacer estos cálculos muchas veces por segundo . Si solo calcula los valores cuando el jugador nivela, cambia de equipo, etc., la velocidad no es importante, así que use lo que le dé la mejor curva.

Una función exponencial es alguna base, B , a alguna potencia, x , y=B^x. Los matemáticos usan comúnmente una base de e , (~ = 2.718), pero no hay razón para que no puedas usar 2 o 10 si lo prefieres.

y=e^x Se ve como esto: y = e ^ x

Observe que el lado izquierdo se mueve asintóticamente a 0. Entonces podemos voltear el eje x haciendo y=e^(-x) , pero todavía está descendiendo de 1 a 0 y queremos que ascienda. Entonces podemos voltearlo a través del eje y con y=-e^(-x) . Ahora está ascendiendo de -1 a 0. Podemos sumar 1 para obtener y=1- e^(-x) y está ascendiendo de 0 a 1.

y = 1-e ^ (- x)

A partir de aquí, solo es cuestión de escalarlo vertical y horizontalmente. Podemos multiplicar todo por algún valor, llamémoslo A , que establece el límite asintótico. Entonces podemos multiplicar x por un valor de tasa de cambio, k , para ajustar la rapidez con que se acerca al límite.

Esto nos da una ecuación final de y=A*(1 - e^(-k*x)). Usando los valores de k=0.012y A=0.5, podemos establecer el límite al 50% y dejar que se acerque bastante a ese límite x=400.

y = 0.5 * (1-e ^ (- 0.012 * k))

Ahora, puedes hacer algunos ajustes a esto. Un ajuste que hice estaba cambiando A=0.5041, así que si redondeamos a un porcentaje con 2 decimales (como 32.23%), y (399) = 49.99% e y (400) = 50.00%. A partir de y (347), hay varios lugares donde se necesitan dos puntos para obtener un cambio de 0.01%. Pero ese último punto posible aún ofrece un beneficio (apenas) tangible y lo lleva a un 50%.

Alternativamente, podríamos ajustar el kvalor para tener un efecto similar. En k=0.02305, el valor se redondea a 49.99% a y=399y 50.00% a y=400. Sin embargo, esto tiene el problema de que el gráfico es muy poco profunda en el extremo - se tarda 48 puntos para conseguir que la última centésima de un por ciento (de y(352)=49.99%a y(399)=49.99%a y(400)=50.00%) y el último 1% de probabilidad crit toma la friolera de 230 puntos (de y(170)=49.01%a y(400)=50.00%) que probablemente disminuya demasiado en los retornos.

Si lo desea, puede ajustar tanto A como k para que disminuya a un límite algo más alto a una velocidad más lenta, para dar algo entre decadencia lineal y exponencial. Al hacerlo y=0.6*(1-e^(-0.00447*x)), terminas con esto: y = 0.6 * (1-e ^ (- 0.00447 * x))

Tenga en cuenta que la curva continúa más allá del 50%, pero dado que hay un límite difícil de calificación de 400, el jugador no puede pasar ese punto (y si logran pasarlo, todavía hay un límite difícil de 60% crítico). Con esta ecuación, puede usar 1 lugar decimal y aún ver ganancias cada 2 a 3 puntos, con un tic final de y(399)=49.9%a y(400)=50.0%.

Matemáticamente, las ecuaciones anteriores pueden parecer mejores, ya que en realidad se están acercando al 50%, pero personalmente creo que las ganancias del 0.1% cada par de puntos se sienten mejor que las ganancias del 0.01%. Incluso con A=0.05041y k=0.012, se necesitan 102 puntos para pasar de y(298)=49.00%a y(400)=50.00%. El 25% de tus puntos gastados en el 2% de tu crítico probablemente esté demasiado disminuido. La ecuación del 60% solo toma 20 puntos para el último porcentaje (que sigue siendo 5 veces mayor que los 4 puntos necesarios para el primer porcentaje).

Con estas últimas ecuaciones, simplemente conecté las ecuaciones en una hoja de cálculo y ajusté manualmente los valores hasta que se veían bien. Tendrías que hacer algo similar si quisieras una gorra diferente.

MichaelS
fuente
2
La nota sobre la velocidad relativa de las operaciones matemáticas es correcta, pero probablemente irrelevante para las estadísticas del jugador. Los cuellos de botella en los juegos modernos suelen ser los que manejan miles de elementos por cuadro (por ejemplo, física y renderizado). Es poco probable que las secuencias de comandos de juego que probablemente se ejecuten unas docenas de veces por cuadro sean un problema en relación con esto, y en general están llenas de errores de caché de todos modos, lo que dejará a la CPU un montón de tiempo para hacer cualquier matemática que desee. tl; dr: no se sienta presionado para evitar operaciones costosas a menos que esté escribiendo sombreadores u otras cosas que necesitan ejecutar grandes lotes
DMGregory
-1

Para una solución muy simple, ¿qué tal raíz cuadrada x 2

La raíz cuadrada de 400 (máximo posible) es 20, 20 * 2 = 40.

Catwood
fuente
¿Por qué el voto negativo? Resuelve la pregunta y es simple lo que también se solicitó.
Catwood
1
No soy el votante negativo, pero probablemente fue porque su respuesta es demasiado específica y no proporciona ninguna información que aún no se haya proporcionado (una raíz cuadrada es solo una exponenciación del poder de 1/2) y no explica el razones por las cuales esto podría ser útil.
Kaslai
No voté en contra, pero no creo que esta sea una buena respuesta porque no es muy flexible: la raíz cuadrada no es asintótica, por lo que si el nivel máximo cambia alguna vez, debe cambiar la fórmula para mantener el máximo stat lo mismo.
BlueRaja - Danny Pflughoeft