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.

  1. Crie o arquivo dungeon.go na pasta src/:
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

  1. Abra le terminal integrado.
  2. 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)

Capitulo Anterior | Proximo Capitulo