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.

  1. Crie o arquivo jogo_completo.c na pasta src/:
#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

  1. Abra o terminal integrado.
  2. Compile: gcc jogo_completo.c -o jogo_completo
  3. Execute: ./jogo_completo
  4. Mova o Link até o K para pegar a chave e depois até o D para 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.


Capitulo Anterior