El juego que estoy tratando es Final Fantasy 7, pero cualquiera del estilo da problemas. Luego de muchas vueltas he llegado a esto:
Código:
Versión simplificada (pero más ambigua):Si el personaje tiene el máximo HP... Si antes de recuperar el turno hay riesgo de game over... Entonces hacer cualquier cosa que pueda reducir durante más de un turno al posible daño a recibir desde esta acción hasta recuperar el turno. sino... Entonces atacar. fin del si. sino si antes de recuperar el turno hay riesgo de game over... Si el personaje tiene CASI el máximo HP... Entonces usar el Plan A o B. // Plan A: Hacer cualquier cosa que pueda reducir durante más de un turno al posible daño a recibir desde esta acción hasta recuperar el turno. // Plan B: Curarse. sino... Entonces usar Plan A o B, pero en este caso A no es considerado mejor que B. fin del si. fin del si.
Código:
"hacer cualquier cosa que pueda reducir durante más de un turno al posible daño a recibir desde esta acción hasta recuperar el turno" o "protegerse", se refiere a usar Reflect, Confusion, Death, etc. def no cuenta porque es sólo durante un turno.Si %HP == 100... Si hay riesgo de game over... Entonces protegerse. sino... Entonces atacar. fin del si. sino si hay riesgo de game over... Si %HP == CASI 100... Entonces usar el Plan A o B. // Plan A: Protegerse. // Plan B: Curarse. sino... Entonces usar Plan A o B, pero en este caso A no es considerado mejor que B. fin del si. fin del si.
"CASI" es difícil de definir... la cuestión es que si se tiene casi el máximo entonces es muy probable que entre A) reducir daños futuros y B) recuperar ese poquito que le falta, convenga A.
"Plan A o B" significa que el A se considera mejor, como es clásico, sin embargo cuando la cantidad de protección adquirida ya es mucha, entonces puede que convenga el plan B. Es difícil definir tan exactamente cuando.
Ahora bien... falta considerar otros estados del personaje... ¡y el HP y estado de los personajes aliados!
El HP enemigo no lo estoy considerando aunque entiendo que si tiene suficientemente poco como para acabarlo en 1 golpe entonces conviene golpearlo y fin del riesgo de game over. Se podría agregar arriba del todo un if, pero es que no me interesa tanto eso, al fin y al cabo en estos juegos generalmente uno no sabe cuánto HP le queda al monstruo.
Tampoco estoy considerado su estado, lo cual es importante sí, argg...
A eso voy, a que es complicado, son muchos ifs, son muchos casos que debo ir viendo uno por uno, más aún si se quiere dar más prioridad a unos personajes que a otros.
Eso de "riesgo de game over", cuando son más de un personaje, ya no sirve, porque lo que convenga hacerse depende por ejemplo de si hay un aliado fuera de combate o no. Básicamente lo tengo solucionado, pero de una forma complicada......
En vez de poner "Si %HP == 100" pondría 3 números del 0 a 3, representando el HP de cada uno de los 3 personajes así:
3 = máximo HP
2 = HP que tendría si se curara este turno
1 = HP actual (y que se mantendría en caso de no curarse)
0 = 0 HP, está fuera de combate
Si pongo por ejemplo 331 significa que los 1eros 2 personajes tienen su máximo HP y el 3ero no.
Y en vez de poner "Si hay riesgo de game over..." pondría cosas como "X2X shielded", representando lo peor que podría suceder antes del siguiente turno, en este caso que el 2ndo personaje, estando curado y con "la máxima protección", quedaría fuera de combate. Lo de "la máxima protección" quizá pueda quitarse sin problemas, no sé. La cuestión es que las posibilidades son:
333: Riesgo de que mueran todos, incluso si tienen el max HP (esto puede ocurrir jugando un speedrun, low level game, etc).
332: El único que sobreviviría sería el 3ero, si llega a tener su max HP.
331: El único que sobreviviría sería el 3ero, si es curado (depende de cómo, pero bue).
33X: El único que sobreviviría sería el 3ero.
323: El único que sobreviviría sería el 2do, si llega a tener su max HP.
ETC,
Quitando la consideración de "máxima protección" se ha simplificado. Y sí, puede simplificarse aún más si en vez de considerar a los personajes por separado se los considerara como un todo, así:
332: Sólo hay un personaje que sobreviviría teniendo su max HP.
De esa forma, 332 es lo mismo que 323 y que 233.
Pero claro, de esa forma la calidad de la IA baja un poco, porque puede haber personajes que sea más importante mantener vivos que a otros, pero de esa forma no lo está considerando.
Pero sigue faltando el tema de los estados y cuan cerca están de llenar el "Limit".
Y algo que había olvidado: Hay casos en que se está en riesgo por varias formas, sobre lo cual no tengo muy claro, pero si fuese necesario habría que resolverlo basado en probabilidades.
Bueno... lo he simplificado bastante desde que empecé a escribir aquí, tenía bastante lío, pero ya no tanto. Anyway ¿qué sugerencias darían uds, cómo la harían?