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.
- Crie o arquivo
dungeon.cppna pastasrc/:
#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
- Abra o terminal integrado.
- Compile:
g++ dungeon.cpp -o dungeon - 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)