[ Foro de Java ]

Ayuda

30-Jan-2023 21:16
Carla Plazas
3 Respuestas

Bueno, para empezar, escribo esto porque es que ya no se que hacer, soy estudiante y ya se me echa el tiempo encima, así que me gustaría solicitar su ayuda.

A ver, tengo que hacer algo como esto:

Turno 1:
Lucha entre Tal (Vida=150 Armadura=30) y Cuál (Vida=200 Armadura=60)
Tal saca 106 y le quita 46 de vida a Cuál
Cuál saca 69 y le quita 42 de vida a Tal
Lucha entre Tal1 (Vida=150 Armadura=50) y Cuál1 (Vida=220 Armadura=50)
Tal1 saca 76 y le quita 26 de vida a Cuál1
Cuál1 saca 78 y le quita 33 de vida a Tal1
Lucha entre Tal2 (Vida=100 Armadura=60) y Cuál2 (Vida=120 Armadura=30)
Tal2 saca 99 y le quita 69 de vida a Cuál2
Cuál2 saca 90 y le quita 30 de vida a Tal2
Lucha entre Tal3 (Vida=300 Armadura=30) y Cuál3(Vida=100 Armadura=30)
Tal3 saca 55 y le quita 25 de vida a Cuál3
Cuál3 saca 20 y le quita 0 de vida a Tal3
Turno 2:
Lucha entre Tal (Vida=108 Armadura=30) y Cuál(Vida=154 Armadura=60)
Tal saca 91 y le quita 31 de vida a Cuál
Cuál saca 81 y le quita 54 de vida a Tal
Lucha entre Tal1 (Vida=117 Armadura=50) y Cuál1 (Vida=194 Armadura=50)
Tal1 saca 50 y le quita 0 de vida a Cuál1
Cuál1 saca 18 y le quita 0 de vida a Tal1
Lucha entre Tal2 (Vida=70 Armadura=60) y Cuál2 (Vida=51 Armadura=30)
Tal2 saca 93 y le quita 63 de vida a Cuál2
Cuál2 saca 36 y le quita 0 de vida a Tal2

Hasta ahí diría que todo muy bien, considerando que tengo 5 heroes contra 4 bestias, lo que no consigo hacer es que vayan rotando cuando uno muere, si alguien puede decirme como podría hacerlo, o quieren ver lo que llevo de código, por favor no duden en responder a éste mensaje.


01-Feb-2023 11:59
Nacho Cabanes (+83)

Depende por completo de cómo lo estés implementando. Por ejemplo, si usas una lista, existe un método que te permite eliminar un elemento, y lo tendrías resuelto. En cambio, si usas arrays, tendrás que hacerlo de manera más artesanal, etiquetando ciertos nodos como no utilizados, para no volverlos a comprobar.


01-Feb-2023 20:44
Carla Plazas

Si, uso un array, tipo ejército:

Heroe[] ejercitoHeroes={heroe1, heroe2, heroe3, heroe4};

Y otro para las bestias, y luego tengo éste fragmento de código en la clase principal:

if(ejercitoHeroes[h]==null)  {
ejercitoHeroes[0]=ejercitoHeroes[1];
ejercitoHeroes[1]=ejercitoHeroes[2];
ejercitoHeroes[2]=ejercitoHeroes[3];
ejercitoHeroes[3]=heroe5;

Que hace que cuando mueren vayan rotando, el problema es que solo rotan los nombres, los metodos de ataque siguen apuntando a la misma bestia.  Cada personaje tiene su propio metodo de ataque.
Ejemplo de un metodo de ataque:

public int ataque(Heroe[] ejercitoHeroes, Bestia[] ejercitoBestias) {
int b=1;
int dano = numeros[n] - ejercitoBestias[b].getArmadura();
n++;

if (dano < 0) {
dano = 0;
}
ejercitoBestias[b].setPuntosVida(ejercitoBestias[b].getPuntosVida() - dano);

       
return dano;
}

Y este es el metodo que lo imprime todo:
public void batalla(Heroe heroe1, Heroe heroe2, Heroe heroe3, Heroe heroe4, Heroe heroe5, Bestia bestia1,
Bestia bestia2, Bestia bestia3, Bestia bestia4, Heroe[] ejercitoHeroes, Bestia[] ejercitoBestias) {
//Use un for con limite 100 para los turnos.
for(int t=1; t<100;)  {

System.out.println("Turno "+t);
t++;
System.out.println("");
for(int h=0;h<ejercitoHeroes.length;) {
for(int b=0;b<ejercitoBestias.length;)  {
try  {
System.out.println("Lucha entre " + ejercitoHeroes[h].getNombre() + " (Vida=" + ejercitoHeroes[h].getPuntosVida() + " Armadura="+ejercitoHeroes[h].getArmadura() + ") y " + ejercitoBestias[b].getNombre() + " (Vida=" + ejercitoBestias[b].getPuntosVida()+" Armadura=" + ejercitoBestias[b].getArmadura() + ")");
System.out.println(ejercitoHeroes[h].getNombre() + " saca " + ejercitoHeroes[h].numeros[nh] + " y le quita "+ ejercitoHeroes[h].ataque(ejercitoHeroes, ejercitoBestias) + " de vida a " + ejercitoBestias[b].getNombre());
System.out.println(ejercitoBestias[b].getNombre() + " saca " + ejercitoBestias[b].numeros[nb] + " y le quita "+ ejercitoBestias[b].ataque(ejercitoBestias, ejercitoHeroes) + " de vida a " + ejercitoHeroes[h].getNombre());

if (ejercitoHeroes[h].getPuntosVida()<=0)  {
System.out.println(ejercitoHeroes[h].getNombre()+" ha muerto.");
ejercitoHeroes[h]=null;
}
if (ejercitoBestias[b].getPuntosVida()<=0)  {
System.out.println(ejercitoBestias[b].getNombre()+" ha muerto.");
ejercitoBestias[b]=null;
}
System.out.println("");

}catch(NullPointerException e)  {
if(ejercitoBestias[b]==null)  {

}
if(ejercitoHeroes[h]==null)  {
ejercitoHeroes[0]=ejercitoHeroes[1];
ejercitoHeroes[1]=ejercitoHeroes[2];
ejercitoHeroes[2]=ejercitoHeroes[3];
ejercitoHeroes[3]=heroe5;


break;

}






}


h++;
b++;







}
}
nh++;
nb++;

Como puedes ver, use un for para reproducir los turnos, y hasta ahí todo bien, hasta que muere uno y ya me bloqueo.

Lo siento si no me he explicado bien, pero este trabajo ya me esta volviendo loca XD









14-Mar-2023 22:57
Invitado (Alejandro Andrade)

Para hacer que los métodos de ataque apunten a la bestia correcta, debes actualizar la variable 'b' en cada iteración del bucle interno que recorre las bestias. Actualmente, 'b' se establece en 1 antes de que comience el bucle interno, y nunca se actualiza después de eso. Por lo tanto, el método de ataque siempre ataca a la segunda bestia ('ejercitoBestias[1]').

Para solucionarlo, debes actualizar 'b' dentro del bucle interno en cada iteración. Puedes hacer esto agregando 'b++' al final del bucle interno, de modo que en cada iteración se pase a la siguiente bestia. Así, el método de ataque apuntará a la bestia correspondiente en cada iteración.

Aquí está el código modificado:

for(int h=0; h<ejercitoHeroes.length; h++) {
   for(int b=0; b<ejercitoBestias.length; b++) {
       try {
           System.out.println("Lucha entre " + ejercitoHeroes[h].getNombre() + " (Vida=" + ejercitoHeroes[h].getPuntosVida() + " Armadura="+ejercitoHeroes[h].getArmadura() + ") y " + ejercitoBestias[b].getNombre() + " (Vida=" + ejercitoBestias[b].getPuntosVida()+" Armadura=" + ejercitoBestias[b].getArmadura() + ")");
           int dano = ejercitoHeroes[h].ataque(ejercitoHeroes, ejercitoBestias, b);
           System.out.println(ejercitoHeroes[h].getNombre() + " saca " + dano + " y le quita " + (dano-ejercitoBestias[b].getArmadura()) + " de vida a " + ejercitoBestias[b].getNombre());
           if (ejercitoBestias[b].getPuntosVida() <= 0) {
               System.out.println(ejercitoBestias[b].getNombre() + " ha muerto");
               ejercitoBestias[b] = null;
           } else {
               int danoBestia = ejercitoBestias[b].ataque(ejercitoHeroes, ejercitoBestias, h);
               System.out.println(ejercitoBestias[b].getNombre() + " saca " + danoBestia + " y le quita " + (danoBestia-ejercitoHeroes[h].getArmadura()) + " de vida a " + ejercitoHeroes[h].getNombre());
               if (ejercitoHeroes[h].getPuntosVida() <= 0) {
                   System.out.println(ejercitoHeroes[h].getNombre() + " ha muerto");
                   ejercitoHeroes[h] = null;
               }
           }
       } catch (NullPointerException e) {
           // Ignorar y continuar con la próxima lucha
       }
       b++; // Actualizar la variable b
   }
}

Espero que esto te ayude a solucionar tu problema.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)