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.
- Crie o arquivo
dungeon.csna pastasrc/:
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
- 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();
}
}
}