Foros del Web » Programación para mayores de 30 ;) » Programación General »

[SOLUCIONADO] IA (sin aprendizaje) para batallas RPG???

Estas en el tema de IA (sin aprendizaje) para batallas RPG??? en el foro de Programación General en Foros del Web. No quería preguntarlo aquí porque es más bien cuestión de entender el juego que sea, no de programación, pero como entender el juego parece imposible ...
  #1 (permalink)  
Antiguo 19/06/2016, 20:28
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
IA (sin aprendizaje) para batallas RPG???

No quería preguntarlo aquí porque es más bien cuestión de entender el juego que sea, no de programación, pero como entender el juego parece imposible entonces me pregunto cómo harían uds si quisieran programar una IA para él.

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:
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.
Versión simplificada (pero más ambigua):
Código:
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.
"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.
"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?

Última edición por Tachikomaia; 20/06/2016 a las 11:51
  #2 (permalink)  
Antiguo 21/06/2016, 22:33
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: IA (sin aprendizaje) para batallas RPG???

Una IA no puede existir sin aprendizaje, lo que propones es meramente un algoritmo.

Lo que haría sería algo muy parecido a esto.
https://www.youtube.com/watch?v=qv6UVOQ0F44
  #3 (permalink)  
Antiguo 22/06/2016, 21:01
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: IA (sin aprendizaje) para batallas RPG???

He visto que le llamaran IA también a formas de actuar aunque no hubiera aprendizaje, de hecho le quité las comillas a IA por eso, sino hubiera dicho "IA".

En cuanto a lo que tú harías, es que yo no tengo mucha idea, juego por emulador. Si fuese un juego creado por mi mismo o supiera todas las variables podría hacerlo con más facilidad, pero igual sería complicado.
Había visto un video similar pero nunca profundicé en cómo estaba hecho, tampoco con los TAS, pero me interesó entender cómo aprende esa IA, ya que no le vi mucho sentido xD

E igualmente, si quieras hacer un algoritmo para esto, en vez de usar una IA, qué sugerirías?
  #4 (permalink)  
Antiguo 22/06/2016, 22:57
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: IA (sin aprendizaje) para batallas RPG???

También podrías haber buscado algo de información sobre como funciona y habrías encontrado links tan interesantes como este o este otro.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 28/06/2016, 16:38
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: IA (sin aprendizaje) para batallas RPG???

Proyecto cancelado.

No creí que exigiera tanto esfuerzo. Intentaré hacer el Speedrun o investigación (de hecho ya empecé) pero sin tener una descripción tan "profunda" de la estrategia en combate.

...

En cuanto a la IA aplicada a Mario y la idea de aplicarla a mi caso, en realidad me confundí, pues una cosa sería aplicarla a averiguar una estrategia en batalla y otra cosa sería aplicarla a todo el juego. Malenko me hizo dar cuenta. Hacer una simulación de una batalla es MUCHO más fácil que hacer una simulación de todo el juego...

Malenko, sí se ven interesantes tus links, pero el 1ero me resulta muy largo y el 2ndo ayudaría si quisiera ayuda para imitar el sistema de batallas, pero eso es algo que por ahora quiero desarrollar por mi mismo (*). Dicho sistema no implica IA, es el jugador el que elige ¿no? Los ataques enemigos suelen ser al azar, no tienen mucho de "if-then" y menos de aprendizaje.

(*): Mira, hace unos meses estaba haciendo esto que es un poco más complejo (ya que hay movimiento en el campo, posiciones variadas, más como en Final Fantasy Tactics, Super Robot Taisen, etc):
https://dl.dropboxusercontent.com/u/169164922/25.swf
Obviamente no está completo para nada, pero sí se puede seleccionar a un monstruo aliado y luego mover el cursor en su menú de posibles comandos. El único usable es Move, no obstante. Todo con la tecla A.
El murciélago enemigo carece completamente de IA. Precisamente dejé el proyecto ahí porque en ese momento no tenía mucha idea de cómo hacerla (cuestiones de "if-then", no de aprendizaje). Con la experiencia adquirida ahora, quizá pudiera avanzar algo, pero primero quiero continuar con el tema de las colisiones (me cuesta empezar a leer).
Si quieres más detalles:
http://zonaforo.meristation.com/topic/2381146/

Bueno... en cuanto a este tema, logré 2 sistemas de representación bastante buenos.

A: Puede que DF sea mejor que curarse., especialmente si el HP es casi el máximo.
B: 3 funciona seguro, pero ocurre lo mismo que con A.
C: 3 e incluso 2 funcionan seguro, pero ocurre lo mismo que con A.

Ese es si la batalla tuviese un sólo personaje.
En la 1era columna muestra los tipos de ataque enemigos. Como antes, 1 significa que mata al personaje a menos que se cure o algo, 2 significa que lo mata aunque se cure, y 3 significa que lo mata aunque tenga todo su HP.
En la 2nda columna muestra al personaje con el HP al máximo, y en el cruce con las filas de distintos ataques a recibir muestra qué conviene (a mi parecer) hacer. Lo mismo en la 3era columna.

Esto no tiene en cuenta estados secundarios como envenenado, etc.

Este es si la batalla tuviese 2 personajes.
Nota: No entró en la pantalla de este foro.

D65: DF, 33, 32 o AT
¿D65: (DF, 33, 32) o AT
¿D65¿4: (DF, 33, 32) o (22 o AT)
D654: DF, 33, 32, 31 o AT
¿D654¿432: (DF, 33, 32, 31) o (22, 21, 11 o AT)
¿6D54: (33, DF, 32, 31) o AT
(*): 33 es seguro y da tiempo, pero DF quizá mejor. Hay otros casos como este.
¿6D54¿4: (33, DF, 32, 31) o (22 o AT)
¿6D544¿32: (33, DF, 32, 31, 22) o (21, 11 o AT)
¿654D4¿3: (33, 32, 22, DF, 31) o (21 o AT)
¿654D4¿3: (33, 32, 22, DF, 31) o (21 o AT)

Lo mismo, aunque sí, se vuelve mucho más complicado. Es que no señalo simplemente "lo que más conviene hacer", sino todas las opciones, ordenadas, que convengan más que AT. Si están entre paréntesis significa que el orden de ellas es dudoso.

Y sí, no está completa.

Por último...
Nota: No entró en la pantalla de este foro.

Son los 2 casos anteriores pero representados de forma distinta. Ahora en las columnas se muestran las opciones y en las intersecciones con las filas (distintos estados y peligros) se muestra cómo pueden quedar los personajes.
De la 2nda tabla sólo hice el caso 33, por lo que me faltaría un montón para terminar, además de que me falta el caso de 3 personajes y no estoy teniendo en cuenta varias cosas (ej: Magias cuyo daño es dividido entre la cantidad de personajes OK).

En definitiva, a usar IA o dedicar un montón de tiempo y esfuerzo bastante en vano.

Etiquetas: aprendizaje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:40.