Capítulo 19: Projeto Final - Dungeon Crawler (Parte 1) 🗡️🛡️

Chegamos à reta final do curso! Nos capítulos 19 e 20, vamos juntar tudo o que aprendemos para criar um Jogo de Dungeon Crawler (Exploração de Calabouço) baseado em texto, com o tema The Legend of Zelda, mas usando o poder da Orientação a Objetos do C++!

Nesta primeira parte, vamos planejar a estrutura das classes e criar o mapa do jogo.


📖 O que vamos construir?

Um jogo onde o jogador (Link) se move por uma grade (matriz), encontra uma chave e deve chegar à porta de saída para vencer! Usaremos:

  • Classes e Objetos: Para representar o Jogador e o Mapa.
  • Encapsulamento: Para proteger a posição do jogador.
  • Vetores/Matrizes: Para o cenário.

📖 Exemplo Guiado: Classe do Jogador e Mapa

Vamos criar a classe Jogador e a classe Mapa que desenha o cenário.

  1. Crie o arquivo dungeon.cpp na pasta src/:
#include <iostream>
#include <vector>
 
using namespace std;
 
#define TAM 5 // Tamanho do mapa 5x5
 
class Jogador {
private:
    int x, y;
    bool tem_chave;
 
public:
    Jogador() {
        x = 0;
        y = 0;
        tem_chave = false;
    }
 
    int get_x() { return x; }
    int get_y() { return y; }
    
    void mover(int dx, int dy) {
        x += dx;
        y += dy;
    }
};
 
class Mapa {
private:
    int grade[TAM][TAM];
 
public:
    Mapa() {
        // 0: Vazio, 2: Chave, 3: Porta
        int inicial[TAM][TAM] = {
            {0, 0, 0, 0, 0},
            {0, 2, 0, 0, 0},
            {0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0},
            {0, 0, 0, 0, 3}
        };
        
        for(int i=0; i<TAM; i++)
            for(int j=0; j<TAM; j++)
                grade[i][j] = inicial[i][j];
    }
 
    void desenhar(Jogador j) {
        cout << "\n--- DUNGEON ---" << endl;
        for (int i = 0; i < TAM; i++) {
            for (int k = 0; k < TAM; k++) {
                if (i == j.get_y() && k == j.get_x()) {
                    cout << "[L] "; // L de Link
                } else if (grade[i][k] == 2) {
                    cout << "[K] "; // K de Key (Chave)
                } else if (grade[i][k] == 3) {
                    cout << "[D] "; // D de Door (Porta)
                } else {
                    cout << "[.] "; // Espaço vazio
                }
            }
            cout << endl;
        }
    }
};
 
int main() {
    Mapa meu_mapa;
    Jogador link;
 
    meu_mapa.desenhar(link);
 
    return 0;
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Compile: g++ dungeon.cpp -o dungeon
  3. Execute: ./dungeon

Resultado Esperado:

--- DUNGEON ---
[L] [.] [.] [.] [.] 
[.] [K] [.] [.] [.] 
[.] [.] [.] [.] [.] 
[.] [.] [.] [.] [.] 
[.] [.] [.] [.] [D] 

📊 Ilustração Visual: Elementos do Jogo

Veja o que cada símbolo significa:

graph TD
    A["[L] = Jogador (Link)"]
    B["[K] = Chave (Key)"]
    C["[D] = Porta (Door)"]
    D["[.] = Espaço Vazio"]

🛠️ Prática Obrigatória 1: Movimento Básico

Adicione uma lógica simples na main que peça ao usuário para digitar ‘D’ (para mover para a direita). Se ele digitar, chame o método link.mover(1, 0) e desenhe o mapa novamente para ver o Link se movendo!


🔑 Gabarito de Código

Prática 1: Fragmento do código na main

    char comando;
    cout << "Digite D para mover para a direita: ";
    cin >> comando;
 
    if (comando == 'D' || comando == 'd') {
        link.mover(1, 0);
    }
 
    meu_mapa.desenhar(link);

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

(Siga o padrão estabelecido no Guia)


Capitulo Anterior | Proximo Capitulo