He estado jugando durante un tiempo con un juego y tengo muchos problemas con algo:
Tengo dos personajes, cada uno de los cuales tiene atributos (aproximadamente diez) en un rango (entre 1 y 20). Quiero usar estos atributos para generar una 'tirada' de tal manera que la tirada más alta gane ese encuentro en particular. Vale la pena señalar que los dos personajes no se están dañando / defendiendo entre sí. Ambos están rodando para ver si pasan lo que supongo que podríamos llamar un chequeo de habilidades. Ambos están rodando para pasar / fallar contra un valor común. No interactúan entre sí.
Sin embargo, cuando uno de los personajes tiene incluso una pequeña ventaja numérica, cualquier fórmula que se me ocurra da como resultado que el ligeramente superior gane la gran mayoría de las veces. Esto no es deseable.
Intenté ponderar el atributo 'más relevante' para la prueba al 80% y la suma de los otros atributos al 20%. También intenté comparar promedios para producir una diferencia relativa y usar eso para aumentar el carácter más débil. Ambos enfoques dieron como resultado las ventajas significativas que estoy tratando de eliminar (por ejemplo, si ejecuto el encuentro 5,000 veces, con bastante frecuencia produce un lado ganando los 5,000).
Parece que agregar un componente de "suerte" solo importa, si está ponderado de alguna manera a favor del personaje menor, y no he logrado un buen equilibrio allí.
¿Qué enfoques puedo tomar para mitigar el impacto de una pequeña ventaja numérica pero aún preservar y aumentar esa ventaja a medida que aumenta la brecha relativa en los atributos?
Según la solicitud, aquí están los detalles que tengo hasta ahora. Algunas cosas que aún no he descubierto, por lo que siguen siendo generalidades:
Por el momento, el rollo se genera como
0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)
En la actualidad, esto produce números cercanos a 4.0. Los atributos se generan aleatoriamente entre rangos especificados. La prueba actual usa un personaje con atributos de 2 a 4, y el oponente entre 3 y 5. Como era de esperar, esto produce promedios cercanos a 3 y 4 respectivamente.
Con esta ventaja de un punto, me gustaría ver que el más fuerte de los dos gane en el área del 55% al 60% del tiempo, con esta ampliación para ganar aproximadamente el 80% del tiempo con una ventaja de atributo promedio de 5 o 6, 90% con ventajas de 7 u 8, dejando espacio para una victoria poco probable cuando la brecha crece. Preferiría no tener victorias garantizadas, pero tal vez las cosas se vuelven muy improbables, con la melodía de ganar el 99.5% o el 99.6% de las veces cuando la brecha se vuelve muy grande.
La fórmula actual produce un número no aleatorio. La aleatoriedad proviene de la selección de qué atributos son relevantes. No todos los atributos se utilizan para cada rollo. Es posible que el que tenga los atributos más débiles en general sea más fuerte en las áreas relevantes para esa tirada, y robe una victoria. Pero, como era previsible, ocurre raramente.
Mi siguiente intento fue sopesar sus fortalezas relativas, tomando un promedio de todas las estadísticas de cada uno, dividiéndolos uno contra el otro, y usando ese valor para dar un pequeño impulso al personaje menor. Esto suavizó un poco las cosas, pero aún tenía una tendencia pronunciada a producir cosas como 5,000 victorias para un chico de 5,000 intentos.
fuente
Respuestas:
El problema con su enfoque es que usted decide el resultado del combate en el momento en que decide la estadística principal. Cuando tienes 4 estadísticas principales, y el luchador solo es mejor en una de ellas, su probabilidad de ganar es siempre de 1 en 4, sin importar cuán grandes sean las diferencias. Cuando desea obtener resultados más precisos, necesita una aleatoriedad más precisa.
En primer lugar, creo que puede mantener su elección aleatoria para el atributo principal y también puede mantener su fórmula si lo desea. Es el número que representa la ventaja que tiene este combatiente en este encuentro específico. Para el resto de esta publicación, me referiré a esto como justo
power
.Un método que utilicé en muchos juegos y que me sirvió bastante bien cuando se trata de un duelo entre dos cosas con un cierto
power
, es rodar un número aleatorio de punto flotante entre0
ypower
para ambos y ver quién rueda más alto. Aquí hay una lista de los resultados esperados de este método. Los porcentajes no se calculan sino que se generan experimentalmente ejecutando 100000 peleas por combinación y recuento de iteraciones y contando quién ganó con qué frecuenciaLo bueno de este algoritmo es que escala sin importar cuán grandes sean los números con los que esté tratando. La probabilidad de 0.3 vs 0.7 es la misma que la de 3 vs 7, 300 vs. 700 o 3,000,000,000 vs. 7,000,000,000.
Cuando esto todavía es demasiado impredecible para tu gusto, puedes hacer que el combate sea más predecible tirando múltiples números aleatorios para cada combatiente y sumarlos. Debido a la ley de los grandes números , muchos eventos aleatorios se igualarán y darán resultados más predecibles. Aquí hay una tabla con diferente número de iteraciones.
Los resultados de 100% y 0% en la tabla anterior son una ilusión debido a las diferencias de redondeo. A menos que el
power
de un combatiente sea exactamente 0, siempre existe la posibilidad de que gane. Simplemente no sucedió en la prueba anterior, por lo que puede esperar que sea inferior a 1: 100000.También puede notar algunas pequeñas irregularidades que se pueden atribuir a cambios de humor de java.lang.Random y que podrían no aparecer cuando ejecuta el código nuevamente con una semilla diferente.
El programa que utilicé para generar esta tabla (Java).
Si desea utilizar este código en su juego, está licenciado bajo la WTF Public License Version 2, publicada por Sam Hocevar .
fuente
1 - powerA / ( 2 * powerB )
.powerA < powerB
. Una vez que powerA es más grande, debe cambiar apowerB / (2 * powerA)
.Su error es utilizar un enfoque "basado en dados". Estás en una computadora, puedes usar cualquier sistema que desees. Haga una tabla que convierta una diferencia en los valores en una probabilidad de% de edad para ganar y luego puede establecer los valores para absolutamente cualquier cosa que desee, por ejemplo
(Solo necesita hacer la mitad de la tabla, simplemente elija siempre A como el que tiene la estadística más alta)
Obviamente, estos números son solo un ejemplo, puede hacer que siga cualquier distribución que le plazca.
fuente
Esta es una pregunta bastante profunda, sinceramente, desde el punto de vista de la mecánica del juego. Pero hay algunas cosas que podrían ayudar.
Primero, esta es la razón por la cual la mayoría de los juegos tienen un componente separado para golpear y dañar, donde hay una "tirada" para ver si golpeas por daño, luego una "tirada" contra una tabla de daño o rango para el personaje dado. Esto también conduce a algunos arquetipos estándar en todos los géneros, donde es posible que tengas personajes más pequeños y rápidos que tengan menos puntos de vida pero inflijan más daño (magos de cañones de vidrio, ciertos tipos de pícaros) y personajes blindados más grandes que golpean por menos daño (tanques, guerreros )
Esto conduce a un equilibrio natural donde el personaje más pequeño puede ser frágil, pero evita ser golpeado tan a menudo debido a una habilidad de tipo agilidad, y también iguala el campo de juego al hacer más daño (un hechizo o un efecto de veneno que hace daño sobre hora). El tanque puede ser más lento y ser golpeado con más frecuencia, pero a menudo tiene un gran pozo de salud o puntos de vida para sostener, sin embargo, tiende a hacer menos daño por golpe (o daño por segundo).
El trasfondo de esto es por qué muchos juegos continuamente pasan por el equilibrio de armas y clases y estadísticas. World or Warcraft, Destiny, Diablo, Battlefield: cualquier tipo de juego en cualquier género a menudo pasa por el equilibrio y el ajuste a lo largo del tiempo.
Puede que esta no sea una respuesta directa, pero solicitó ideas generales. Entonces, también vamos a evaluar el sistema de juego.
¿Cómo funcionan esos atributos? Si todo lo demás es igual (sin arquetipo, sin armadura o mejores armas o cualquier otra cosa), es probable que cualquier ganancia leve arroje las cosas a favor de un lado. Si bien agregar facetas para combatir complica cualquier sistema, también permite una mayor flexibilidad.
fuente
Hay dos cosas grandes.
Primero, recuerda que estás en una computadora. Puedes hacer cualquier sistema que quieras. No es necesario limitarse a una tirada de d20, aunque esto es fácil de comprender para los jugadores. Cosas como tirar dados de 6 d6 son fáciles en una computadora y dan resultados mucho menos aleatorios.
En segundo lugar, observando otros sistemas como D&D, es obvio que simplemente reducen mucho el efecto de los atributos. En lugar de que su estadística base agregue el 80% de su valor a la regla, reduzca su escala y haga que su adición sea más sutil. En D&D, por ejemplo, si tienes 18 destrezas, obtienes solo 4 como bonificación para tu clase de armadura.
Entonces, en resumen, numéricamente todo lo que necesita hacer es reducir su dominio para adaptarse mejor a su rango. Pero desde el punto de vista cualitativo, pensaría que mirar otros sistemas y crear cosas que parezcan menos matemáticas haría un sistema más satisfactorio para el jugador.
fuente
Qué tal esto: Agregue una constante, por ejemplo 1000, a todos los atributos involucrados. Entonces la diferencia relativa se vuelve muy pequeña.
fuente
Conoce tus numeros
Agregando un poco a la respuesta de Philipp , es decir que rand [x] en comparación con rand [y] puede no siempre producir lo que uno espera. Debajo de una tabla donde comparamos A con B. Tanto A como B tienen los valores 1 ... 10. Comparamos de dos maneras (nota: rand () en este caso genera enteros, es decir, rollos):
Además comparamos
(en este caso es irrelevante si es> o ≥ ya que están tan cerca). Estas grandes figuras están entre paréntesis.
Las celdas contienen% 's. Cada resultado contiene 1 millón de iteraciones (realizadas con Dyalog APL ).
Si observa A = 2 y B = 3 (y 1 millón de pruebas):
Las sorpresas pueden ser que:
De hecho, podría resolver esta Q de manera diferente, simplemente escribiendo a mano una tabla de 10x10 con buenos porcentajes deseados (¿tal vez uno también quiere irregularidades?). Luego, si es necesario, interpolar entre dos valores, para obtener un porcentaje exacto, digamos que es por alguna razón 53. Entonces es fácil generar un golpe de probabilidad del 53%, un 0 o 1, simplemente ejecutando un rand (100) y probando si es más pequeño o igual a 53 :-).
Eso es lo que Jack Aidley menciona.
fuente
0.0
y1.0
. En ese caso, la diferencia entre>
y>=
es insignificante. Es posible que desee señalar eso.El enfoque tradicional al que varias respuestas han hecho referencia implícitamente pero que nadie ha explicado realmente es que la tarea requiere una tirada de dado fija y agrega un modificador de habilidad derivado de tus estadísticas.
Por ejemplo, si dos jugadores siguen el procedimiento:
y repite hasta que un lado venza al otro, entonces obtienes números en tu rango: aquí están las probabilidades de victoria con una ventaja numérica dada a su modificador:
fuente
Los personajes no se desafían entre sí por la supremacía. Desafían un requisito. ¿Qué pasa si ambos pasan el requisito? ¿Quién gana? Me sorprende que no hayas desafiado la lógica lo suficiente como para que incluso hayas calculado con ella.
De cualquier manera, aquí hay dos cosas que podrían hacerte algo bueno.
Caso de oportunidad de ganar con ventaja:
SI la barra de pase / verificación de habilidad es un resultado de 10. A Tira 40. B Tira 42. SI solo uno tiene que ganar. A partir de un A 50% Win / B 50% Win igual. Puede agregar% para ganar posibilidades en función de la cantidad de ventaja. Roll B tiene (42-40) / 40 = 5% de ventaja en términos de roll. Agregarlo directamente hace que la probabilidad de ganar de B sea del 55%. O puede determinar una posibilidad de ganar personalizada por porcentaje de ventaja. Digamos que por cada 100% de ventaja agregas un 10% de posibilidades de ganar. Entonces, si A tira 10 y B tira 20. Entonces A gana el 40% y B gana el 60% de los casos.
Concepto de aleatoriedad justa:
Si tiene una probabilidad estándar de ganar del 30%, puede terminar ganando 38 cheques de 100.
Algunas personas quieren un paso adicional en la justicia y se aseguran de que un 30% de probabilidad siempre gane exactamente 30 de cada 100 encuentros y sea suficiente con la aleatoriedad de no saber qué encuentros en la secuencia son ganadores y cuáles son una pérdida.
Esto es particularmente útil para economías de juego bien calculadas. Porque una estadística aleatoria del 70% de posibilidades de ganar. Digamos un 70% de probabilidad de que una mafia arroje 5 de oro. Los mobs pueden terminar soltando el oro 81 veces de cada 100. Lo que desequilibra los flujos de ingresos / gastos. Y dependiendo de cuántas entidades / instancias usen tales rollos, inevitablemente se crea inflación y / o escasez. Por supuesto, muchas personas ni siquiera tienen una estimación aproximada de las entradas completas / gastos de su economía. Mucha gente es suficiente para hacer "la mayoría" de los puntos económicos. Y deje algunas variables de generación que no se calculan y acumule horas extra de discrepancia incluso con una aleatoriedad justa.
La inflación y la escasez no son un problema por sí mismas. Puede gestionar una aleatoriedad no justa e incluso variables imprevistas si su economía está configurada para responder adecuadamente a la inflación y la escasez.
¿Por qué molestarse con esto como la ley de los grandes números? iguala las cosas a largo plazo?
No todos los entornos pueden retener su comportamiento de diseño mientras cuentan con cosas para igualar más adelante ...
fuente