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 Go!


📖 O Loop Principal

Para o jogo funcionar continuamente, precisamos de um loop que só pare quando o jogador vencer ou decidir sair. Como o Go só tem o for, vamos usá-lo sem nenhuma condição para criar um loop infinito!


📖 Exemplo Guiado: O Jogo Completo em Go

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.go na pasta src/:
package main
 
import "fmt"
 
const TAM = 5
 
type Jogador struct {
    X        int
    Y        int
    TemChave bool
}
 
func (j *Jogador) Mover(comando string) {
    switch comando {
    case "w", "W":
        if j.Y > 0 { j.Y-- }
    case "s", "S":
        if j.Y < TAM-1 { j.Y++ }
    case "a", "A":
        if j.X > 0 { j.X-- }
    case "d", "D":
        if j.X < TAM-1 { j.X++ }
    default:
        fmt.Println("Comando invalido!")
    }
}
 
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] ")
            } else if m.Grade[i][k] == 2 {
                fmt.Print("[K] ")
            } else if m.Grade[i][k] == 3 {
                fmt.Print("[D] ")
            } else {
                fmt.Print("[.] ")
            }
        }
        fmt.Println()
    }
}
 
func main() {
    link := Jogador{X: 0, Y: 0, TemChave: false}
    mapa := Mapa{}
    mapa.Grade[1][1] = 2 // Chave
    mapa.Grade[4][4] = 3 // Porta
 
    jogando := true
 
    fmt.Println("Bem-vindo ao Zelda Dungeon Crawler em Go!")
    fmt.Println("Controles: W (Cima), S (Baixo), A (Esquerda), D (Direita), Q (Sair)")
 
    for jogando {
        mapa.Desenhar(link)
        
        var comando string
        fmt.Print("Comando: ")
        fmt.Scan(&comando)
 
        if comando == "q" || comando == "Q" {
            fmt.Println("Voce desistiu da jornada.")
            break
        }
 
        link.Mover(comando)
 
        // Regra 1: Pegar a chave
        if mapa.Grade[link.Y][link.X] == 2 {
            fmt.Println("\n🔑 Voce encontrou a Chave da Masmorra!")
            link.TemChave = true
            mapa.Grade[link.Y][link.X] = 0 // Remove a chave do mapa
        }
 
        // Regra 2: Chegar na porta
        if mapa.Grade[link.Y][link.X] == 3 {
            if link.TemChave {
                fmt.Println("\n🏆 Parabens! Voce abriu a porta e escapou!")
                jogando = false
            } else {
                fmt.Println("\n⛔ A porta esta trancada! Voce precisa da chave.")
            }
        }
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Abra le terminal integrado.
  2. Execute: go run jogo_completo.go

📊 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[TemChave = true]
    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!


🔑 Gabarito de Código

Prática 1: Fragmento com o Monstro

    // Adicione a verificação no loop principal:
    if mapa.Grade[link.Y][link.X] == 4 {
        fmt.Println("\n💀 Voce foi pego por um monstro! GAME OVER.")
        jogando = false
    }

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

(Siga o padrão estabelecido no Guia)


Parabéns por concluir o curso de Go! Você agora domina uma das linguagens mais modernas e eficientes do mundo.


Capitulo Anterior