Se me complicó. IA para batalla estilo RPG.

Iniciado por Tachikomaia, 5 Julio 2021, 03:02 AM

0 Miembros y 1 Visitante están viendo este tema.

Tachikomaia

Este código funciona bien, es una IA que a base de pruebas descubre que quitar 2HP es mejor que quitar solo 1:
Código (actionscript) [Seleccionar]
   actions for fotograma 1
      // Situación inicial.
      BaseEnHP = 10;
      // Guardar Situación inicial.
      SitID = "S"+BaseEnHP;
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
      Action = 1;
      // Variables de Unsolved situaciones.
      U = 0;
      Us = 0;
   actions for fotograma 2
      // Reset Situación. Aplicación.
      EnHP = BaseEnHP-Action;
      // ¿Sol?
      if (EnHP<=0) {
         // Solución; iniciar mostrar lista.
         List = Action;
         gotoAndPlay (4);
         // Sino ¿la situación está anotada?
      } else if (eval("S"+EnHP+"EnHP") == undefined) {
         // No. Anotarla.
         SitID = "S"+EnHP;
         set (SitID+"EnHP", BaseEnHP);
         set (SitID+"Action", Action);
         Us = Us+1;
         SitID = "U"+Us;
         set (SitID+"EnHP", EnHP);
      }
   actions for fotograma 3
      // La situación existe. ¿Modificar candidato es posible?
      if (Action<2) {
         // Modificación de candidato.
         Action = Action+1;
         gotoAndPlay (2);
      } else if (U<Us) {
         // Usar Unsolveds.
         U = U+1;
         BaseEnHP = eval("U"+U+"EnHP");
         Action = 1;
         gotoAndPlay (2);
      } else {
         // No hay Solución.
         stop ();
      }
   actions for fotograma 5
      SitID = eval("S"+BaseEnHP+"Action");
      BaseEnHP = eval("S"+BaseEnHP+"EnHP");
      if (SitID != "Ninguno") {
         List = SitID+" "+List;
         gotoAndPlay (4);
      } else {
         stop ();
      }


Al enemigo le agregué defensa (1; los ataques del jugador son quitar 1HP o 3):
Código (actionscript) [Seleccionar]
   actions for fotograma 1
      // Situación inicial.
      BaseEnHP = 10;
      EnDf = 1;
      // Guardar Situación inicial.
      SitID = "S"+BaseEnHP;
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
      Action = 1;
      // Variables de Unsolved situaciones.
      U = 0;
      Us = 0;
   actions for fotograma 2
      // Reset Situación. Aplicación.
      EnHP = BaseEnHP-(Action-EnDf);
      // Si EnHP aumentó, resetear.
      if (BaseEnHP < EnHP) {
            EnHP = BaseEnHP;
      }
      // ¿Sol?
      if (EnHP<=0) {
         // Solución; iniciar mostrar lista.
         List = Action;
         gotoAndPlay (4);
         // Sino ¿la situación está anotada?
      } else if (eval("S"+EnHP+"EnHP") == undefined) {
         // No. Anotarla.
         SitID = "S"+EnHP;
         set (SitID+"EnHP", BaseEnHP);
         set (SitID+"Action", Action);
         Us = Us+1;
         SitID = "U"+Us;
         set (SitID+"EnHP", EnHP);
      }
   actions for fotograma 3
      // La situación existe. ¿Modificar candidato es posible?
      if (Action<2) {
         // Modificación de candidato.
         Action = Action+1;
         gotoAndPlay (2);
      } else if (U<Us) {
         // Usar Unsolveds.
         U = U+1;
         BaseEnHP = eval("U"+U+"EnHP");
         Action = 1;
         gotoAndPlay (2);
      } else {
         // No hay Solución.
         stop ();
      }
   actions for fotograma 5
      SitID = eval("S"+BaseEnHP+"Action");
      BaseEnHP = eval("S"+BaseEnHP+"EnHP");
      if (SitID != "Ninguno") {
         List = SitID+" "+List;
         gotoAndPlay (4);
      } else {
         stop ();
      }


Agregué HP del jugador:
Código (actionscript) [Seleccionar]
   actions for fotograma 1
      // Situación inicial.
      HP = 10;
      BaseEnHP = 10;
      EnDf = 1;
      // Guardar Situación inicial.
      SitID = "S"+HP+"_"+BaseEnHP;
      set (SitID+"HP", HP);
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
      Action = 1;
      // Variables de Unsolved situaciones.
      U = 0;
      Us = 0;
   actions for fotograma 2
      // Reset Situación. Aplicación.
      EnHP = BaseEnHP-(Action-EnDf);
      // Si EnHP aumentó, resetear.
      if (BaseEnHP<EnHP) {
         EnHP = BaseEnHP;
      }
      // ¿Sol?
      if (EnHP<=0) {
         // Solución; iniciar mostrar lista.
         List = Action;
         gotoAndPlay (4);
         // Sino ¿la situación está anotada?
      } else if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
         // No. Anotarla.
         SitID = "S"+HP+"_"+EnHP;
         set (SitID+"HP", HP);
         set (SitID+"EnHP", BaseEnHP);
         set (SitID+"Action", Action);
         Us = Us+1;
         SitID = "U"+Us;
         set (SitID+"HP", HP);
         set (SitID+"EnHP", EnHP);
      }
   actions for fotograma 3
      // La situación existe. ¿Modificar candidato es posible?
      if (Action<2) {
         // Modificación de candidato.
         Action = Action+1;
         gotoAndPlay (2);
      } else if (U<Us) {
         // Usar Unsolveds.
         U = U+1;
         HP = eval("U"+U+"HP");
         BaseEnHP = eval("U"+U+"EnHP");
         Action = 1;
         gotoAndPlay (2);
      } else {
         // No hay Solución.
         stop ();
      }
   actions for fotograma 5
      SitID = eval("S"+HP+"_"+BaseEnHP+"Action");
      HP = eval("S"+HP+"_"+BaseEnHP+"HP");
      BaseEnHP = eval("S"+HP+"_"+BaseEnHP+"EnHP");
      if (SitID != "Ninguno") {
         List = SitID+" "+List;
         gotoAndPlay (4);
      } else {
         stop ();
      }


---------------------------------------------------------------------------------------------------------

Ahora es cuando se me complicó: El enemigo puede golpear; no funciona (la IA) si él tiene defensa 2 o más.
Código (actionscript) [Seleccionar]
Escena 1
   actions for fotograma 1
      // Situación inicial.
      BaseHP = 10;
      BaseEnHP = 10;
      EnDf = 2;
      // Guardar Situación inicial.
      SitID = "S"+BaseHP+"_"+BaseEnHP;
      set (SitID+"HP", BaseHP);
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
      Action = 1;
      // Variables de Unsolved situaciones.
      U = 0;
      Us = 0;
   actions for fotograma 2
      // Reset Situación.
      HP = BaseHP;
      EnHP = BaseEnHP;
      trace ("La sit es: "+HP+"_"+EnHP);
      // Aplicación.
      trace ("Player attacks!");
      EnHP = EnHP-(Action-EnDf);
      // Si EnHP aumentó, resetearlo.
      if (BaseEnHP<EnHP) {
         trace ("EnHP aumentó, se resetea: "+BaseEnHP);
         EnHP = BaseEnHP;
      } else {
         trace ("EnHP reducido a: "+EnHP);
      }
      // Efecto simultáneo.
      trace ("Enemy attacks!");
      HP = HP-1;
      // Si HP quedó negativo, pasa a 0.
      if (HP<0) {
         trace ("HP quedó negativo, pasa a 0");
         HP = 0;
      } else {
         trace ("HP reducido a: "+HP);
      }
      // ¿Sol?
      if (0<HP) {
         if (EnHP<=0) {
            // Solución; iniciar mostrar lista.
            List = Action;
            gotoAndPlay (4);
            // Sino ¿la situación está anotada?
         } else if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
            // No. Anotarla.
            SitID = "S"+HP+"_"+EnHP;
            set (SitID+"HP", BaseHP);
            set (SitID+"EnHP", BaseEnHP);
            set (SitID+"Action", Action);
            trace ("Nueva sit anotada: "+SitID);
            Us = Us+1;
            SitID = "U"+Us;
            set (SitID+"HP", HP);
            set (SitID+"EnHP", EnHP);
         }
         // Sino ¿la situación está anotada?
      } else if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
         // No. Anotarla.
         SitID = "S"+HP+"_"+EnHP;
         set (SitID+"HP", BaseHP);
         set (SitID+"EnHP", BaseEnHP);
         set (SitID+"Action", Action);
         trace ("Nueva sit anotada: "+SitID);
         Us = Us+1;
         SitID = "U"+Us;
         set (SitID+"HP", HP);
         set (SitID+"EnHP", EnHP);
      }
   actions for fotograma 3
      // La situación existe. ¿Modificar candidato es posible?
      if (Action<3) {
         // Modificación de candidato.
         Action = Action+2;
         gotoAndPlay (2);
      } else if (U<Us) {
         // Usar Unsolveds.
         U = U+1;
         BaseHP = eval("U"+U+"HP");
         BaseEnHP = eval("U"+U+"EnHP");
         Action = 1;
         gotoAndPlay (2);
      } else {
         // No hay Solución.
         stop ();
      }
   actions for fotograma 5
      SitID = eval("S"+BaseHP+"_"+BaseEnHP+"Action");
      Base2HP = BaseHP;
      BaseHP = eval("S"+BaseHP+"_"+BaseEnHP+"HP");
      BaseEnHP = eval("S"+Base2HP+"_"+BaseEnHP+"EnHP");
      if (SitID != "Ninguno") {
         List = SitID+" "+List;
         gotoAndPlay (4);
      } else {
         stop ();
      }


¿Cómo debería ser el código? Luego de varios segundos me genera situaciones donde el HP enemigo es negativo.

Gracias.

Tachikomaia

Solucionado así:
Código (actionscript) [Seleccionar]
Escena 1
   actions for fotograma 1
      // Situación inicial.
      BaseHP = 10;
      BaseEnHP = 10;
      EnDf = 2;
      // Guardar Situación inicial.
      SitID = "S"+BaseHP+"_"+BaseEnHP;
      set (SitID+"HP", BaseHP);
      set (SitID+"EnHP", BaseEnHP);
      set (SitID+"Action", "Ninguno");
      Action = 1;
      // Variables de Unsolved situaciones.
      U = 0;
      Us = 0;
   actions for fotograma 2
      // Reset Situación.
      HP = BaseHP;
      EnHP = BaseEnHP;
      trace ("La sit es: "+HP+"_"+EnHP);
      // Aplicación.
      trace ("Player attacks with "+Action+"!");
      EnHP = EnHP-(Action-EnDf);
      // Si EnHP aumentó, resetearlo.
      if (BaseEnHP<EnHP) {
         trace ("EnHP aumentó, se resetea: "+BaseEnHP);
         EnHP = BaseEnHP;
      } else {
         trace ("EnHP reducido a: "+EnHP);
      }
      // Efecto simultáneo.
      trace ("Enemy attacks!");
      HP = HP-1;
      // Si HP quedó negativo, pasa a 0.
      if (HP<0) {
         trace ("HP quedó negativo, pasa a 0");
         HP = 0;
      } else {
         trace ("HP reducido a: "+HP);
      }
      // ¿Sol?
      if (0<HP) {
         if (EnHP<=0) {
            // Solución; iniciar mostrar lista.
            List = Action;
            gotoAndPlay (4);
            // Sino, ambos están OK.
            // ¿La situación está anotada?
         } else if (eval("S"+HP+"_"+EnHP+"HP") == undefined) {
            // No. Anotarla.
            SitID = "S"+HP+"_"+EnHP;
            set (SitID+"HP", BaseHP);
            set (SitID+"EnHP", BaseEnHP);
            set (SitID+"Action", Action);
            trace ("Nueva sit anotada: "+SitID);
            Us = Us+1;
            SitID = "U"+Us;
            set (SitID+"HP", HP);
            set (SitID+"EnHP", EnHP);
         }
         // Sino, el enemigo ganó.
      }
   actions for fotograma 3
      // La situación existe o el jugador perdió.
      // ¿Modificar candidato es posible?
      if (Action<3) {
         // Modificación de candidato.
         Action = Action+2;
         gotoAndPlay (2);
      } else if (U<Us) {
         // Usar Unsolveds.
         U = U+1;
         BaseHP = eval("U"+U+"HP");
         BaseEnHP = eval("U"+U+"EnHP");
         Action = 1;
         gotoAndPlay (2);
      } else {
         // No hay Solución.
         List = "No hay sol";
         stop ();
      }
   actions for fotograma 5
      SitID = eval("S"+BaseHP+"_"+BaseEnHP+"Action");
      Base2HP = BaseHP;
      BaseHP = eval("S"+BaseHP+"_"+BaseEnHP+"HP");
      BaseEnHP = eval("S"+Base2HP+"_"+BaseEnHP+"EnHP");
      if (SitID != "Ninguno") {
         List = SitID+" "+List;
         gotoAndPlay (4);
      } else {
         stop ();
      }


Básicamente le puse más casos, como que quedan doble KO. Mucho más no sé explicar porque fue hace un rato y además me cuesta entenderlo.