RPG em turnos: Jogador e Inimigo recebem o mesmo dano

Boa tarde!

estou fazendo um jogo em Java de uma simples batalha em RPG em turnos: Onde é você vs um CPU em OO. Estou usando a mesma classe para serem o jogador e o inimigo

ao mesmo tempo e as duas tem o método ataque e recebe dano. Entretanto quando um testo e ataco, tanto o jogador e o adversário recebem dano a mesma quantidade de dano, fora além de não seguir a condição de morte que eu coloquei.

Aqui está o meu código:

Classe.

import java.util.Random;

class Personagem extends Atributos
{

//ATRIBUTOS

public static String nome;
public static String classe; 
public static int defesa;
public static int critico;
public static int danoMinimo; 
public static int danoMaximo; 
public static int healthPoints;
public static int manaPoints; 

//CONSTRUTOR

public Personagem ()
{
    this.nome = ""; 
    this.classe = "Mago"; 
    this.vitalidade = 10;
    this.armadura = 10; 
    this.forca = 10;
    this.inteligencia = 10;
    this.agilidade = 10; 
    this.sorte = 10; 
    this.defesa = 10 + this.armadura; 
    this.critico = this.sorte / 100; 
    this.healthPoints = 100;
    this.manaPoints = 100; 
    this.danoMinimo = 10;
    this.danoMaximo = 20; 
}

//SETTERS 

public void setNome (String nome)
{
    this.nome = nome;
}

public void setClasse (String classe)
{
    this.classe = classe;
}

public void setDefesa (int defesa)
{
    this.defesa = defesa;
}

public void setCritico (int critico)
{
    this.critico = critico; 
}

public void setHealthPoints (int healthPoints)
{
    this.healthPoints = healthPoints;
}

public void setManaPoints (int manaPoints)
{
    this.manaPoints = manaPoints;
}

public void setDanoMinimo (int danoMinimo)
{
    this.danoMinimo = danoMinimo;
}

public void setDanoMaximo (int danoMaximo)
{
    this.danoMaximo = danoMaximo; 
}

//GETTERS

public String getNome ()
{
    return this.nome;
}

public String getClasse ()
{
    return this.classe;
}

public int getDefesa ()
{
    return this.defesa;
}

public int getCritico ()
{
    return this.critico; 
}

public int getHealthPoints ()
{
    return this.healthPoints;
}

public int getManaPoints ()
{
    return this.manaPoints; 
}

public int getDanoMinimo ()
{
    return this.danoMinimo;
}

public int getDanoMaximo ()
{
    return this.danoMaximo;
}

public void Ataque (Personagem inimigo)
{
    Random rand = new Random();

    int ataque; 

    ataque = rand.nextInt(this.danoMaximo) + this.danoMinimo; 
    inimigo.healthPoints = ataque - inimigo.defesa; 

}

public void recebeDano (Personagem inimigo ,int ataque)
{
    this.healthPoints = ataque - defesa;

}

}
Programa principal:

import java.util.Scanner;
import java.util.Random;

class Partida
{
static Scanner scanf = new Scanner(System.in);
static Random rand = new Random();

static Personagem jogador = new Personagem(); 
static Personagem inimigo = new Personagem(); 

public static void main(String[] args)
{
	Introducao();
	telaPersonagem();
	chamaTurno();
	jogadorTurno();
	cpuTurno();
	vitoria();

}

public static void Introducao ()
{
	System.out.println("SEJA BEM-VINDO A ARENA, GUERREIRO! DIGA-NOS SEU NOME: "); 
	jogador.setNome("LUCAS"); 
	inimigo.setNome("LUCAS"); 
	
}

public static void telaPersonagem() // MOSTRA A TELA COM INFORMAÇÕES DOS PERSONAGENS 
{
	System.out.println("NOME: " + jogador.getNome() + "					    NOME:" + inimigo.getNome());
	System.out.println("HP: " + jogador.getHealthPoints() + "				HP: "  + inimigo.getHealthPoints());
	System.out.println("MP: " + jogador.getManaPoints() + "					MP: "  + inimigo.getManaPoints());

}

public static void chamaTurno() 
{

	int jogadorAgi; 
	int cpuAgi; 

	do
	{

	jogadorAgi = rand.nextInt(1) + jogador.getAgilidade(); 
	cpuAgi = rand.nextInt(1) + inimigo.getAgilidade(); 

		if(jogadorAgi > cpuAgi)
		{
			jogadorTurno(); 

		} else
		{


		}

	} while(jogadorAgi != cpuAgi);

}

public static void jogadorTurno()
{
	int acao; 

	do
	{

		System.out.println("SEU TURNO"); 
		System.out.println(""); 
		System.out.println("Escolha uma acao"); 
		System.out.println("1 - Atacar"); 
		System.out.println("2 - Atacar forte"); 
		System.out.println("3 - Atacar FORTE MESMO"); 
		acao = scanf.nextInt(); 

		switch(acao)
		{
			case 1 : 
				jogador.Ataque(inimigo);
				System.out.println("Ataque realizado com sucesso"); 
                telaPersonagem();
				chamaTurno(); 
				break; 

			default : 
				System.out.println("Digite um comando valido"); 
		}	

	} while(jogador.healthPoints != 0 || jogador.healthPoints < 0); 

}

public static void cpuTurno()
{
	int acao; 

	acao = rand.nextInt(1) + 3;

	System.out.println("TURNO INIMIGO"); 

	do
	{
		switch (acao)
		{
			case 1:
				inimigo.Ataque(jogador); 
				System.out.println("Você e atacado com sucesso"); 
				chamaTurno();
				break;

			case 2: 
				inimigo.Ataque(jogador); 
				System.out.println("Você e atacado com sucesso"); 
				chamaTurno(); 
				break;

			case 3:
				inimigo.Ataque(jogador); 
				System.out.println("Você e atacado com sucesso");  
				break;
		}
	} while(inimigo.healthPoints != 0 || inimigo.healthPoints <= 0);

}

public static void vitoria()
{
	if(jogador.healthPoints == 0)
	{
		System.out.println("voce perdeu!");
	}

	if(inimigo.healthPoints == 0)
	{
		System.out.println("voce venceu!");
	}
}

}
Alguém sabe o que estou fazendo de errado? Obrigado!

Os atributos da classe Personagem são estáticos (static). Isso significa que são compartilhados entre todas as instâncias dessa classe, seja o jogador ou o inimigo. Acho que não é isso que você quer.

Eles também estão públicos (public), o que faz com que possam ser acessados diretamente pelo nome. Também acredito que não é algo que você queira, já que criou gets e sets pra eles. Considere deixar todos os atributos privados.

Abraço.