[ Foro de Java ]
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.
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.
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
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.)