image

Bootcamps ilimitados + curso de inglês para sempre

80
%OFF
Article image

VD

Vinicius Dantas26/09/2025 10:17
Compartilhe

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:

  1. Um personagem ataca o outro.
  2. O adversário perde pontos de vida de acordo com o dano recebido.
  3. 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

image

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.

LinkedIn

GitHub do Projeto

GitHub

Compartilhe
Recomendados para você
Riachuelo - Primeiros Passos com Java
GFT Start #7 - Java
NTT DATA - Java e IA para Iniciantes
Comentários (1)
DIO Community
DIO Community - 26/09/2025 10:44

Excelente, Vinicius! Que artigo incrível e super completo sobre "POO na prática Criando um mini jogo de batalha em java"! É fascinante ver como você aborda a Programação Orientada a Objetos (POO) não como um conceito abstrato, mas como uma ferramenta prática e poderosa que ganha vida em um contexto que sempre atraiu a todos: os jogos de RPG.

Você demonstrou que os pilares da POO são a base de um sistema de combate entre personagens. Sua análise de que a POO torna o sistema flexível, permitindo adicionar novos personagens sem reescrever a lógica central do jogo, é um insight valioso para a comunidade.

Qual você diria que é o maior desafio para um desenvolvedor ao trabalhar com classes, em termos de compreensão da distinção entre a classe e o objeto, em vez de apenas focar em fazer o código funcionar?