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, usando o poder do C#!

Nesta primeira parte, vamos planejar a estrutura usando 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 Métodos: Para representar o Jogador e o Mapa.
  • Matrizes: Para o cenário.
  • Entrada de Dados: Para mover o personagem.

📖 Exemplo Guiado: Jogador e Mapa em C#

Vamos criar a classe do Jogador e do Mapa.

  1. Crie o arquivo dungeon.cs na pasta src/:
using System;
 
// Código principal
int TAM = 5;
Jogador link = new Jogador(0, 0);
Mapa mapa = new Mapa(TAM);
 
// Colocando a chave e a porta no mapa
mapa.Grade[1, 1] = 2; // Chave
mapa.Grade[4, 4] = 3; // Porta
 
mapa.Desenhar(link);
 
public class Jogador {
    public int X { get; set; }
    public int Y { get; set; }
    public bool TemChave { get; set; }
 
    public Jogador(int x, int y) {
        X = x;
        Y = y;
        TemChave = false;
    }
 
    public void Mover(int dx, int dy, int tam) {
        int novoX = X + dx;
        int novoY = Y + dy;
 
        // Verifica limites do mapa
        if (novoX >= 0 && novoX < tam) {
            X = novoX;
        }
        if (novoY >= 0 && novoY < tam) {
            Y = novoY;
        }
    }
}
 
public class Mapa {
    public int[,] Grade { get; set; }
    public int Tamanho { get; set; }
 
    public Mapa(int tamanho) {
        Tamanho = tamanho;
        Grade = new int[tamanho, tamanho];
    }
 
    public void Desenhar(Jogador j) {
        Console.WriteLine("\n--- DUNGEON ---");
        for (int i = 0; i < Tamanho; i++) {
            for (int k = 0; k < Tamanho; k++) {
                if (i == j.Y && k == j.X) {
                    Console.Write("[L] "); // L de Link
                } else if (Grade[i, k] == 2) {
                    Console.Write("[K] "); // K de Key (Chave)
                } else if (Grade[i, k] == 3) {
                    Console.Write("[D] "); // D de Door (Porta)
                } else {
                    Console.Write("[. ] "); // Espaço vazio
                }
            }
            Console.WriteLine();
        }
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Execute o projeto usando dotnet run.

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 no final do código 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, TAM) e desenhe o mapa novamente para ver o Link se movendo!


🔑 Gabarito de Código

Prática 1: Fragmento do código principal

using System;
 
int TAM = 5;
Jogador link = new Jogador(0, 0);
Mapa mapa = new Mapa(TAM);
mapa.Grade[1, 1] = 2; // Chave
mapa.Grade[4, 4] = 3; // Porta
 
mapa.Desenhar(link);
 
Console.Write("Digite D para mover para a direita: ");
string comando = Console.ReadLine();
 
if (comando == "D" || comando == "d") {
    link.Mover(1, 0, TAM);
}
 
mapa.Desenhar(link);
 
public class Jogador {
    public int X { get; set; }
    public int Y { get; set; }
    public bool TemChave { get; set; }
 
    public Jogador(int x, int y) {
        X = x;
        Y = y;
        TemChave = false;
    }
 
    public void Mover(int dx, int dy, int tam) {
        int novoX = X + dx;
        int novoY = Y + dy;
        if (novoX >= 0 && novoX < tam) X = novoX;
        if (novoY >= 0 && novoY < tam) Y = novoY;
    }
}
 
public class Mapa {
    public int[,] Grade { get; set; }
    public int Tamanho { get; set; }
    public Mapa(int tamanho) {
        Tamanho = tamanho;
        Grade = new int[tamanho, tamanho];
    }
    public void Desenhar(Jogador j) {
        Console.WriteLine("\n--- DUNGEON ---");
        for (int i = 0; i < Tamanho; i++) {
            for (int k = 0; k < Tamanho; k++) {
                if (i == j.Y && k == j.X) Console.Write("[L] ");
                else if (Grade[i, k] == 2) Console.Write("[K] ");
                else if (Grade[i, k] == 3) Console.Write("[D] ");
                else Console.Write("[. ] ");
            }
            Console.WriteLine();
        }
    }
}

Capitulo Anterior | Proximo Capitulo