Como criar Jokenpô com Spring Boot: Arquitetura, Código e APIs REST passo a passo
Aprenda, de forma prática, como construir um jogo de Pedra, Papel e Tesoura (Jokenpô) em Java utilizando Spring Boot, organizando corretamente models, controllers, DTOs e endpoints RESTful.
Por que isso é importante
Desenvolver aplicações de jogos simples com Spring Boot é uma excelente prática para consolidar conceitos de REST, arquitetura limpa e manipulação de dados em Java. Além de exercitar classes, enums e DTOs, você aprende como estruturar projetos prontos para evoluir com novas features e integrações.
Visão Geral: Por que refatorar para Spring Boot?
Adaptar códigos de jogos simples, como Jokenpô, para o Spring Boot permite reaproveitar a lógica já desenvolvida em Java e expor endpoints RESTful modernos e organizados. Com isso, torna-se possível separar responsabilidades usando Controllers, Models e DTOs de maneira clara e escalável, deixando o backend pronto tanto para projetos de estudo quanto para integrações reais.
⚠️Atenção
O uso de Spring Boot acelera o desenvolvimento, mas é fundamental conhecer sua estrutura de pastas e a separação entre camadas, evitando “colocar tudo no mesmo arquivo”.
Reaproveitando o projeto antigo de Jokenpô
Ao analisar um projeto Java tradicional de Jokenpô, é possível aproveitar quase todo o código-base: enums para definir movimentos e regras, classes para jogadores e lógica do game. O diferencial fica por conta do controller REST, ponto de contato da nova arquitetura.
ℹ️Dica
Sempre que possível, reutilize lógica e validações do projeto original. Spring Boot brilha ao integrar com facilidade components já existentes da sua aplicação.
Entendendo as Classes Essenciais
Enum para Jogadas
Use um enum chamado Jogada para definir as regras: Pedra vence Tesoura, Papel vence Pedra, Tesoura vence Papel. Essa abordagem centraliza as comparações e facilita eventuais expansões do game.
Classe Player e Classe Game
Player representa cada participante, com nome e jogada escolhida.
Game centraliza a lógica: randomização da jogada do computador, definição de vencedores, contagem de vitórias e controle de fim de partida.
❌Evite Erros Comuns
Nunca misture lógica de regra do jogo diretamente no controller! Mantenha Game.java responsável pelas decisões e o controller apenas como interface REST.
Organizando a Estrutura de Pastas
✅Boa Prática
Separar DTOs dos models permite modificar a estrutura da API sem mexer na lógica do jogo, garantindo flexibilidade e manutenção facilitada.
Dependências Essenciais do Projeto
A configuração inicial via Spring Initializer deve incluir:
Lombok
Ajuda a reduzir o excesso de getters/setters
Spring Boot DevTools
Facilita o live reload do servidor durante desenvolvimento
⚠️Atenção
Não adicione dependências desnecessárias! Mantenha o projeto leve para facilitar upgrades e evitar conflitos de versões.
Implementando os Models: Enum, Player e Game
venceDe()
.❌Atenção
Garanta que variáveis como finalizado
e os contadores de vitória estejam com valores padrão e expostos por getters.
DTOs: Comunicação Limpa entre Front e Back
• JogadaRequest: recebe a jogada do usuário enviada pelo endpoint.
• ResultadoResponse: retorna informações completas após cada rodada (quem venceu, jogadas, contadores e status do jogo).
Utilize Lombok para agilizar criação de getters/setters e mantenha cada DTO bem enxuto e com finalidade única.
ℹ️Dica de Produtividade
Contrua testes locais ou use ferramentas como Postman/HTTP Request File para validar a troca de dados dos DTOs com o backend!
Controller: Expondo toda regra como API RESTful
@RestController
e defina rota base usando @RequestMapping("/api/jokenpo")
.Game
como atributo, assim o jogo persiste entre chamadas enquanto a instância do controller existir./jogar
consumindo o DTO de request e retornando o de response, tratando lógica de jogo finalizado vs rodada em andamento.❌Evite Erros
Falhas comuns: esquecer de anotar getters/setters ou deixar DTOs sem construtor padrão pode quebrar o binding do JSON na chamada.
Rodando e Testando sua API Jokenpô
⚠️Guia de Solução de Problemas
Se encontrar erros como internal server error
ou not acceptable
, valide se DTOs possuem getters/setters públicos e tipos corretos. Falhas geralmente estão no mapping dos dados via JSON.
Adicionando Validações e Melhorias
É possível expandir a API para adicionar limites de rodadas, reset de partidas e mensagens customizadas, tornando o código ainda mais robusto para uso didático ou integração com frontends.
Considere internacionalizar respostas e limitar tentativas para facilitar testes automatizados.
✅Refinamento
Use variáveis booleanas, contadores e enums para manter o fluxo do jogo e a clareza do código. Isso facilita futuras integrações e manutenção.
Principais Cuidados ao Projetar Endpoints de Jogos
• Garanta idempotência das rotas.
• Ofereça respostas claras, inclusive quando a partida já está encerrada.
• Mantenha o controller sem regras de jogo, delegando tudo para o Model.
• Inicialize corretamente jogadores e suas jogadas a cada nova requisição.
✅Boas Práticas
Por padrão, nunca exponha diretamente Models nas rotas. DTOs isolam o domínio e tornam a API mais estável!
Comparativo: Java puro vs Spring Boot para APIs de jogos
Java Puro
Execução em terminal/CLI, lógica regionalizada, sem exposição HTTP
Prós
- Mais controle do fluxo de execução
- Ideal para prototipação inicial
Contras
- Sem possibilidade fácil de integração
- Pouca escalabilidade
Spring Boot
Estrutura já pronta para REST, escalável, integração facilitada com frontend ou automações
Prós
- Endpoints RESTful prontos para qualquer consumidor
- Manutenção e extensão facilitadas
Contras
- Requer conhecimento de arquitetura Spring
- Curva de aprendizado maior
Checklist de Implementação do Jokenpô com Spring Boot
✅Transforme sua carreira
E foi EXATAMENTE por isso que eu criei um curso de Node.js e React chamado CrazyStack. A minha maior necessidade no início da carreira era alguém que me ensinasse um projeto prático onde eu pudesse não só desenvolver minhas habilidades de dev como também lançar algo pronto para entrar no ar no dia seguinte.
Sabe qual era minha maior frustração? Aplicar conhecimentos teóricos em projetos práticos e reais, mas não encontrar ninguém que me ensinasse COMO fazer isso na prática! Era exatamente a mesma frustração que você deve sentir: acumular informação sem saber como implementar na prática.
Assim como você precisa de estratégias claras e implementação prática para ter sucesso, todo desenvolvedor precisa de um projeto estruturado para sair do teórico e partir para a execução. É como ter todas as peças do quebra-cabeça mas não saber como montá-las - você pode ter conhecimento técnico, mas sem um projeto completo, fica difícil transformar esse conhecimento em resultados concretos.
No CrazyStack, você constrói um SaaS completo do zero - backend robusto em Node.js, frontend moderno em React, autenticação, pagamentos, deploy, tudo funcionando. É o projeto que eu queria ter quando comecei: algo que você termina e pode colocar no ar no mesmo dia, começar a validar com usuários reais e até monetizar.