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.
- Crie o arquivo
jogo_completo.gona pastasrc/:
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
- Abra le terminal integrado.
- 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.