Um jogo da forca completo desenvolvido com Spring Boot, demonstrando conceitos de Programação Orientada a Objetos e arquitetura de aplicações web modernas.
Este projeto implementa o clássico jogo da forca com uma arquitetura cliente-servidor:
- Backend: API RESTful desenvolvida com Spring Boot
- Frontend: Interface web responsiva usando HTML, CSS e JavaScript puro
- Recursos: Autenticação de usuários, ranking de jogadores, sistema de equipes e diferentes níveis de dificuldade
O jogo permite que os jogadores tentem adivinhar uma palavra secreta, letra por letra, antes que o boneco seja completamente desenhado na forca. Os jogadores podem escolher palavras aleatórias ou personalizadas e definir o nível de dificuldade.
- Java 17 ou superior
- Maven 3.6+
- Git (opcional, para clonar o repositório)
- Clone o repositório (ou baixe o código-fonte):
git clone https://github.com/HugoNicolau/Forca-SpringBoot.git
cd Forca-SpringBoot- Execute o aplicativo Spring Boot:
cd forca
./mvnw spring-boot:run- Acesse a aplicação:
Abra seu navegador e acesse:
http://localhost:8080
Se você estiver desenvolvendo o projeto, recomendamos adicionar o Spring Boot DevTools para habilitar o recarregamento automático:
- Caso não tenha, adicione a dependência no pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>- Reinicie o servidor para que as alterações tenham efeito.
src/main/java/com/jogodaforca/forca/
├── config/ # Configurações da aplicação
│ └── WebConfig.java # Configuração CORS e Web
├── controller/ # Controladores REST
│ ├── EquipeController.java
│ ├── PartidaController.java
│ ├── PalavraController.java
│ └── UsuarioController.java
├── dto/ # Objetos de Transferência de Dados
│ ├── EquipeDTO.java
│ ├── PartidaDTO.java
│ └── UsuarioDTO.java
├── model/ # Entidades e modelos de domínio
│ ├── BaseEntity.java # Classe base para entidades
│ ├── Equipe.java
│ ├── EstadoDaForca.java
│ ├── Jogador.java # Classe abstrata
│ ├── JogadorBot.java
│ ├── JogadorHumano.java
│ ├── LetraTentada.java
│ ├── Palavra.java
│ ├── Partida.java
│ ├── StatusPartida.java
│ └── Usuario.java
├── repository/ # Interfaces de repositórios JPA
│ ├── EquipeRepository.java
│ ├── PartidaRepository.java
│ └── UsuarioRepository.java
├── service/ # Serviços de negócio
│ ├── EquipeService.java
│ ├── JogadorService.java
│ ├── PartidaService.java
│ └── UsuarioService.java
├── util/ # Classes utilitárias
│ └── Resultado.java # Wrapper para respostas da API
└── ForcaApplication.java # Classe principal da aplicação
src/main/resources/
├── static/ # Recursos estáticos
│ ├── css/
│ │ └── styles.css # Estilos da aplicação
│ ├── js/
│ │ ├── api.js # Cliente para a API REST
│ │ ├── equipe.js # Gerenciamento de equipes
│ │ ├── forca.js # Lógica do jogo
│ │ └── usuario.js # Autenticação e perfil
│ ├── img/
│ │ └── forca-estados/ # Imagens do jogo
│ │ ├── forca0.png
│ │ └── ...
│ └── index.html # Página principal
└── application.properties # Configurações da aplicação
-
Cadastro e Autenticação de Usuários
- Login com usuário e senha
- Registro de novos usuários
-
Jogo da Forca
- Palavras aleatórias ou personalizadas
- Diferentes níveis de dificuldade
- Interface visual interativa
-
Ranking e Estatísticas
- Classificação de jogadores por taxa de vitória
- Estatísticas individuais (vitórias, derrotas, etc.)
-
Sistema de Equipes
- Criação e gerenciamento de equipes
- Adição de jogadores às equipes
- Ranking de equipes
O projeto segue uma arquitetura orientada a objetos com hierarquia de classes bem definida:
- Herança: Classes como
JogadorHumanoeJogadorBotherdam deJogador - Encapsulamento: Atributos privados com getters/setters
- Polimorfismo: Diferentes tipos de jogadores com comportamentos específicos
- Abstração: Classes abstratas como
BaseEntitye interfaces definem contratos
Este projeto demonstra os principais conceitos de Programação Orientada a Objetos:
Usuario,Partida,Palavra, etc. representam entidades do mundo real como classes- Instâncias destas classes são criadas e manipuladas durante o jogo
- Exemplo:
TentativaDTOrepresenta uma tentativa de letra no jogo da forca (src/main/java/com/jogodaforca/forca/dto/TentativaDTO.java)
- Atributos privados com getters/setters controlam o acesso aos dados
- Exemplo:
private String senha;emUsuariocom métodos públicos para acesso controlado - Método
setLetra(char letra)emLetraTentadavalida e formata a entrada (src/main/java/com/jogodaforca/forca/model/LetraTentada.java)
BaseEntityé base para todas as entidades, fornecendo atributos comuns (id, timestamps)JogadorHumanoeJogadorBotherdam deJogadorPartidaResumidaDTOePartidaDetalhadaDTOestendemPartidaDTOpara diferentes níveis de detalhamento- Exemplo:
public class Partida extends BaseEntity(src/main/java/com/jogodaforca/forca/model/Partida.java)
Jogadordeclara método abstratoescolherPalavra()implementado diferentemente emJogadorHumanoeJogadorBotUsuarioimplementa a interfaceEstatisticaCalculavelpara ser tratado como tal- Sobrescrita de
toString()em várias classes para representação personalizada - Exemplo:
@Override public int calcularPontuacao(...)emJogadorHumano(src/main/java/com/jogodaforca/forca/model/JogadorHumano.java)
- Interface
EstatisticaCalculaveldefine comportamento sem detalhar implementação - Classe abstrata
BaseEntitygeneraliza conceito de entidade persistente - Classe abstrata
Jogadordefine comportamentos comuns sem implementação completa - Exemplo:
public abstract class Jogador extends BaseEntity(src/main/java/com/jogodaforca/forca/model/Jogador.java)
private: Atributos comosenhaemUsuariopara máximo encapsulamentoprotected:nivelemJogadorpermite acesso a subclasses mas protege de externos- Package-private (default):
experienciaemJogadoracessível apenas no mesmo pacote public: Métodos da API disponibilizados externamente- Exemplo: Diferentes modificadores na classe
Jogador(src/main/java/com/jogodaforca/forca/model/Jogador.java)
Partidatem associação comUsuario(um para muitos)Partidatem associação comPalavra(um para um)Usuariotem associação com múltiplasPartida(um para muitos)- Exemplo:
@ManyToOne private Usuario usuario;emPartida(src/main/java/com/jogodaforca/forca/model/Partida.java)
ConfiguracaoJogadoré parte intrínseca doJogador(não existe independentemente)@Embedded private ConfiguracaoJogador configuracao;emJogador- Exemplo:
@Embedded private ConfiguracaoJogador configuracao = new ConfiguracaoJogador();(src/main/java/com/jogodaforca/forca/model/Jogador.java)
EquipeagregaJogadorHumanomas ambos existem independentementeList<JogadorHumano> jogadoresemEquipe- Exemplo:
@OneToMany(mappedBy = "equipe") private List<JogadorHumano> jogadores;(src/main/java/com/jogodaforca/forca/model/Equipe.java)
- Uso de
List<Partida>emUsuariopara armazenar as partidas do usuário Set<Character>para armazenar letras corretas e erradas emPartidaDTOMap<ID, T>emRepositoriopara armazenar elementos por chave- Exemplo:
private List<Partida> partidas = new ArrayList<>();emUsuario(src/main/java/com/jogodaforca/forca/model/Usuario.java)
Resultado<T>encapsula resultados de operações com tipo específicoRepositorio<T, ID>implementa repositório para qualquer tipo- Exemplo:
public class Resultado<T> {...}(src/main/java/com/jogodaforca/forca/util/Resultado.java)
Palavratem múltiplos construtores com diferentes parâmetrosPartidatem construtores com diferentes combinações de parâmetros- Exemplo:
public Partida(),public Partida(Usuario usuario, Palavra palavra),public Partida(Usuario usuario, Palavra palavra, String dificuldade)(src/main/java/com/jogodaforca/forca/model/Partida.java)
toDTO()implementado em todas as subclasses deBaseEntityescolherPalavra()implementado emJogadorHumanoeJogadorBot- Exemplo:
@Override public Object toDTO()emUsuario(src/main/java/com/jogodaforca/forca/model/Usuario.java)
BaseEntitydefine comportamento comum a todas as entidadesJogadordefine comportamento comum a todos os jogadores- Exemplo:
@MappedSuperclass public abstract class BaseEntity {...}(src/main/java/com/jogodaforca/forca/model/BaseEntity.java)
EstatisticaCalculaveldefine contrato para classes que fornecem estatísticasJpaRepositorye suas especializações definem contratos para acesso a dados- Exemplo:
public interface EstatisticaCalculavel {...}(src/main/java/com/jogodaforca/forca/model/EstatisticaCalculavel.java)
TENTATIVAS_PADRAO,TENTATIVAS_FACIL,TENTATIVAS_DIFICILemPartida- Métodos de fábrica estáticos em
Resultado:sucesso(),erro() - Exemplo:
private static final int TENTATIVAS_PADRAO = 6;emPartida(src/main/java/com/jogodaforca/forca/model/Partida.java)
- Modelagem completa do sistema em UML (ver seção de Diagramas UML)
- Representação visual de classes, atributos, métodos e relacionamentos
- Exemplo: Diagrama UML mostrando herança, associações e multiplicidade (UML-classes.puml)
- Criação de objetos concretos a partir de classes (instanciação)
- Classificação de entidades em hierarquias (como tipos de jogadores)
- Exemplo:
new LetraTentada(char letra, boolean acerto)(src/main/java/com/jogodaforca/forca/model/LetraTentada.java)
Este projeto inclui diagramas UML detalhados para facilitar a compreensão da arquitetura:
-
Diagrama UML completo (UML.puml): Diagrama completo do sistema
- Contém todas as classes, interfaces, relacionamentos e pacotes
- Visão abrangente da arquitetura do projeto
-
Diagrama de Classes (UML-classes.puml): Foco nas classes principais
- Mostra as principais classes do modelo e suas relações
- Simplificado para melhor visualização da estrutura principal
-
Diagrama de Models e DTOs (UML_FOR_IMAGE.puml): Detalha as entidades e objetos de transferência
- Visualiza a estrutura de dados e relacionamentos entre entidades
- Mostra a conversão entre entidades e DTOs
- Só não mostra os repositories porque não coube na imagem.
Diagrama UML gerado a partir do arquivo UML_FOR_IMAGE.puml
Para visualizar os diagramas PlantUML, você pode:
- Usar plugins PlantUML disponíveis para IDEs como IntelliJ IDEA, Visual Studio Code ou Eclipse
- Usar o PlantUML Server online copiando o conteúdo dos arquivos .puml
- Visualizar diretamente no GitHub (se estiver usando o GitHub com extensões que suportam PlantUML)
-
Backend:
- Spring Boot 3.x
- Spring Data JPA
- H2 Database (para desenvolvimento)
-
Frontend:
- HTML5
- CSS3
- JavaScript (ES6+)
Este projeto está licenciado sob a licença MIT - consulte o arquivo LICENSE para obter detalhes.