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 a simplicidade e eficiência do Go!
Nesta primeira parte, vamos planejar a estrutura usando Structs 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:
- Structs 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 Go
Vamos criar a estrutura do Jogador e do Mapa.
- Crie o arquivo
dungeon.gona pastasrc/:
package main
import "fmt"
const TAM = 5 // Tamanho do mapa 5x5
type Jogador struct {
X int
Y int
TemChave bool
}
// Método para mover o jogador
func (j *Jogador) Mover(dx int, dy int) {
novoX := j.X + dx
novoY := j.Y + dy
// Verifica limites do mapa
if novoX >= 0 && novoX < TAM {
j.X = novoX
}
if novoY >= 0 && novoY < TAM {
j.Y = novoY
}
}
type Mapa struct {
Grade [TAM][TAM]int
}
func (m Mapa) Desenhar(j Jogador) {
fmt.Println("\n--- DUNGEON ---")
for i := 0; i < TAM; i++ {
for k := 0; k < TAM; k++ {
if i == j.Y && k == j.X {
fmt.Print("[L] ") // L de Link
} else if m.Grade[i][k] == 2 {
fmt.Print("[K] ") // K de Key (Chave)
} else if m.Grade[i][k] == 3 {
fmt.Print("[D] ") // D de Door (Porta)
} else {
fmt.Print("[.] ") // Espaço vazio
}
}
fmt.Println()
}
}
func main() {
link := Jogador{X: 0, Y: 0, TemChave: false}
// Inicializando o mapa com a chave e a porta
mapa := Mapa{}
mapa.Grade[1][1] = 2 // Chave
mapa.Grade[4][4] = 3 // Porta
mapa.Desenhar(link)
}🕹️ Como Executar e Testar no VS Code
- Abra le terminal integrado.
- Execute:
go run dungeon.go
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) (repare que passamos o endereço implicitamente no Go!) e desenhe o mapa novamente para ver o Link se movendo!
🔑 Gabarito de Código
Prática 1: Fragmento do código na main
var comando string
fmt.Print("Digite D para mover para a direita: ")
fmt.Scan(&comando)
if comando == "D" || comando == "d" {
link.Mover(1, 0)
}
mapa.Desenhar(link)