Capítulo 20: Projeto Final - Dungeon Crawler (Parte 2) 🎮🏆
Chegou o grande momento! Vamos implementar o loop principal de movimento, a coleta da chave e a condição de vitória para finalizar o nosso jogo e o curso de C!
📖 O Loop Principal
Para o jogo funcionar continuamente, precisamos de um loop while que só pare quando o jogador vencer ou decidir sair.
📖 Exemplo Guiado: O Jogo Completo
Vamos completar o código do capítulo anterior adicionando o controle de movimento (W, A, S, D) e as regras do jogo.
- Crie o arquivo
jogo_completo.cna pastasrc/:
#include <stdio.h>
#define TAM 5
struct Jogador {
int x;
int y;
int tem_chave;
};
void desenhar_mapa(int mapa[TAM][TAM], struct Jogador j) {
printf("\n--- DUNGEON ---\n");
for (int i = 0; i < TAM; i++) {
for (int j_atual = 0; j_atual < TAM; j_atual++) {
if (i == j.y && j_atual == j.x) {
printf("[L] ");
} else if (mapa[i][j_atual] == 2) {
printf("[K] ");
} else if (mapa[i][j_atual] == 3) {
printf("[D] ");
} else {
printf("[.] ");
}
}
printf("\n");
}
}
int main() {
int mapa[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}
};
struct Jogador link = {0, 0, 0};
char comando;
int jogando = 1;
printf("Bem-vindo ao Zelda Dungeon Crawler!\n");
printf("Controles: W (Cima), S (Baixo), A (Esquerda), D (Direita), Q (Sair)\n");
while (jogando) {
desenhar_mapa(mapa, link);
printf("Comando: ");
scanf(" %c", &comando); // Espaço antes de %c limpa o buffer
// Movimentação e colisão com as bordas
if (comando == 'w' || comando == 'W') {
if (link.y > 0) link.y--;
} else if (comando == 's' || comando == 'S') {
if (link.y < TAM - 1) link.y++;
} else if (comando == 'a' || comando == 'A') {
if (link.x > 0) link.x--;
} else if (comando == 'd' || comando == 'D') {
if (link.x < TAM - 1) link.x++;
} else if (comando == 'q' || comando == 'Q') {
printf("Voce desistiu da jornada.\n");
break;
}
// Regra 1: Pegar a chave
if (mapa[link.y][link.x] == 2) {
printf("\n🔑 Voce encontrou a Chave da Masmorra!\n");
link.tem_chave = 1;
mapa[link.y][link.x] = 0; // Remove a chave do mapa
}
// Regra 2: Chegar na porta
if (mapa[link.y][link.x] == 3) {
if (link.tem_chave) {
printf("\n🏆 Parabens! Voce abriu a porta e escapou!\n");
jogando = 0;
} else {
printf("\n⛔ A porta esta trancada! Voce precisa da chave.\n");
}
}
}
return 0;
}🕹️ Como Executar e Testar no VS Code
- Abra o terminal integrado.
- Compile:
gcc jogo_completo.c -o jogo_completo - Execute:
./jogo_completo - Mova o Link até o
Kpara pegar a chave e depois até oDpara vencer!
📊 Ilustração Visual: Fluxo de Regras
Veja as verificações feitas a cada passo:
graph TD A[Nova Posição] --> B{É a Chave?} B -->|Sim| C[tem_chave = 1] B -->|Não| D{É a Porta?} C --> D D -->|Sim| E{Tem Chave?} E -->|Sim| F[Vitória!] E -->|Não| G[Mensagem: Trancada] D -->|Não| H[Continua]
🛠️ Prática Obrigatória 1: Adicionando um Monstro
Adicione um monstro no mapa (valor 4 na matriz, pode ser o símbolo [M]). Se o Link pisar na mesma posição do monstro, ele perde o jogo! (Dica: adicione mapa[2][2] = 4 e faça a verificação no loop).
🔑 Gabarito de Código
Prática 1: Fragmento com o Monstro
// Na inicialização do mapa:
mapa[2][2] = 4;
// Na função desenhar_mapa:
else if (mapa[i][j_atual] == 4) {
printf("[M] "); // M de Monstro
}
// No loop while, após o movimento:
if (mapa[link.y][link.x] == 4) {
printf("\n💀 Voce foi pego por um monstro! GAME OVER.\n");
jogando = 0;
}📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
(Siga o padrão estabelecido no Guia)
Parabéns por concluir o curso de Linguagem C! Você agora domina a base da programação estruturada.