No atacar a enemigos ko.

Iniciado por Tachikomaia, 23 Agosto 2021, 09:46 AM

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

Tachikomaia

Esto es lo que tengo por ahora:
  actions for fotograma 1
     function Action1 () {
        trace ("Player attacks with 1 to Enemy1!"
        En1HP = BaseEn1HP-1;
     }
     function Action2 () {
        trace ("Player attacks with 2 to Enemy1!"
        En1HP = BaseEn1HP-2;
     }
     function Action3 () {
        trace ("Player attacks with 1 to Enemy2!"
        En2HP = BaseEn2HP-1;
     }
     function Action4 () {
        trace ("Player attacks with 2 to Enemy2!"
        En2HP = BaseEn2HP-2;
     }
     Action = 1;
  actions for fotograma 2
     // player attacks
     eval("Action"+Action) ();
     Si Enemy1 is ok
        Enemy1 attack Player
     Si Player is ok
        Si Enemy2 is ok
           Enemy2 attack Player
        sino si Enemy1 is ko
           // player wins
     sino
        // game over
  actions for fotograma 3
     // variar ataque salteando los que afectan a un enemigo ko


El jugador, que es una IA o parecido, tiene 4 posibles acciones. Dichas acciones varían en cuánto daño hace y a qué enemigo.
No he definido ciertas variables, lo haré cuando resuelva los problemas que tengo.

En el fotograma 2 hay una llamada a una función según el valor de una variable. Quizá está mal escrito, lo analizaré cuando resuelva los problemas que tengo. Lo demás puede que esté mal pero trata simplemente de que los enemigos no ataquen si están ko, de cuando hay victoria y derrota.

La cuestión está en el fotograma 3. Lo normal sería hacer Action++ y volver al fotograma 2, pero quiero evitar que se hagan ataques a enemigos ko. ¿Alguna idea de cómo? Pueden proponer distintos códigos, no sé, yo imaginé el que leyeron pero puede haber mejores. De hecho tengo pensado que pueda haber cualquier cantidad de enemigos, así que la parte de los "si" puede que necesite un arreglo.

Gracias.

MCKSys Argentina

Hola!

Hace siglos que programaba en AS (AS2 en aquellos días), y no recuerdo casi nada, pero cuando hice jueguitos para pasar el tiempo, creaba objetos. Osea, cada movie que ponía en pantalla tenía propiedades que me permitían saber algo de cada instancia. Podría hacer lo mismo y tener dichas propiedades como por ej. la vida de dicha instancia al momento de "preguntarle". Si está KO, entonces su vida sería de 0 (o puedes usar un flag si dicho valor no se relaciona con esa propiedad).

Es una idea de cómo podrías resolverlo.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Tachikomaia

#2
Creo que por fin lo resolví:
Código (actionscript) [Seleccionar]
Escena 1
  actions for fotograma 1
     // "En" es una abreviación de Enemigo.
     // "HP" es una abreviación de Health Points, o puntos de vida.
     // Acciones posibles de la IA.
     function Action1 () {
        if (0<En1HP) {
           // Si el En1 está ok, se lo ataca.
           En1HP = En1HP-1;
           trace ("IA attacks with 1 to Enemy1! Queda con "+En1HP);
        } else {
           // sino, ver si el En2 está ok.
           Action = 3;
           trace ("En1 is ko; ver En2");
           eval("Action"+Action)();
        }
     }
     function Action2 () {
        if (0<En1HP) {
           // Si el En1 está ok, se lo ataca.
           En1HP = En1HP-2;
           trace ("IA attacks with 2 to Enemy1! Queda con "+En1HP);
        } else {
           // sino, ver si el En2 está ok.
           Action = 3;
           trace ("En1 is ko; ver En2");
           eval("Action"+Action)();
        }
     }
     function Action3 () {
        if (0<En2HP) {
           // Si el En2 está ok, se lo ataca.
           En2HP = En2HP-1;
           trace ("IA attacks with 1 to Enemy2! Queda con "+En2HP);
        } else {
           // sino, load unsolved sit.
           Action = 4;
        }
     }
     function Action4 () {
        if (0<En2HP) {
           // Si el En2 está ok, se lo ataca.
           En2HP = En2HP-2;
           trace ("IA attacks with 2 to Enemy2! Queda con "+En2HP);
        } else {
           // sino, load unsolved sit.
           Action = 4;
        }
     }
     // Nro de acción que se usará en el fotograma 2.
     Action = 1;
     // Situación inicial.
     IAHP = 10;
     BaseEn1HP = 5;
     BaseEn2HP = 5;
     // Guardar Situación inicial.
     SitID = "S"+BaseEn1HP+"_"+BaseEn2HP;
     set (SitID+"En1HP", BaseEn1HP);
     set (SitID+"En2HP", BaseEn2HP);
     set (SitID+"Action", "Ninguno");
     // ID de la Unsolved situación que será analizada (luego de sumarle 1).
     U = 0;
     // Cantidad de Unsolved situaciones.
     Us = 0;
  actions for fotograma 2
     // Sit reseteada
     En1HP = BaseEn1HP;
     En2HP = BaseEn2HP;
     trace ("Sitreset; queda en "+En1HP+" y "+En2HP);
     // IA attacks
     eval("Action"+Action)();
     if (En1HP<=0 && En2HP<=0) {
        // Todo Enemigo fue derrotado: Solución, iniciar mostrar Lista de Acciones usadas.
        trace ("Solución hallada, ir al F4");
        List = Action;
        gotoAndPlay (4);
     } else {
        if (0<En1HP) {
           // Si En1 está ok, él attacks IA.
           trace ("En1 attacks IA");
        }
        if (0<IAHP) {
           // Si IA está ok, ver si En2 está ok.
           if (0<En2HP) {
              // Si En2 está ok, él attacks IA.
              trace ("En2 attacks IA");
           }
        }
        if (0<IAHP) {
           // Si IA está ok, ver si la situación está anotada.
           if (eval("S"+En1HP+"_"+En2HP+"En1HP") == undefined) {
              // No. Anotarla.
              trace ("Nueva Sit hallada; grabando.");
              SitID = "S"+En1HP+"_"+En2HP;
              set (SitID+"En1HP", BaseEn1HP);
              set (SitID+"En2HP", BaseEn2HP);
              set (SitID+"Action", Action);
              Us = Us+1;
              SitID = "U"+Us;
              set (SitID+"En1HP", En1HP);
              set (SitID+"En2HP", En2HP);
           }
        } else {
           // Game over, ver si hay más acciones posibles.
           trace ("Gameover; ver si hay otras acciones");
        }
     }
  actions for fotograma 3
     // La situación existe. ¿Modificar candidato es posible?
     if (Action<4) {
        // Modificación de candidato.
        Action = Action+1;
        gotoAndPlay (2);
     } else if (U<Us) {
        // Usar Unsolveds.
        U = U+1;
        BaseEn1HP = eval("U"+U+"En1HP");
        BaseEn2HP = eval("U"+U+"En2HP");
        Action = 1;
        gotoAndPlay (2);
     } else {
        // No hay Solución.
        List = "No hay sol";
        stop ();
     }
  actions for fotograma 5
     SitID = eval("S"+BaseEn1HP+"_"+BaseEn2HP+"Action");
     BaseEn1HP = eval("S"+BaseEn1HP+"_"+BaseEn2HP+"En1HP");
     BaseEn2HP = eval("S"+BaseEn1HP+"_"+BaseEn2HP+"En2HP");
     if (SitID != "Ninguno") {
        List = SitID+" "+List;
        gotoAndPlay (4);
     } else {
        stop ();
     }


Se menciona que los enemigos atacan pero por ahora no estoy aplicando eso, antes de aplicarlo quería resolver el problema que tenía.

Serapis

Deberías aprender a generar una tabla de estados, para simplificar la lógica y sobretodo  para poder escribir el código de corrido y sin tanta fatiga mental y tiempo que le dedicas.

Por otro lado no es buena idea hacer abreviaturas del tipo:
Citar
// "En" es una abreviación de Enemigo.
// "HP" es una abreviación de Health Points, o puntos de vida.
Por lo menos no hoy día, en los 80 estaba justificado primero por la limitación de memoria disponible en el equipo y antes de los 80 incluso por la limitación de los lenguajes en materia de manejo de strings, hoy día todo eso no tiene validez alguna... escribe:
CitarEnnemy1HelpPoints = Ennemy1HelpPoints -1
sin preocupación... además cuando pasen los años, y vuelvas al código seguirá estando claro, si no tendrás que tirar de comentarios cuando el propio nombre usado es autoentendible.
En la medida que tengas que usar 2 o 3 docenas de variables ya tendrás ahí un código espagueti enmarañado difícil de leer y más de seguir y modificar.

Tachikomaia

Cita de: Serapis en  2 Septiembre 2021, 23:31 PM
Deberías aprender a generar una tabla de estados, para simplificar la lógica y sobretodo  para poder escribir el código de corrido y sin tanta fatiga mental y tiempo que le dedicas.
No sé cómo notaste lo de fatiga mental, pero acertaste, me sentí hecho polvo cuando lo terminé xD
¿Algún link que explique qué es una tabla de estados y cómo se hace/usa?

CitarPor otro lado no es buena idea hacer abreviaturas del tipo
Las uso porque así leo y comprendo más rápido. Me sale naturalmente, además HP es muy conocido en el mundo de los videojuegos.

Citarademás cuando pasen los años, y vuelvas al código seguirá estando claro, si no tendrás que tirar de comentarios cuando el propio nombre usado es autoentendible.
Puede ser, pero por ahora me resulta más cómodo así. A sabiendas de que el código es para resolver batallas tipo RPG (role play game, juego de rol) no olvidaré lo que es "En", y menos lo que es HP, tanto así que esos comentarios que citaste los escribí para los lectores no para mí. Pero si les "molesta" leer abreviaciones, para la próxima escribiré todo completo.

CitarEn la medida que tengas que usar 2 o 3 docenas de variables ya tendrás ahí un código espagueti enmarañado difícil de leer y más de seguir y modificar.
Probablemente, por ahora son 2 enemigos con 1 stat (estadística, medida de una característica), pero la idea es agregar más enemigos y stats.