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.
game-design
architecture
mathematics
Ali Albahrani
fuente
fuente
Respuestas:
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.
fuente
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:
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):
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:
(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).
fuente
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.
fuente
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:
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.
fuente