elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda  (Leído 4,167 veces)
yeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda
« en: 30 Enero 2023, 20:31 pm »

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.


En línea

BloodSharp


Desconectado Desconectado

Mensajes: 803


El Messi-Vegeta :D


Ver Perfil
Re: Ayuda
« Respuesta #1 en: 30 Enero 2023, 21:51 pm »

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.

Bienvenido al foro, en este foro se resuelven y ayudan a las personas en base a lo que muestres lo que tengas ya hecho y se tratará de ayudar en base a tu código.


B#


En línea



Tachikomaia


Desconectado Desconectado

Mensajes: 1.180


Superhacker (es broma xD )


Ver Perfil
Re: Ayuda
« Respuesta #2 en: 30 Enero 2023, 23:20 pm »

No sé si entenderé el código, pero me interesa.

A ver, parece que hay 4 peleas al mismo tiempo, todas 1 vs 1.

El daño en principio parece ser al azar, salido de un dado o algo así y reducido por la armadura, que no se va rompiendo (sí ocurre en Doom 95). Pero algunas cuentas parecen mal hechas o no entiendo cómo reduce.

Citar
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
Normalmente la armadura resta o divide al daño.

Daño a Cual = 106-su A(60) = 46 Ok
Daño a Tal = 69-su A(30) = 42 ¿¿¿???

Citar
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
Daño a Cual1 = 76-50 = 26 Ok
Daño a Tal1 = 78-50 = 33 ¿¿¿???

¿La armadura de los Tales funciona distinto o qué?

Tampoco parece muy bueno llamarles Cuales y Tales, hubieras dicho por ejemplo Hs (Héroes) y Ms (Monstruos).

Citar
Hasta ahí diría que todo muy bien
Ok, pero ojo con los resultados negativos, si A es mayor que el daño.

Citar
considerando que tengo 5 heroes contra 4 bestias
¿Y por qué Tal4 no atacó? ¿es una especie de Coliseo, con reglas? ¿o es que en tu juego existe la regla de que un personaje no puede ser atacado por más de 1 personaje? Por ejemplo en Final Fantasy Tactics, con armas de alcance 1 sólo pueden atacar a 1 personaje hasta 4, uno de frente, otro por la espalda y 1 por cada costado.

Citar
lo que no consigo hacer es que vayan rotando cuando uno muere
Eso tiene varias interpretaciones. Por ejemplo si muere H1 ¿quieres que H2 pelee en su lugar, y que H3 pelee contra quien peleaba H2, y que H4 pelee contra quien peleaba H3? ¿o simplemente que el H que estaba observando entre en lugar del caído? ¿y si no hay H disponible el M se quedará mirando sin atacar? Poco tiene de M si hace eso. Dime que irá a comer humanos o algo así, sino esos H parecen villanos.

Debes crear variables Aliado1 = "Heroe1" y otras así y las modificas cuando te apetezca. En el lenguaje que sé se usa eval pero hace tiempo que no lo toco, así en el aire no sabría decirte, a ver.

Código
  1. A1 = "H1"
  2. E1 = "M1"
  3. // E=Enemigo
  4. A2 = "H2"
  5. E2 = "M2"
  6. A3 = "H3"
  7. E3 = "M3"
  8. A4 = "H4"
  9. E4 = "M4"
  10. A5 = "H5"
  11. // Paso 2
  12. N = 1
  13. Daño = random(151)-eval("E"+N+"Ar")
  14. // hay que definir las Ar antes y debes aplicar tu cálculo que no sé cómo es, esto es sólo de ejemplo.
  15. trace ("¡"+eval("A"+N) + " ataca: " + eval("E"+N) + " pierde " + Daño + " HPs!"
  16. set ("E"+N+"HP", eval("E"+N+"HP")-Daño)
  17. // eso resta a la variable E(N)HP, hay que definirlas antes.
  18. Daño = random(151)-eval("A"+N+"Ar")
  19. trace ("¡"+eval("E"+N) + " ataca: " + eval("H"+N) + " pierde " + Daño + " HPs!"
  20. // esto es suponiendo que se atacan al mismo tiempo, sino tienes que chequear que el E siga vivo.
  21. set ("A"+N+"HP", eval("A"+N+"HP")-Daño)
  22. N++
  23. // repites el proceso, de hecho te conviene poner un while limitando el máximo valor de N según el Mínimo de: Aliados, Enemigos.
  24. Si eval("A"+N+"HP") <= 0
  25. // lo siguiente depende de lo que quieras hacer, como dije tiene variaa interpretaciones, pongo lo más difícil de hacer
  26.   A1 = A2
  27.   A2 = A3
  28.   A3 = A4
  29.   A4 = A5
  30. // se podría hacer con un while, yo es que 1ero lo hago a lo bruto y después me doy cuenta, pero también es que me resulta m´s difícil usar whiles.
  31. fin del si
  32. // Tienes que repetir esto porque A2 puede que esté muerto también, y A3, etc. Puedes usar un while... y otro anidado creo... En ambos casos vas variando N (claro usa una variable distinta en 1 caso). En el 1er while varías desde dónde empiezas, aumenta cuando confirmas que el A está ok. A verrr... no pongas el Si que antes puse, pon:
  33. N=1
  34. Do
  35.   Si eval("A"+N+"HP") <= 0
  36.      N2=N
  37.      Do
  38.         set("A"+N2, eval("A"+(N2+1))
  39.         N2++
  40.      while N2<As (o algo similar, prueba, puede ser As-1 o As+1, no sé; As=Aliados disponibles)
  41.   sino
  42.      N++
  43. while N<As (idem)
Algo así, puede que esté mal :laugh:
Luego haces lo propio con los monstruos.
Capaz que te da un error, que un mismo personaje esté en 2 lugares al mismo tiempo, tendría que testearlo, no sé.
« Última modificación: 30 Enero 2023, 23:26 pm por Tachikomaia » En línea

yeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda
« Respuesta #3 en: 31 Enero 2023, 19:32 pm »

A ver, intentaré ejemplificar lo que tengo lo mejor que pueda:

Código:
public abstract class Heroe extends Personaje {



// Constructor heredado.
public Heroe(String nombre, int puntosVida, int armadura) {
super(nombre, puntosVida, armadura);
}

//Metodo sobreescrito.
  @Override
public int tirarDado() {
    int tirada;
int tirada1 = (int) Math.floor(Math.random() * 101);
int tirada2 = (int) Math.floor(Math.random() * 101);

if (tirada1 > tirada2) {
tirada = tirada1;
} else {
tirada = tirada2;
}
return tirada;
}
   
  //Array usado para guardar las tiradas y sincronizarlas con los metodos de ataque.
  public int[] numeros=new int[] {tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado(),
    tirarDado(), tirarDado(), tirarDado(), tirarDado(), tirarDado()};

   //Metodos abstractos que heredaran las clases hijas.
public abstract int ataque(Heroe[] ejercitoHeroes, Bestia[] ejercitoBestias);

}

Primero tengo el constructor que uso para crear los personajes, luego está el método que marca lo que saca un heroe. Luego guardé dichas tiradas en en array, porque si no no consigo que se sinconicen con el metodo principal, el que imprime las tiradas. Y por último, el método de ataque, cada personaje tiene el suyo, más o menos de éste estilo:

Código:
int n = 0;

@Override
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;
}

Luego, aparte de crear los personajes, tengo un array para guardarlos, tipo ejército:

Código:
Heroe[] ejercitoHeroes= {heroe1, heroe2, heroe3, heroe4};

Ya puse en el código que en caso de que una bestia muera, se debe añadir el heroe5 al array, el problema son los métodos de ataque. El método de arriba por ejemplo apunta a la bestia número 1, la idea es que al morir una bestia los héroes vayan rotando, del 1 al 0, del 0 al uno, etc.

No sé si me he explicado bien.
En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Ayuda
« Respuesta #4 en: 31 Enero 2023, 20:09 pm »

Si queres que vayan rotando a medida que mueren podes utilizar una fila como estructura de datos o una lista enlazada pienso. Cada vez que cae uno, se añade al final.
« Última modificación: 31 Enero 2023, 20:17 pm por Locura_23 » En línea

yeza

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda
« Respuesta #5 en: 31 Enero 2023, 20:27 pm »

El problema es que tengo esta clase, que contiene el método principal:

Código:
public class Batalla2 {

//Mas contadores para sincronizar las tiradas con los metodos de ataque.
int nb=0;
int nh=0;
    //Metodo que contiene la batalla por turnos. Use NullPointerException por si
//algun personaje moria, y varios if-else como apoyo adicional.
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++;

Y este fragmento de código:

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

Hace que me roten los nombres, los métodos de ataque me siguen apuntando a la misma bestia, y no sé como conseguir que se actualicen.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines