Problema de lógica [erro no algoritmo] Ajuda D:

Bom dia galera o/!

Falta muito pouco para terminar esse trabalho, necessito apenas de uma ajuda quanto a esse problema.

   public void VS (Heroi he, Vilao vi, Golpe poder){ 
            
        while (he.getVida() > 0 && vi.getVida() > 0){
            
        int danoheroi = this.getPod() .getPoderh() - this.getPod() .getDefesav() ;
        int danovilao = this.getPod() .getPoderv() - this.getPod() .getDefesah();
        this.getHe().setVida(this.getHe().getVida() - danovilao);// seta a vida atual, levando em conta o dano recebido
        System.out.println ("Okami foi atingido com: " + danovilao + " de dano");
        this.getVi().setVida(this.getVi().getVida() - danoheroi);
        System.out.println("Amaterasu foi atingido com: " + danoheroi + " de dano");

         }
        }
      
}

Quando executo esse método, ele sempre pega os mesmos valores dos sets.

[code] public static void main(String[] args) {
//Não ao certo se devo iniciar esses dois objetos, tanto faz. Foi necessário

Golpe poder = new Golpe();   

Heroi he = new Heroi();
he.setNome("Okami");
he.setVida(100);
poder.setPoderh((int)(Math.random()*5));
poder.setDefesah((int)(Math.random()*10));

// Os atributos de ataque e defesa, já são setados na classe Golpe. E não aqui no objeto > Mudança de planos
Vilao vi = new Vilao();
vi.setNome(“Amaterasu”);
vi.setVida(100);
poder.setPoderv((int)(Math.random()*10));
poder.setDefesav((int)(Math.random()*5));

Luta versus = new Luta();
versus.setHe(he);
versus.setVi(vi);
versus.setPod(poder);
versus.VS(he,vi,poder);

}
}[/code]

Gostaria de fazer com que ele ao final do laço, pegasse valores diferentes no math.random. E isso não sei como fazer =\ Nem tenho ideia por sinal.

O programa retorna isso:

Amaterasu foi atingido com: 1 de dano
Okami foi atingido com: -9 de dano
Amaterasu foi atingido com: 1 de dano
Okami foi atingido com: -9 de dano
Amaterasu foi atingido com: 1 de dano
Okami foi atingido com: -9 de dano
Amaterasu foi atingido com: 1 de dano
Okami foi atingido com: -9 de dano
Amaterasu foi atingido com: 1 de dano
Okami foi atingido com: -9 de dano
Amaterasu foi atingido com: 1 de dano

A idea é fazer com que ele retorne:

Amaterasu foi atingido com: 5 de dano
Okami foi atingido com: 8 de dano
Amaterasu foi atingido com: 4 de dano
Okami foi atingido com: 3 de dano
Amaterasu foi atingido com: 6 de dano
Okami foi atingido com: 7 de dano
Amaterasu foi atingido com: 4 de dano
Okami foi atingido com: 8 de dano
Amaterasu foi atingido com: 2 de dano
Okami foi atingido com: 1 de dano
Amaterasu foi atingido com: 9 de dano

Isso está acontecendo, pois você está chamando o método setPoderh(), setDefesah(), setPoderv() e setDefesav() fora do loop while, então, os valores capturados na primeira chamada serão sempre os mesmos dentro do loop while. Para corrigir isso, coloque os 4 métodos que citei dentro do loop while, retire os métodos do método main() e passe apenas a variável de referência de Poder ‘poder’ para o método VS() e terá o resultado que espera.

poder.setPoderh((int)(Math.random()*5));  
poder.setDefesah((int)(Math.random()*10));

poder.setPoderv((int)(Math.random()*10));  
poder.setDefesav((int)(Math.random()*5));

Ae consegui o/

QUe simples, e eu pesquisando sobre como terminar o loop e iniciar outro D: Muito Obrigado Rafael

Grande abraço ^^

ou você pode usar a classe Random, do pacote java.util