POO na prática Criando um mini jogo de batalha em java
- #Java
POO na Prática: Criando um Mini Jogo de Batalha em Java
#Java #POO #ProgramaçãoOrientadaAObjetos #Games
Quando começamos a estudar Programação Orientada a Objetos (POO), é normal achar os conceitos um pouco abstratos: classes, objetos, herança, polimorfismo... tudo parece distante até que vemos funcionando em algo real.
Foi pensando nisso que decidi aplicar a POO em um contexto que sempre me atraiu: os jogos de RPG. Em vez de apenas ler sobre os pilares da POO, desenvolvi um mini jogo de batalha em Java para enxergar como cada conceito ganha vida na prática.
Neste artigo, vou compartilhar a ideia por trás do projeto, como os pilares da POO se encaixam nele e mostrar a estrutura de classes que transforma código em um pequeno sistema de combate entre personagens.
Entendendo o que é o Encapsulamento, Herança e Polimorfismo.
Para Kristen Nygaard e Ole-Johan Dahl, a orientação a objetos é uma forma de organizar e estruturar o código em torno de objetos, que representam entidades do mundo real.
Esses objetos integram dados (atributos) e ações (métodos), estabelecendo um paradigma de programação que aproxima o raciocínio computacional do pensamento humano. Tal abordagem visa simplificar o desenvolvimento de sistemas complexos, promovendo modularidade, reutilização e abstração.
E para entender isso melhor, vamos trazer o conceito para um exemplo prático: um jogo de RPG.
Encapsulamento: mantendo dados e comportamentos juntos
Pense em cada personagem do jogo como um objeto.
O encapsulamento permite manter juntos os dados (atributos) — como vida, ataque e defesa — e os comportamentos (métodos), como atacar, defender ou usar uma magia.
Como destacou Robert C. Martin em Clean Code, o encapsulamento reduz o acoplamento, ou seja, evita que diferentes partes do sistema dependam em excesso umas das outras.
No contexto do nosso RPG, isso significa que o Guerreiro não precisa saber como o Mago lança um feitiço. Cada personagem mantém sua lógica dentro da própria classe, como se fosse uma cápsula autossuficiente, interagindo apenas quando necessário.
Herança: reaproveitando código e criando especializações
Agora que entendemos o encapsulamento, podemos pensar na reutilização de código.
Esse mecanismo é possível graças à herança, que é a espinha dorsal do sistema de classes em nosso RPG.
Podemos criar uma classe base, chamada Personagem, que define características e comportamentos comuns, como os atributos vida e nome, e métodos como atacar() e receberDano().
A partir dela, criamos classes mais específicas, como Guerreiro, Mago ou Arqueiro.
Essas classes filhas herdam tudo da classe Personagem, mas também adicionam suas próprias habilidades, como golpeDeEscudo() para o Guerreiro ou lancarFeitico() para o Mago.
Polimorfismo: comportamentos diferentes para a mesma ação
Por fim, temos o polimorfismo, que torna o combate do jogo muito mais dinâmico.
Pense na ação de atacar: tanto o Guerreiro quanto o Mago possuem o método atacar(), mas a implementação é diferente. O Guerreiro ataca com espada, enquanto o Mago lança uma magia.
Graças ao polimorfismo, o código principal não precisa se preocupar em saber quem é o personagem. Basta chamar: personagem.atacar();
E o programa decide automaticamente qual versão do método executar.
Isso torna o sistema flexível, permitindo adicionar novos personagens sem reescrever a lógica central do jogo.
Encapsulamento, herança e polimorfismo não são apenas conceitos abstratos: no nosso RPG, eles se tornam ferramentas práticas que organizam o código e permitem expandir o jogo sem complicações desnecessárias.
Agora que entendemos a teoria, vamos ver como esses princípios aparecem na prática, no código do projeto.
O Mini Jogo de Batalha
Para tornar o aprendizado de Programação Orientada a Objetos (POO) mais prático, desenvolvemos um mini jogo de batalha em Java.
A ideia é simples:
- Temos personagens com atributos básicos como vida, ataque e defesa.
- Cada personagem pode realizar ações como atacar e receber dano.
- O combate segue em turnos até que reste apenas um vencedor.
Estrutura do jogo
No coração do projeto temos uma classe base chamada Personagem, que define os atributos e comportamentos comuns a todos os personagens.
A partir dela, criamos subclasses especializadas como:
- Guerreiro 🗡️ → especialista em ataques físicos.
- Mago 🔮 → usa feitiços para causar dano.
- Arqueiro 🏹 → realiza ataques à distância.
Cada classe filha herda características da classe Personagem, mas também pode adicionar ou modificar comportamentos únicos. Isso torna a mecânica de batalha dinâmica e permite expandir o jogo facilmente, adicionando novos tipos de personagens ou habilidades.
Funcionamento
O loop principal da batalha segue uma lógica simples:
- Um personagem ataca o outro.
- O adversário perde pontos de vida de acordo com o dano recebido.
- O combate continua até que um deles chegue a 0 pontos de vida.
Esse modelo, apesar de básico, já é suficiente para ilustrar como os pilares da POO funcionam juntos em um projeto real.
Diagrama de Classe
Poo na Prática
Encapsulamento
Os atributos do personagem (nome, vida, ataque, defesa) são privados. Isso garante que só a própria classe controla como eles são acessados ou modificados.
public abstract class Personagem {
private String nome;
private int vida;
private int ataque;
private int defesa;
public Personagem() {
}
public Personagem(String nome, int vida, int ataque, int defesa) {
this.nome = nome;
this.vida = vida;
this.defesa = defesa;
this.ataque = ataque;
}
public void receberDano(int dano) {
int danoRecebido = Math.max(dano - defesa, 0);
vida -= danoRecebido;
System.out.println(nome + " recebeu " + danoRecebido + " de dano. Vida restante: " + vida);
}
Aqui, o vida não pode ser alterada diretamente por outra classe. Só através de métodos como receberDano(). Isso evita bagunça no estado do personagem.
Herança
A classe Personagem é a base, e Mago, Guerreiro e Arqueiro herdam dela.
public class Mago extends Personagem {
public Mago(String nome){
super(nome, 80, 25, 5);
}
O Mago já nasce com tudo que Personagem tem, mas pode adicionar comportamento próprio (ex.: usar magia).
Polimorfismo
Cada personagem ataca de forma diferente, mas o código principal só precisa chamar atacar().
@Override
public void atacar(Personagem alvo) {
int dado = Dado.rolar("1d20+5");
System.out.println(getNome() + " ataca com sua espada");
alvo.receberDano(dado);
}
O mesmo método (atacar) funciona de várias formas dependendo do tipo do personagem.
Abstração
A classe Personagem é abstrata, ou seja, não pode ser instanciada diretamente. Ela define o que todos os personagens devem ter, mas deixa os detalhes para as subclasses.
public abstract class Atacar {
public abstract void atacar(Personagem alvo);
}
Isso garante que todo personagem tem que implementar o método atacar, mas a forma como isso acontece fica livre.
Aprendizados do projeto
O que ficou mais claro
Ao aplicar POO em um projeto prático, os conceitos deixam de ser apenas definições abstratas.
- Encapsulamento faz sentido quando se percebe que os atributos do personagem não podem ser manipulados de qualquer forma.
- Herança mostrou sua força ao permitir criar novos personagens rapidamente sem repetir código.
- Polimorfismo se revelou no combate: o mesmo comando atacar() gerava comportamentos diferentes, dependendo da classe.
Benefícios de aprender com projetos pequenos
Projetos pequenos são ótimos porque:
- Permite testar ideias sem se perder em detalhes complexos.
- Trazem feedback imediato: dá para rodar o jogo e ver os personagens batalhando.
- São fáceis de expandir ou modificar, mantendo a motivação.
Possibilidades de expansão
Esse exercício abre espaço para diversas melhorias:
- Criar novos personagens (curandeiro, bárbaro, ladrão).
- Adicionar habilidades especiais (magias, golpes críticos, contra-ataques).
- Implementar um sistema de inventário (armas, armaduras, poções).
- Evoluir para um sistema de turnos ou até um mapa simples.
Essas expansões mostram que a base em POO é sólida: você consegue crescer o projeto sem precisar reescrever tudo do zero.
Conclusão
Aprender Programação Orientada a Objetos (POO) se torna muito mais claro e intuitivo quando aplicamos os conceitos em algo concreto, como um mini jogo de batalha em Java. Experimentar, modificar e criar sua própria versão não só reforça o aprendizado, como também desperta a criatividade e o senso de solução de problemas.
Se você se interessou, não hesite em testar, adaptar ou expandir este projeto. Compartilhe suas ideias, resultados e dúvidas — seja no LinkedIn ou na DIO — e faça parte da comunidade de desenvolvedores que aprende na prática.