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
}