Un Modelo de Ataque y Defensa en Juegos de Estrategia

Publicadas por Jose Carlos Tamayo

Al desarrollar Xeno, necesitaba alguna forma de calcular las batallas. Tome lo mejor de otros juegos de estrategia y RPGS como Warcraft o Ikariam, y juegos de cartas como Magic the Gathering y pues, salio algo interesante. Por supuesto es la base de mi modelo, puede cambiar o aumentarle mas cosas pero pienso que lo simple es mejor. Mientras mas simple, mas jugadores lo entienden, menos jugadores se frustan, y es mas parejo para todos. Pero eso si, cualquier modelo que eligas, tiene que darte la posibilidad de eleccion. Piensen en el YanKenPo: Piedra > Tijera > Papel > Piedra.

Vamos por las cosas iniciales:

EL Ejercito: Cada cuadrado con la imagen de alguna unidad, son en realidad muchas unidades de este tipo, son un ejercito

Por ejemplo este cuadrado contiene 50 unidades de ese tipo.

Los Stats:
Hay 5 Stats que influyen directamente en la batalla:
  • Ataque: Es el daño que causa la unidad al atacar.
  • Overkill: Es el daño que causa la unidad al defender.
  • Defensa o Armadura: Son los puntos que restas del daño que recibes.
  • Vida: Son los puntos de vida que tiene cada unidad.
  • Unidades: El numero de unidades que tiene tu ejercito.

Secuencia de Batalla: Simularemos un simple ataque de una unidad a otra unidad. Lo primero que hacemos es:

1) Calculamos el daño que hace la unidad atacante: Esto es igual al numero de unidades que existe en el atacante multiplicado por lo que sale del ataque menos la defensa de la unidad defensora:
daño_atacante = unidades_atacante * ( ataque_atacante - defensa_defensor )

2)Calculamos el daño que hace la unidad defensora: Al defenderse la unidad, causa daño al atacante. Estuve pensando como hacer para que la unidad con el ataque mas alto no sea la unidad Dios del juego, es por eso que dividi el ataque entre daño de ataque y dao de overkill.

daño_defensor = unidad-defensora * ( overkill_defensor - defensa_atacante)

3) Calculo de unidades muertas en los dos bandos: Ya obtenidos el daño del atacante y del defensor simplemente se divide el daño_atacante entre los puntos de vida del defensor. Idem proceso para calcular los muertos en el defensor.

muertos_defensor = daño_atacante / vida_defensor
muertos_atacante = daño_defensor / vida_atacante

Eso es el resultado de una batalla, ahora se podria mejorar de muchas formas como calcular el daño de defensa despues de reducir las unidades,algo asi como un first strike en Heroes4.

Asi funciona el calculo basico en Xeno. Saludos y espero les sea util

¿Te gusta la pagina?, socializame haciendole click a tu color preferido:

Add to Technorati Favorites Digg! del.icio.us.me

4 comentarios:

  1. Eversor dijo...

    Hola , la cosa es que ese sistema esta bastante bien , ya que es muy ligerito y php lo puede hacer de sobra , ya que (sin contar con otras operaciones) el motor de batllas haria unos poquitos calculos , sin embargo , es un tanto irreal , pensemos en una batalla real , las unidades luchan contra lo que tienen enfrente , una a una , no se fusionan en un supermonstruo y luchan , entonces la cosa es ir unidad por unidad , que si es 20 en cada bando se puede hacer ya que esos calculos php los "digiere" bien , pero en el caso del clon de ogame (otro mas XD para la red , no es broma , no somos xnova) que tiene el que mas com 3 millones de un tipo de nave , php se vuelve lentisimo , hice una simulacion de 3M contra 3M y tardo 9 segundos!!! , asi que se nos ocurrio hacer el manejo de flota en c++ , que es mas rapido , ya que se ejecuta ya compilado , no como php , que primero lo compila y luego ejecuta , creo que ogame e ikariam siguen este metodo , y la verdad , es que de otra forma , batallas realistas no se me ocurre hacer , estamos pensando meterle algo de IA (que no se si seria IA o programacion de conducta , pero esto ya no es de aqui)

    saludos ;)

  2. Jose Carlos Tamayo dijo...

    Bueno eso dependeria del tipo de juego. En juegos como Ogame y ejem DexGame ( estaba seguro que en algun lugar vi eso de no "somos xnova =D") en donde cada batalla cuenta con millones de unidades,y ademas con muchas unidades de diferentes tipos deberia de hacerse algun tipo de optimizacion, digamos calculando el Maximo Comun Divisor entre todas las unidades,y despues dividir cada tipo de unidad entre esto, cosa que asi se itera menos unidades (ahora quien sabe calcular el MCD derrepente toma demasiado tiempo pero si estan haciendolo en C, facil que ya hay alguna libreria optimizada de matematicas rondando por ahi). Pero por ahi va la idea

    En el caso de Xeno podria darme el lujo de hacerlo unidad por unidad, ya que cada army tendra un limite dependiendo de la cantidad de "materia organica" que ocupe el tipo de unidad que conforme ese Army. Aunque creo que llegaria al mismo resultado de hacerlo todo de un tiro. Salvo que como en Warcraft III cada unidad tenga un minimo y maximo de ataque y el resultado se hace por un random. Aunque aqui tambien nos serviria algo la estadistica, esto me huele a que es unaDistribucion Normal . Ahh amtematicas .. odiadas e invaluables matematicas

    Lo otro uau!!! tienen que enseñarme a usar C++ para trabajarlo en PHP. Sabia que se podia hacer jalandolo como libreria pero no idea de siquiera como hacer la libreria. Aunque claro.. tambien podrian compilar el codigo con algun acelerador de php y ver cual les resulta mejor, por supuesto mandandome los resultados de sus pruebas a mi correo U.u.

    En este post si me demore para pensa que responder jaja, como te digo, me haces revisar mi teoria XD

  3. Eversor dijo...

    He mirado un poco (asi por encima) los aceleradores , y la verdad es que ni sabian que existian , (si consigo que funcionen va a ser un puntazo) , pero los que he visto lo que hacen es que una vez que alguien a "ejecutado" el codigo , digamos overview.php , la primera persona que entra , ejecuta overview , entonces estos aceleradores , guardan el byteado en memoria para posteriores usuarios , y asi saltarse todo el proceso que hace php hasta que realmente lo ejecuta

    pero mi pregunta es hay alguno que te deje compilarlo , por asi decirlo , y que incluso el primer usuario que entre ya lo haga con el byteado , porque si lo basamos en un super motor de batllas hiperconsumista , al primer pobre diablo que realica la primera batlla lo va a pasar fatal , amen de que el juego se quedaria durante unos segundos en un estado de moribuncia interesante , y claro luego se te duplican flotas y cosas de ese estilo... XD

    saludetes (asi te ayudo a que no olvides tu teoria XD , y ya de paso aprendo yo ^^ )

  4. Jose Carlos Tamayo dijo...

    CReooo que en aceleradores, el que te transforma tu codigo a optcode de una es el Zend Platform que aparece en la Community Version asi que puede ser gratis, al menos para proyectos open source. De ahi nunca me he fijado en otros aceleradores, aunque el mas activo me parece que es el Xcache, pero ese si cachea el opcode como tu dices. Aunque dice que transforma tu codigo automaticamente a C chekea el link que estoy pasando. Abria que verlo en accion.

    De nuevo s alguna vez hacen testeos, ya asbes mi correo =D

Publicar un comentario