Skip to content

gui-ccr/rpg-batalha-console-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

⚔️ RPG Batalha por Turnos - Operação: Código Amaldiçoado ⚔️

Um simulador de batalha de RPG em console, construído com Java puro para demonstrar conceitos avançados de Programação Orientada a Objetos e design de software.

Java 17+ SQLite License MIT Status

Gameplay do Jogo

Este projeto é um showcase técnico e um trabalho de fã inspirado no universo de Ordem Paranormal RPG. Ele foi criado com o objetivo de aplicar e solidificar conhecimentos em desenvolvimento de software, desde os fundamentos de POO até a persistência de dados com um banco de dados local.


📜 Índice


✨ Funcionalidades Principais

Este projeto vai além de uma simples batalha. É um sistema de RPG completo com mecânicas pensadas para criar uma experiência de jogo dinâmica e re-jogável.

Funcionalidade Descrição Status
⚔️ Combate por Turnos Sistema de batalha com ataques normais, habilidades especiais, chance de crítico e esquiva. ✅ Concluído
💾 Persistência de Dados Salve e carregue seus heróis! Todo o progresso é armazenado em um banco de dados SQLite local. ✅ Concluído
📈 Progressão de Herói Ganhe experiência, suba de nível, e veja seus atributos e status de combate melhorarem automaticamente. ✅ Concluído
🎒 Sistema de Inventário Colete, equipe espadas para aumentar seu dano e use poções para se curar no meio do combate. ✅ Concluído
🎨 UI de Console Rica Interface colorida e com feedback claro para todas as ações, melhorando a experiência do jogador. ✅ Concluído
🎲 Nomes Aleatórios Heróis e monstros recebem nomes dinâmicos a cada partida, garantindo variedade. ✅ Concluído

🛠️ Tecnologias e Conceitos Aplicados

Este projeto foi uma excelente oportunidade para aplicar um vasto conjunto de conhecimentos teóricos em um cenário prático e funcional.

🧠 Conceitos de Programação Orientada a Objetos (POO)
  • Classes e Objetos: Modelagem de todas as entidades (Heroi, Monstro, Item).
  • Encapsulamento: Uso de private com Getters e Setters para proteger o estado dos objetos.
  • Herança: Heroi e Monstro herdam de uma classe abstrata Personagem.
  • Polimorfismo: Sobrescrita de métodos como atacar() para comportamentos específicos.
  • Classes Abstratas: Personagem e Item como contratos base.
  • Interfaces: Uso de Equipavel para definir um contrato que itens vestíveis devem seguir.
  • Composição: O Heroi tem um Inventario, que por sua vez tem uma lista de Item.
💾 Camada de Persistência e Padrão CRUD Gameplay do Jogo

A capacidade de salvar e carregar o progresso é crucial para a experiência do jogador. Este projeto implementa uma camada de persistência de dados utilizando um banco de dados SQLite, orquestrada através do padrão de arquitetura CRUD.

O que é CRUD?

CRUD é um acrônimo para as quatro operações essenciais que uma aplicação realiza sobre dados persistentes. É a base para a maioria das aplicações que interagem com bancos de dados.

  • CREATE (Criar): Adicionar novos registros no banco de dados.
  • READ (Ler): Consultar dados que já existem no banco.
  • UPDATE (Atualizar): Modificar um registro existente.
  • DELETE (Deletar): Remover permanentemente um registro.

Implementação no Projeto

A classe RepositorioDeHerois é a responsável por traduzir as necessidades do jogo em comandos para o banco de dados, aplicando concretamente cada uma das operações CRUD.

CREATE: Salvando um Novo Herói

Quando o jogador cria um novo personagem, o método salvar() é invocado para inserir os dados do novo herói na tabela.

// Em: src/main/java/com/guiccr/rpg/repository/RepositorioDeHerois.java
public static void salvarHeroi(Heroi heroi) {
        garantirColunaVidaAtual(); // Garantir que a coluna existe antes de salvar
        garantirTabelaInventario(); // Garantir que a tabela de inventário existe
        String sql = "INSERT OR REPLACE INTO herois (nome, vida_atual, vida_maxima, ataque, defesa, chance_critico, multiplicador_critico, chance_esquiva, energia, forca, agilidade, vigor, presenca, intelecto, nivel, experiencia_atual, experiencia_para_proximo_nivel) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        try (Connection conexao = DriverManager.getConnection(URL_JDBC);
             PreparedStatement preparedStatement = conexao.prepareStatement(sql)) {
            preparedStatement.setString(1, heroi.getNome());
                 // outros sets....
             } catch (SQLException e) {
            System.err.println("Erro ao salvar o herói no banco de dados: " + e.getMessage());
        }

READ: Carregando Heróis Salvos

Para que o jogador possa continuar uma aventura, o método buscarTodos() consulta e retorna uma lista com todos os heróis salvos.

// Em: src/main/java/com/guiccr/rpg/repository/RepositorioDeHerois.java
public static Optional<Heroi> buscarHeroi(String nome) {
        garantirColunaVidaAtual(); // Garantir que a coluna existe antes de buscar
        String sql = "SELECT * FROM herois WHERE nome = ?;";
        try (Connection conexao = DriverManager.getConnection(URL_JDBC);
             PreparedStatement preparedStatement = conexao.prepareStatement(sql)) {
            preparedStatement.setString(1, nome);
            try (ResultSet resultado = preparedStatement.executeQuery()) {
                if (resultado.next()) {
                    Heroi heroiEncontrado = new Heroi(
                        resultado.getInt("id"),
                    resultado.getString("nome"),
                 // outros getters.....
                 return Optional.of(heroiEncontrado));
                }
            }
            return Optional.empty();
        } catch (SQLException e) {
            System.err.println("Erro ao buscar herói no banco de dados: " + e.getMessage());
            e.printStackTrace();
            return Optional.empty();
        }
    }

UPDATE: Atualizando o Progresso do Herói

Após uma batalha ou ao subir de nível, o método atualizar() é chamado para persistir as novas informações (nível, experiência, vida, etc.) do herói no banco.

// Em: src/main/java/com/guiccr/rpg/repository/RepositorioDeHerois.java
public static void atualizarHeroi(Heroi heroi) {
        garantirColunaVidaAtual(); // Garantir que a coluna existe antes de atualizar
        String sql = "UPDATE herois SET " +
                     "nome = ?, vida_atual = ?, vida_maxima = ?, ataque = ?, defesa = ?, chance_critico = ?, " +
                     "multiplicador_critico = ?, chance_esquiva = ?, energia = ?, forca = ?, " +
                     "agilidade = ?, vigor = ?, presenca = ?, intelecto = ?, nivel = ?, " +
                     "experiencia_atual = ?, experiencia_para_proximo_nivel = ? " +
                     "WHERE nome = ?;";
        try (Connection conexao = DriverManager.getConnection(URL_JDBC);
             PreparedStatement preparedStatement = conexao.prepareStatement(sql)) {
            preparedStatement.setString(1, heroi.getNome());
             // outros getters....
             }} catch (SQLException e) {
            System.err.println("Erro ao atualizar o herói no banco de dados: " + e.getMessage());
        }
    }
             

DELETE: Excluindo um Herói

Quando o jogador escolhe excluir um personagem, o método excluir() executa o comando DELETE para remover o registro do herói do banco de dados.

// Em: src/main/java/com/guiccr/rpg/repository/RepositorioDeHerois.java
public static void deletarHeroi(String nome) {
        String sql = "DELETE FROM herois WHERE nome = ?;";
        try (Connection conexao = DriverManager.getConnection(URL_JDBC);
             PreparedStatement preparedStatement = conexao.prepareStatement(sql)) {
            preparedStatement.setString(1, nome);
            int linhasAfetadas = preparedStatement.executeUpdate();
            if (linhasAfetadas > 0) System.out.println("Herói " + nome + " deletado com sucesso!");
            else System.out.println("Nenhum herói encontrado com o nome " + nome + " para ser deletado.");
        } catch (SQLException e) {
            System.err.println("Erro ao deletar o herói do banco de dados: " + e.getMessage());
        }
    }
💻 Stack de Desenvolvimento e Ferramentas
  • Linguagem: Java 17+
  • Banco de Dados: SQLite para persistência de dados local e sem necessidade de servidor.
  • Conectividade DB: JDBC (Java Database Connectivity) para comunicação com o SQLite.
  • Controle de Versão: Git e GitHub.
  • Build/Execução: Scripts (.bat) para facilitar a compilação e execução.
🏛️ Arquitetura e Boas Práticas
  • Repository Pattern: A classe RepositorioDeHerois isola toda a lógica de acesso a dados, separando as regras de negócio da persistência.
  • Tratamento de Exceções: Uso de try-catch para lidar com erros de SQL e entrada de usuário.
  • Código Limpo: Foco em nomes de variáveis e métodos claros e uma estrutura de pacotes organizada.

🚀 Comece a Jogar em 5 Minutos

Siga os passos abaixo para mergulhar na aventura.

📋 Pré-requisitos

  1. Java Development Kit (JDK) 17 ou superior: Faça o download aqui.
    • Verificação: Abra seu terminal e digite java --version.
  2. Git (Opcional): Faça o download aqui.

▶️ Executando o Jogo

Opção 1: Para Jogadores (Recomendado)
  1. Vá para a Página de Releases do projeto.
  2. Baixe o arquivo .jar da versão mais recente (ex: rpg-batalha-console-java-1.0.0-jar-with-dependencies.jar).
  3. Abra um terminal na pasta onde você baixou o arquivo e execute:
    java -jar nome-do-arquivo.jar
  4. Divirta-se! 🎮
Opção 2: Para Desenvolvedores (Multiplataforma)
  1. Clone o repositório:
    git clone [https://github.com/gui-ccr/rpg-batalha-console-java.git](https://github.com/gui-ccr/rpg-batalha-console-java.git)
    cd rpg-batalha-console-java
  2. Compile o código:
    # Para Linux/Mac
    javac -d target/classes -cp "lib/*" src/main/java/com/guiccr/rpg/*.java
    
    # Para Windows (PowerShell)
    javac -d target/classes -cp "lib\*" src\main\java\com\guiccr\rpg\*.java
  3. Execute o jogo:
    # Para Linux/Mac
    java -cp "target/classes:lib/*" com.guiccr.rpg.Main
    
    # Para Windows (PowerShell)
    java -cp "target\classes;lib\*" com.guiccr.rpg.Main

📸 Galeria do Jogo

Tela de Batalha Inventário

📂 Estrutura do Projeto

A estrutura de pastas foi organizada para separar responsabilidades, seguindo as convenções do Maven.

rpg-batalha-console-java/
├── assets/           # Imagens e GIFs para o README
├── db/               # Scripts e banco de dados
├── lib/              # Dependências .jar (JDBC Driver)
├── src/
│   └── main/java/com/guiccr/rpg/
│       ├── Main.java                # Ponto de entrada
│       ├── ConsoleColors.java       # Arquivo de Enums de cores do terminal
│       ├── GeradorDeNomes.java      # Gerador de nomes
│       ├── MenuPrincipal.java       # Menu Principal
│       ├── model/                   # Pacote para entidades (Heroi, Monstro)
│       ├── repository/              # Pacote para acesso a dados
│       └── service/                 # Pacote para regras de negócio (Batalha)
├── .gitignore
├── Jogar.bat         # Script de execução para Windows
├── LICENSE
└── README.md

📚 Acesse a Wiki!

Este README oferece uma visão geral do projeto. Para um mergulho profundo na arquitetura, nas mecânicas de jogo, no diagrama de classes UML e em outras documentações técnicas, a Wiki do projeto é o seu destino!


📈 Roadmap de Desenvolvimento

O projeto segue um plano de desenvolvimento claro, com futuras expansões já idealizadas.

  • Fase 0: Infraestrutura: Estrutura de pastas, README e licença.
  • Fase 1: Mecânicas de Jogo: Sistema de combate, nomes dinâmicos e UI.
  • Fase 2: Expansão POO: Level up, inventário, itens e habilidades.
  • Fase 3: Persistência: Implementação completa de Salvar/Carregar com SQLite.
  • Fase 4: Refatoração e Qualidade:
    • Adicionar testes unitários (JUnit).
    • Refatorar para pacotes de model, service e repository.
    • Implementar um sistema de Log (ex: Log4j).
  • Fase 5: Empacotamento e Release v1.0.0
  • Fase 6: Futuras Funcionalidades:
    • Sistema de classes de Herói (Guerreiro, Mago).
    • Múltiplos tipos de monstros.
    • Masmorras com múltiplas batalhas.

⚠️ Aviso Legal e Créditos

Este projeto é um trabalho de fã e de estudo, não oficial e não possui afiliação ou endosso por Rafael Lange Severino "Cellbit" ou pela Ordem Paranormal RPG. Ele é uma homenagem e um exercício de programação inspirado na rica temática e conceitos do universo de Ordem Paranormal. Todos os direitos sobre a obra original pertencem aos seus respectivos criadores.


📄 Licença

Este projeto está sob a licença MIT License.