Cita de: eferion en 11 Agosto 2013, 13:34 PM
Las casillas van a ser cuadradas, triangulares, pentagonales, hexagonales, ... cada tipo de casilla tendrá sus implicaciones en el algoritmo. Lo más sencillo es que las casillas sean cuadradas, así se pueden encajar en una matriz sin aplicar transformaciones.
Suponiendo que las casillas sean cuadradas... vas a permitir ataques en diagonal o solo en vertical y horizontal ?? si solo permites en vertical y horizontal el código se podría simplificar.
En el caso de que se enfrenten dos unidades aquí tienes varias opciones:
* En general podrías empezar comparando la fuerza de uno con la defensa del otro... lanzar una tirada aleatoria y comprobar quien gana... el que gana o pierde vida o directamente desaparece.
* Hay unidades especializadas en acabar con otras ? esto le tendría que reportar un bonus a su fuerza o a su defensa ( las posibilidades son amplias ) antes de realizar la tirada del combate. Esto también podría ser aplicable a bonus negativos.
* Vas a tener en cuenta la moral de las tropas ?? o algún efecto beneficioso si atacan con unidades aliadas a su lado ?? Al final esto se puede traducir en modificar los bonus de ataque y defensa.
* El terreno va a influir en el combate ?? más bonus y malus para la defensa, el ataque e incluso el movimiento... algunas unidades podrían llegar a quedar atrapadas por el terreno o incluso no podrían traspasarlo... depende de ti.
* Se van a permitir ataques a distancia ?? estos ataques normalmente deberían ser especiales ya que la unidad que ataca no puede recibir daños.
Al final el combate se puede simplificar en calcular un modificador ( bonus/malus ) para la fuerza / defensa, aplicarlos a las unidades implicadas y realizar una tirada que determine quien gane... lo que pase después ya es otra cosa.
El movimiento de tropas puede ser algo tan sencillo como que las unidades avancen hacia el enemigo que tengan más cerca primero hacia adelante ( casilllas cuadradas ) y luego, si se puede, hacia los lados o puedes intentar currarte un poco la IA para que intente atacar a los puntos debiles del enemigo.
El algoritmo de general de la batalla podría ser algo así:
* Mover tropas equipo 1
* Atacar equipo 1
* Mover tropas equipo 2
* Atacar equipo 2
Posteriormente si te ves con ganas podrías mejorarlo y que sea continuo... con tropas moviéndose mientras son atacadas y cosas así. ( Nota: esto no es tiempo real por mucho que algunos se empeñen )
Y finalmente te puedes plantear si alguno de los bandos puede rendirse en un momento dado en base al desarrollo de la batalla o si por contra se exige la destrucción total del enemigo.
La verdad es que dicho parecen cuatro tonterías que se programan en un par de horas... pero al final tiene bastante más curro.
Gracias por tus sugerencias. Hay cosas que dices en las que ya había pensado, si te fijas en el post original (por ejemplo, lo del terreno). Otras no las había tenido en cuenta y están bien.
Hoy he estado todo el día dándole vueltas al tema del algoritmo. Las casillas, como dices, deben ser cuadradas, y lo del ataque en diagonal quizás sería mejor que sí pero entonces es más complejo. El tema es que quiero que haya ataque a distancia, y no tiene sentido que éste no puede hacerse en diagonal.
El juego está formado por casillas 10x10.
Lo mejor sería que todo el código fuese modular y que el runtime funcionase por turnos. He pensado eso:
Programa general
Código [Seleccionar]
Leer datos (llamando a una función externa).
Iniciar el simulador general pasándole los datos leídos.
Devolver datos, guardándolos (llamando a una función externa).
Fin del programa.
Simulador general
Código [Seleccionar]
Determinar los valores de las variables globales (clima, tipo de terreno, cuál de los dos ejércitos tiene la iniciativa, tácticas elegidas por cada ejército,...) según los datos leídos.
Crear las 100 casillas de la siguiente forma: se determina el tipo de terreno según los datos leídos con un 0% de azar O según el tipo de terreno general se generan aleatoriamente las diferentes casillas (por ejemplo, si es en una zona alemana, debería haber 75% de terreno de bosque, 5% de agua,...).
Crear instancias unidades partiendo de la clase Unidad y completando los atributos según los datos leídos (velocidad, motivación, estado físico, número total de efectivos de la unidad, defensa cuerpo a cuerpo, ataque cuerpo a cuerpo, defensa a distancia, unidades que se le dan bien para luchar, unidades que se le dan mal, terrenos que se le dan bien, climas que se le dan bien,...).
Ubicar las unidades en los sitios especificados por los datos leídos (aquí puede devolver error si se han puesto las unidades en sitios inválidos: fuera del "campo propio", encima de otra unidad ya colocada o en casillas ocupadas por agua,...).
Iniciar bucle de combate (con un máximo de 100 turnos) {
Si estamos en el primer turno {
Se avanzan una a una las unidades del ejército con iniciativa (obviamente, la caballería avanza más casillas por turno que la infantería pesada).
Según la táctica elegida por el ejército sin iniciativa, las unidades avanzan o no.
}
Si no estamos en el primer turno {
Las unidades del ejército con iniciativa avanzan según la táctica, disciplina, estado físico, situación de combate y del terreno y motivación que tengan.
Si en alguna casilla se produce situación de choque (se encuentran en casillas contiguas unidades enemigas entre si o alguna unidad con ataque a distancia está a dos casillas de una unidad enemiga) {
Se inicia el simulador concreto pasándole como datos las casillas de lucha y las unidades que participan.
}
Las unidades del ejército sin iniciativa avanzan según la táctica, disciplina, estado físico, situación de combate (si una unidad no está en combate y ha pasado de la mitad del campo, se dirigirá hacia unidades enemigas, preferentemente hacia las más cercanas) y del terreno y motivación que tengan.
Si en alguna casilla se produce situación de choque (se encuentran en casillas contiguas unidades enemigas entre si o alguna unidad con ataque a distancia está a dos casillas de una unidad enemiga) {
Se inicia el simulador concreto pasándole como datos las casillas de lucha y las unidades que participan.
}
}
Simulador concreto
Código [Seleccionar]
Si uno de los dos bandos está solamente formado por una unidad con ataque a distancia y el otro no está solamente formado por unidades de ataque a distancia {
Las unidades dentro del combate sin ataque a distancia atacadas por unidades con ataque a distancia se dirigen hacia la unidad que les está atacando a distancia o deciden ponerse a salvo, según circunstancias de la partida (táctica, motivación,...).
}
Se cuentan los turnos de combate.
Atacan las unidades con iniciativa y ataque a distancia.
Se efectúan los daños: según capacidad de ataque, defensa, clima,...
Atacan las unidades sin iniciativa pero con ataque a distancia.
Se efectúan los daños: según capacidad de ataque, defensa, clima,...
Atacan las unidades con iniciativa cuerpo a cuerpo.
Se efectúan los daños: según capacidad de ataque, defensa, clima,...
Atacan las unidades sin iniciativa cuerpo a cuerpo.
Se efectúan los daños: según capacidad de ataque, defensa, clima,...
Si se llevan 3 turnos consecutivos en los que un equipo de los dos consigue más bajas {
La unidad que está perdiendo se ve forzada a retroceder.
Si no puede retroceder (porque está acorralada, dificultades del terreno,...) {
Desbonificación (le baja mucho más el estado físico, motivación,...).
Se pone el contador de turnos a 0.
}
Sino {
Según táctica, moral y motivación, una unidad puede decidir (o no) retroceder.
}
¿Qué os parece? ¿Está bien? ¿No? ¿Le falta algo (general)? Si está bien, podríamos pasar a concretar más el algoritmo, poniéndolo ya con pseudocódigo y pasando argumentos, con funciones y variables,...