Calculando la salida de dos ejércitos luchando

20

Estoy programando un juego estratégico usando Flash. El juego funciona de manera muy similar al famoso juego "Travian".

Mi problema es el siguiente: estoy tratando de hacer el cálculo de las tropas perdidas como resultado de una pelea entre dos ejércitos. Los dos ejércitos tienen diferentes tipos de unidades. Algunos de ellos son más fuertes contra otras unidades y más débiles contra otros tipos.

¿Cómo puedo poner ese efecto de estas diferencias en la ecuación de la pelea?

Parece fácil si solo tienen puntos att y def, pero cuando se trata de la dependencia del tipo de unidades, estoy perdido.

Ali Albahrani
fuente
66
¿El resultado de tus batallas debe ser puramente determinista o quieres usar algún tipo de aleatoriedad?
sum1stolemyname
44
No creo que deba etiquetarse como un juego multijugador, ya que eso no es dado por el OP, podría ser humano vs AI. Y por 'dependencia de tipo', ¿estamos hablando de lo clásico del tipo piedra-> tijera-> papel-> piedra?
El pato comunista

Respuestas:

10

Además de apoyar la sugerencia de Amit de mirar las ecuaciones de Lanchester, solo quiero agregar que esta es una decisión de diseño del juego, no un hecho empírico que podemos darle. Si desea tener en cuenta el tipo de unidad, debe decidir qué significa eso. Esto significa elegir una ecuación que incluya todos los factores que desea que incluya su juego. Si quieres que la infantería sea mejor que la caballería, entonces debes decidir qué significa eso, por ejemplo. ¿Cuánta caballería necesitas para igualar 100 infantería? ¿Y importa quién ataca a quién? Parece estar insinuando que simplemente dar a la infantería y la caballería diferentes valores de ataque y defensa no es lo suficientemente bueno, ¿por qué es eso? ¿Qué más estás tratando de representar que no pueda ser capturado solo por esos valores?

Tienes que decidir qué factores quieres modelar en tu juego, ya que afectan la forma en que los jugadores lo abordarán. Estos pueden incluir el tamaño / cantidad de la unidad, el tipo de unidad, la experiencia de la unidad (p. Ej., Estado de veterano), el terreno y los efectos ambientales, las diferencias entre atacar y defender si existe, si modelar daños y desgaste o no, si modelar el paso del tiempo durante el combate, la capacidad de retirarse o huir (posiblemente incluyendo el modelado de la moral), la cantidad de aleatoriedad que desea en la ecuación, etc.

Una vez que sepa todo esto, hay varios enfoques matemáticos básicos que puede tomar. Podrías hacer un sistema de "oportunidad de golpear" ronda por ronda como tienen muchos juegos de rol, por ejemplo. El sistema de combate D20. Podrías hacer un sistema de lanzamiento de monedas ponderado de una ronda "ataque contra defensa" como lo hace el juego original de Civilization. Puede hacer que cada lado genere una puntuación agregando atributos a un número aleatorio y el que obtenga el valor más alto gana. Y puede permutar estos sistemas para que funcionen ronda por ronda, o para deducir puntos de golpe o puntos de moral, o lo que sea. Cualquier sistema puede funcionar, pero debe equilibrarlo de la forma en que desea que se reproduzca. Como, en última instancia, la elección de cómo modelar el combate es una parte clave del diseño del juego, y no es algo que otras personas puedan darte.

Kylotan
fuente
Tienes toda la razón Kylotan. Tenía algunas ideas sobre la pelea antes de comenzar el diseño del juego. Sin embargo, publiqué esta pregunta preguntando si hay una mejor manera de diseñarla y averiguar cuál es la mejor manera de implementarla. Gané con los dos propósitos, supongo :) Mi amigo, ¿podría decirme dónde puedo encontrar más información sobre esos enfoques matemáticos? Además, si respondo todas las preguntas que hace sobre la elección del sistema, ¿puede aconsejarme cuál funciona mejor para mi caso? Muchas gracias por su tiempo :)
Ali Albahrani
No puedo decirte cuál será el mejor, pero probablemente deberías comenzar de manera simple y mejorarlo si es necesario. Travian parece tener un sistema simple de ataque contra defensa, con 2 tipos de unidades (infantería y caballería) y 2 puntajes de defensa por unidad en consecuencia. Una manera fácil de resolver una batalla, como se usa en Civilization 1, es dividir el puntaje de ataque de los atacantes por el total de eso más el puntaje de defensa del defensor. Esto te da un porcentaje. Ahora elija un número aleatorio entre 0 y 100 por ciento. Si es inferior al puntaje de ataque del atacante, los atacantes ganan. De lo contrario, los defensores ganan.
Kylotan
15

Para Solar Realms Elite me inspiré en las ecuaciones de Lanchester para modelar la guerra . Tuve varias peleas simultáneas en cada ronda de batalla.

En la primera pelea, todos atacaron a los soldados. En SRE, los soldados son mejores contra los soldados (no son tijeras de papel de roca, sino infantería, ataque aéreo y espacio profundo). Configuré un poder de ataque y defensa donde los soldados tuvieron el mejor ataque:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

En la segunda pelea, todos atacaron las estaciones de defensa. En SRE, los combatientes (aéreos) son los mejores contra las estaciones de defensa (por ejemplo, antiaérea):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

En la tercera pelea, todos atacaron a los cruceros pesados. En SRE, los cruceros pesados ​​están en el espacio y son mejores contra otros cruceros pesados:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(No recuerdo qué constantes usé; esos son solo ejemplos.) En cada ronda de batalla, los atacantes perderían una fracción de la fuerza de defensa y los defensores perderían una fracción de la fuerza de ataque. Creo que esto corresponde a la Ley del cuadrado de Lanchester (ecuaciones aquí ). Agregué aleatoriedad pero no recuerdo exactamente dónde. Después de cada ronda de batalla, los ejércitos serían más pequeños. Puse un límite máximo en el número de rondas; después de eso, el bando perdedor se retiraría.

No era realista tener a la infantería en el suelo disparando hacia el espacio profundo, pero funcionó mejor por razones de juego para que todas las unidades puedan luchar contra todas las demás unidades (con una efectividad reducida).

amitp
fuente
12

Tiendo a decir 'si no puedes encontrar una solución explícita, busca una implícita'. Puedes simular la batalla internamente hasta que un ejército sea aniquilado o se retire (dependiendo de los posibles resultados de tu juego).

Yo usaría algo como esto:

Para cada iteración de la batalla, todas las unidades son oportunistas, por lo que intentan hacer el mayor daño posible. Cada unidad selecciona una unidad enemiga que va a atacar en esta ronda, en función de las ventajas / desventajas conocidas.

Luego, se realizan todas las sub peleas. Un ejemplo:

Deje que los lanceros sean efectivos contra el cavalario, cavalaray sea efectivo contra los arqueros y los arqueros efectivos contra el lancero.

En una pelea entre dos ejércitos que consisten en ambos tipos de estas unidades básicas, todos los lanceros atacarían a los cavalery, todas las unidades de cavalery atacarían a los arqueros y todos los arqueros atacarían a los lanceros. Si, por ejemplo, un lado no tuviera arqueros, los cavalery de los otros lados seleccionarían el siguiente mejor tipo de objetivo (que son las unidades de cavalery enemigas)

Cada evento unidad-ataque-unidad se resuelve por separado, con la unidad perdedora dañada o marcada como destruida.

Después de que se hayan resuelto todas las luchas individuales, elimina todas las unidades que hayan sido dañadas o destruidas críticamente.

La siguiente iteración comienza a usar los ejércitos ahora reducidos.

sum1stolemyname
fuente
Realmente de acuerdo con esta publicación. Es mejor repetir la batalla en lugar de reducirla a una sola ecuación. Y definitivamente le agregaría un poco de aleatoriedad. Debería haber una posibilidad muy pequeña de que el defensor débil ruede alto y anote un crítico. Otra ventaja de iterativo es que puede crear una narración de los eventos para mostrar al jugador. "Los espadachines atacaron y pronto diezmaron a los lacayos, pero luego llegó el calvario y ..."
Tim Holt,
Me gusta mucho su respuesta, y creo que la implementaré con aleatoriedad :)
Ali Albahrani
3

Estoy probando beta un juego que actualmente es una versión simple de Solar Realms ( Star Empire Elite ), y comencé usando algo similar a las ecuaciones de Amit (arriba). En particular, me gustó la idea de tener tres fases en la batalla, donde tenías que ganar dos de las tres. Pero también quería introducir un elemento de aleatoriedad en la batalla, y por eso fui influenciado por algunos juegos de mesa.

El procesamiento es una preocupación si el juego es a escala, por lo que no quería seguir el método sugerido por sum1stolemyname arriba, aunque si su juego está utilizando el cliente para procesar los resultados, en lugar de un servidor, esto parece ser un buen enfoque.

Decidí dividir la batalla en dos fases (análoga a las tres en el modelo de Amit): aire y tierra. Calculo el ataque y defiendo la fuerza, y ajusto la fuerza del ataque hacia abajo en una fracción (para darle al defensor la ventaja). En ese punto, si la fuerza de ataque y la fuerza de defensa son iguales, el ataque tiene un 50% de posibilidades de victoria. A partir de ahí, ajusto el porcentaje de probabilidad de victoria hacia arriba o hacia abajo en función de cuánta más (o menos) fuerza tiene el atacante en comparación con el defensor. Aquí hay algunas ecuaciones simplificadas para el aire:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Especifico que chance_of_victory nunca puede ser mayor que 80 o menor que 5. A partir de ahí, solo genero un número aleatorio de 100, y luego llevo ese resultado a la batalla terrestre.

Una cosa que no he resuelto a mi satisfacción son las tasas de víctimas. Pero estoy pensando que una buena manera de resolver esto sería comparar chance_of_victory con el número aleatorio generado, y usarlo para tomar una fracción de las fuerzas de ataque-defensa como bajas.

Robert Yogurt
fuente