Interação de classe

Galerinha to com um problema no meu condoído jogo, quando uso a habilidade ela esta afetando os 2 jogadores quando deveria afetar apenas o alvo “adversário”, no console exibe…
Marcos, Foi mais agil!

O que deseja fazer Marcos?

  1. Atacar!

  2. Usar Skil!

  3. Usar Item!

  4. Concentrar!

2

qual skildeseja Usar?

1

Mago perdeu 8 pontos de vida. Vida atual: 72

Mago está em chamas! // o Mago não deve ser afetado pela própria habilidade!

Guerreiro perdeu 10 pontos de vida. Vida atual: 90

Guerreiro sofreu 10 de dano por estar em chamas.

Meu código…

package Crd;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import Sk.Habilidade;

public class DadosCard {

    public String nome;
    public String tipo;
    public String elemento;
    public boolean lvUp=true;
    public int lv = 1;
    public int vida;
    public int mana;
    public int at;
    public int def;
    public int agl;
    //
    public int deltaAt;


    private List<Habilidade> habilidadesAtivas;
    
    
    public void usarSkils(int escolhaSkil) {}

    public DadosCard() {
        habilidadesAtivas = new ArrayList<>();
    }

    public void adicionarHabilidade(Habilidade habilidade) {
        habilidadesAtivas.add(habilidade);
        habilidade.ativar(this, this);
    }

    public void aplicarHabilidades(DadosCard invocador, DadosCard adversario) {
        Iterator<Habilidade> iterador = habilidadesAtivas.iterator();
        while (iterador.hasNext()) {
            Habilidade habilidade = iterador.next();
            habilidade.aplicarEfeitoContinuo(invocador, adversario);

            habilidade.reduzirDuracao();
            if (habilidade.estaExpirada()) {
                habilidade.expirar(invocador, adversario);
                iterador.remove();
            }
        }
    }

//// Metodos auxiliares
    
    public void aumentarAtaque(int quantidade) {
        at += quantidade;
        System.out.println(nome + " aumentou " + quantidade + " pontos de ataque. Ataque atual: " + at);
    }
    
    public void reduzirAtaque(int quantidade) {
        at += quantidade;
        System.out.println(nome + " reduziu " + quantidade + " pontos de ataque. Ataque atual: " + at);
    }
    
    public void reduzirMana(int quantidade) {
        mana -= quantidade;
        
    }
    
    public void reduzirVida(int quantidade) {
        vida -= quantidade;
        System.out.println(nome + " perdeu " + quantidade + " pontos de vida. Vida atual: " + vida);
    }

    public void aumentarVida(int quantidade) {
        vida += quantidade;
        System.out.println(nome + " ganhou " + quantidade + " pontos de vida. Vida atual: " + vida);
    }

 

}

Seu post está incompleto, posta todas as classes envolvidas.

import java.util.Scanner;

import Pl.Players;

public class Arena {

	private Players p1;
	private Players p2;
	public Scanner ler = new Scanner(System.in);
	public int resp;

	public Arena() {
		p1 = new Players();
		p2 = new Players();
		p1.card.usarSkils(2); // ex de  habilidaedes
		//p2.card.usarSkils(2);
		// Simula 5 rodadas
		for (int rodada = 1; rodada <= 5; rodada++) {
			System.out.println("=== Rodada " + rodada + " ===");
			
			//
			//verVez();

			
			//
			
			 // Jogador 1 ativa habilidades
		    p1.card.aplicarHabilidades(p1.card, p2.card);

		    // Jogador 2 ativa habilidades
		    p2.card.aplicarHabilidades(p2.card, p1.card);
		}
	}

	public void verVez() {

		int p1Agl = p1.r.nextInt(p1.card.agl);
		int p2Agl = p2.r.nextInt(p2.card.agl);
		
		
		
		if (p1Agl == p2Agl) {
			verVez();
		} else if (p1Agl > p2Agl) {
			
			System.out.println("P1.agl= "+p1Agl+"  P2.agl= "+p2Agl);
			System.out.println("P1 Foi mas agil!");
			System.out.println("O que deseja fazer P1?");
			resp=ler.nextInt();

		} else if (p1Agl < p2Agl) {
			System.out.println("P1.agl= "+p1Agl+"  P2.agl= "+p2Agl);
			System.out.println("P2 Foi mas agil!");
			System.out.println("O que deseja fazer P2?");
			resp=ler.nextInt();
		}

	}

}package Pl;

import java.util.Random;

import Crd.DadosCard;
import Crd.Guerreiro;
import Crd.Mago;

public class Players {
	
	   public DadosCard card;
	    public Random r = new Random();
	    public int dano;

	    public Players() {
	        card = sortearCard();
	        apresentar();
	    }

	    public void apresentar() {
	        System.out.println("Nome: " + card.nome + "  LV: " + card.lv);
	        System.out.println("Vida: " + card.vida + "  Mana: " + card.mana);
	        System.out.println("At: " + card.at + "  Def: " + card.def + "  Agl: " + card.agl);
	        System.out.println();
	    }

	    public DadosCard sortearCard() {
	        int id = r.nextInt(2);
	        switch (id) {
	            case 0:
	                return new Guerreiro();
	            case 1:
	                return new Mago();
	            default:
	                return null;
	        }
	    }
}package Crd;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import Sk.Habilidade;

public class DadosCard {

    public String nome;
    public String tipo;
    public String elemento;
    public boolean lvUp=true;
    public int lv = 1;
    public int vida;
    public int mana;
    public int at;
    public int def;
    public int agl;
    //


    private List<Habilidade> habilidadesAtivas;
    
    
    public void usarSkils(int escolhaSkil) {}

    public DadosCard() {
        habilidadesAtivas = new ArrayList<>();
    }

    public void adicionarHabilidade(Habilidade habilidade) {
        habilidadesAtivas.add(habilidade);
        habilidade.ativar(this, this);
    }

    public void aplicarHabilidades(DadosCard invocador, DadosCard adversario) {
        Iterator<Habilidade> iterador = habilidadesAtivas.iterator();
        while (iterador.hasNext()) {
            Habilidade habilidade = iterador.next();
            habilidade.aplicarEfeitoContinuo(invocador, adversario);

            habilidade.reduzirDuracao();
            if (habilidade.estaExpirada()) {
                habilidade.expirar(invocador, adversario);
                iterador.remove();
            }
        }
    }

//// Metodos auxiliares
    
    public void aumentarAtaque(int quantidade) {
        at += quantidade;
        System.out.println(nome + " aumentou " + quantidade + " pontos de ataque. Ataque atual: " + at);
    }
    
    public void reduzirAtaque(int quantidade) {
        at += quantidade;
        System.out.println(nome + " reduziu " + quantidade + " pontos de ataque. Ataque atual: " + at);
    }
    
    public void reduzirMana(int quantidade) {
        mana -= quantidade;
        
    }
    
    public void reduzirVida(int quantidade) {
        vida -= quantidade;
        System.out.println(nome + " perdeu " + quantidade + " pontos de vida. Vida atual: " + vida);
    }

    public void aumentarVida(int quantidade) {
        vida += quantidade;
        System.out.println(nome + " ganhou " + quantidade + " pontos de vida. Vida atual: " + vida);
    }

 

}package Crd;

import Pl.Players;
import Sk.PackSkils;

public class Guerreiro extends DadosCard {

	public Guerreiro() {

		invocarCard();

	}

	public void invocarCard() {

		if (lvUp == true) {
			switch (lv) {
			case 1:

				nome = "Guerreiro";
				tipo = "";
				elemento = "Pedra";
				vida = 100;
				mana = 20;
				at = 10;
				def = 5;
				agl = 5;
				lvUp = false;
				
				
				break;

			case 2:
				vida += 100;
				mana += 20;
				at += 10;
				def += 3;
				agl += 3;
				lvUp = false;
				break;

			case 3:
				vida += 150;
				mana += 25;
				at += 15;
				def += 8;
				agl += 5;
				lvUp = false;
				break;

			default:
				throw new IllegalArgumentException("Esse level nao existe!");

			}
		}
	}
	
	
	public void exibirSkils() {
		
		System.out.println("1.Super Soco! [-2 Mp]- Ataque recebe +5p");
		System.out.println("1.Furia! [-5 Mp]- Ataque recebe +5p, duante 5 turnos");
	}
	
	
	public void usarSkils(int escolhaSkil) {
		
		if(escolhaSkil==1) {

			   // Adiciona habilidades iniciais
	        adicionarHabilidade(PackSkils.superSoco(2,5));
		}
		
		if(escolhaSkil==2) {

			   // Adiciona habilidades iniciais
	        adicionarHabilidade(PackSkils.furia(5,5));
		}
		
		}

}package Crd;

import java.util.Random;

import Sk.PackSkils;

public class Mago extends DadosCard {

	public Mago() {

		invocarCard();
	}

	public void invocarCard() {

		if (lvUp == true) {
			switch (lv) {
			case 1:

				nome = "Mago";
				tipo = "";
				elemento = "Fogo";
				vida = 80;
				mana = 50;
				at = 5;
				def = 3;
				agl = 2;
				lvUp = false;
				 // Adiciona habilidades iniciais
		      
				break;

			case 2:
				vida += 35;
				mana += 50;
				at += 4;
				def += 3;
				agl += 3;
				lvUp = false;
				break;

			case 3:
				vida += 50;
				mana += 70;
				at += 10;
				def += 8;
				agl += 5;
				lvUp = false;
				break;

			default:
				throw new IllegalArgumentException("Esse level nao existe!");

			}
		}
	}

	public void exibirSkils() {
		
		System.out.println("1.Bola de Fogo! [-2 Mp]- Ataque recebe +5p");
		System.out.println("2.Cura [-5 Mp]- Ataque recebe +5p, duante 5 turnos");
	}
	
	public void usarSkils(int escolhaSkil) {
		
		if(escolhaSkil==1) {

			adicionarHabilidade(PackSkils.bolaDeFogo(3, 8));
		
			int chances = new Random().nextInt(2)+1;
			chances=2;
			if(chances==2) {
			   adicionarHabilidade(PackSkils.incendiar(3, 5, 15));
			}
		}
		
		if(escolhaSkil==2) {
			int dano = new Random().nextInt(10);
			adicionarHabilidade(PackSkils.envenenamento(5,dano));
			
		}
		
		
		
		}
	

}package Sk;

import Crd.DadosCard;

public class Skils {

	
	  private String nome; // Nome da habilidade
	    private String descricao; // Descrição da habilidade
	    private int duracao; // Duração em rodadas
	    private Efeito habilidadeInicial; // Efeito que ocorre ao ativar
	    private Efeito habilidadeContinua; // Efeito que ocorre em cada rodada
	    private Efeito habilidadeFinal; // Efeito que ocorre ao expirar

	    // Construtor da habilidade
	    public Skils(String nome, String descricao, int duracao, 
	                      Efeito habilidadeInicial, Efeito habilidadeContinua, Efeito habilidadeFinal) {
	        this.nome = nome;
	        this.descricao = descricao;
	        this.duracao = duracao;
	        this.habilidadeInicial = habilidadeInicial;
	        this.habilidadeContinua = habilidadeContinua;
	        this.habilidadeFinal = habilidadeFinal;
	    }

	    // Ativa o efeito inicial da habilidade
	    public void ativar(DadosCard invocador, DadosCard alvo) {
	        if (habilidadeInicial != null) {
	            habilidadeInicial.aplicar(invocador, alvo);
	        }
	    }

	    // Aplica o efeito contínuo da habilidade
	    public void aplicarEfeitoContinuo(DadosCard invocador, DadosCard alvo) {
	        if (habilidadeContinua != null) {
	            habilidadeContinua.aplicar(invocador, alvo);
	        }
	    }

	    // Aplica o efeito final da habilidade ao expirar
	    public void expirar(DadosCard invocador, DadosCard alvo) {
	        if (habilidadeFinal != null) {
	            habilidadeFinal.aplicar(invocador, alvo);
	        }
	    }

	    // Diminui a duração em 1 rodada
	    public void reduzirDuracao() {
	        duracao--;
	    }

	    // Verifica se a habilidade expirou
	    public boolean estaExpirada() {
	        return duracao <= 0;
	    }

	    public int getDuracao() {
	        return duracao;
	    }
	
	
	    
}package Sk;

import java.util.Random;

import Pl.Players;

public class PackSkils {

	public static Habilidade superSoco(int consumoMana, int aumentoAtaque) {
	    return new Habilidade(
	        consumoMana,
	        "Super Soco",
	        "Aumenta o ataque do invocador em " + aumentoAtaque,
	        3,
	        (invocador, alvo) -> invocador.aumentarAtaque(aumentoAtaque),
	        null,
	        (invocador, alvo) -> invocador.reduzirAtaque(-aumentoAtaque),
	        true, // afetaInvocador
	        false // afetaAdversario
	    );
	}
	
	public static Habilidade bolaDeFogo(int consumoMana, int dano) {
	    return new Habilidade(
	        consumoMana,
	        "Bola de Fogo",
	        "Causa " + dano + " de dano ao adversário.",
	        0,
	        (invocador, alvo) -> alvo.reduzirVida(dano),
	        null,
	        null,
	        false, // afetaInvocador
	        true // afetaAdversario
	    );
	}
	
	

	public static Habilidade furia(int consumoMana, int aumentoAtaque) {
		return new Habilidade(consumoMana, 
				"Fúria",
				"Aumenta o ataque do invocador em " + aumentoAtaque + " durante 3 rodadas.", 3,
				(invocador, alvo) -> invocador.aumentarAtaque(aumentoAtaque), null, null, true, false);
	}

	
	public static Habilidade envenenamento(int consumoMana, int dano) {
		return new Habilidade(consumoMana, "Envenenamento", "Causa 200 de dano por turno ao inimigo durante 3 rodadas.",
				3, null, (invocador, alvo) -> alvo.reduzirVida(dano), null, false, true);
	}
	
	
	public static Habilidade incendiar(int consumoMana, int danoMin, int danoMax) {
	    Random random = new Random();
	    return new Habilidade(
	        consumoMana,
	        "Incendiar",
	        "Causa dano aleatório entre " + danoMin + " e " + danoMax + " ao alvo por 3 rodadas.",
	        3,
	        (invocador, alvo) -> System.out.println(alvo.nome + " está em chamas!"), // Efeito inicial (opcional)
	        (invocador, alvo) -> {
	            int dano = random.nextInt(danoMax - danoMin + 1) + danoMin;
	            alvo.reduzirVida(dano);
	            System.out.println(alvo.nome + " sofreu " + dano + " de dano por estar em chamas.");
	        },
	        (invocador, alvo) -> System.out.println(alvo.nome + " não está mais em chamas.") // Efeito final (opcional)
, false, true
	    );
	}

}package Sk;

import Crd.DadosCard;

public class Habilidade {
    private String nome; // Nome da habilidade
    private String descricao; // Descrição da habilidade
    private int duracao; // Duração em rodadas
    private Efeito habilidadeInicial; // Efeito que ocorre ao ativar
    private Efeito habilidadeContinua; // Efeito que ocorre em cada rodada
    private Efeito habilidadeFinal; // Efeito que ocorre ao expirar
    private boolean afetaInvocador; // Define se o efeito aplica no invocador
    private boolean afetaAdversario; // Define se o efeito aplica no adversário

    // Construtor da habilidade
    public Habilidade(int custoMana, String nome, String descricao, int duracao,
            Efeito habilidadeInicial, Efeito habilidadeContinua, Efeito habilidadeFinal,
            boolean afetaInvocador, boolean afetaAdversario) {
this.nome = nome;
this.descricao = descricao;
this.duracao = duracao;
this.habilidadeInicial = habilidadeInicial;
this.habilidadeContinua = habilidadeContinua;
this.habilidadeFinal = habilidadeFinal;
this.afetaInvocador = afetaInvocador;
this.afetaAdversario = afetaAdversario;
}

    // Ativa o efeito inicial da habilidade
    public void ativar(DadosCard invocador, DadosCard alvo) {
        if (habilidadeInicial != null) {
            if (afetaInvocador) habilidadeInicial.aplicar(invocador, invocador);
            if (afetaAdversario) habilidadeInicial.aplicar(invocador, alvo);
        }
    }
    public void aplicarEfeitoContinuo(DadosCard invocador, DadosCard alvo) {
        if (habilidadeContinua != null) {
            if (afetaInvocador) habilidadeContinua.aplicar(invocador, invocador);
            if (afetaAdversario) habilidadeContinua.aplicar(invocador, alvo);
        }
    }

    public void expirar(DadosCard invocador, DadosCard alvo) {
        if (habilidadeFinal != null) {
            if (afetaInvocador) habilidadeFinal.aplicar(invocador, invocador);
            if (afetaAdversario) habilidadeFinal.aplicar(invocador, alvo);
        }
    }
    // Diminui a duração em 1 rodada
    public void reduzirDuracao() {
        duracao--;
    }

    public boolean estaExpirada() {
        return duracao <= 0;
    }
    public int getDuracao() {
        return duracao;
    }
} package Sk;

import Crd.DadosCard;

//OBS: interface com um unico metodo
// essa pode ser criada uma espreçao lambida
public interface Efeito { 

    void aplicar(DadosCard invocador, DadosCard alvo); // Aplica o efeito de uma habilidade
	
}