Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Configurações iniciais
- local tabuleiro = ""
- local jogador_posicao_x = 14 -- Linha do jogador (válido de 1 a 14, pois 0 e 15 são as bordas)
- local jogador_posicao_y = 7 -- Coluna do jogador (válido de 1 a 14)
- local porta_x, porta_y = nil, nil -- A porta só aparece após derrotar os inimigos
- local cenarios = {"🧱","🏕️", "🏖️", "🏜️", "🏝️", "🏟️", "🏛️", "🌃", "🕌", "️🕋"} -- Símbolos das bordas (indicam os cenários)
- local cenario_atual = 1
- local inimigos = {}
- local dificuldade = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50} -- Número de inimigos para cada cenário
- local monster = 0
- local pontuacao = 0
- local vida = 3
- local level = 1
- local mortes = {} -- Registra as posições dos inimigos derrotados
- ----------------------------------------------------------
- -- Função para gerar inimigos aleatórios
- ----------------------------------------------------------
- function gerar_inimigos()
- inimigos = {}
- local quantidade = dificuldade[cenario_atual] or 50
- for i = 1, quantidade do
- local inimigo_x, inimigo_y
- repeat
- inimigo_x = math.random(1, 12) -- posições válidas de 1 a 14 (bordas em 0 e 15)
- inimigo_y = math.random(1, 12)
- until not (inimigo_x == jogador_posicao_x and inimigo_y == jogador_posicao_y)
- table.insert(inimigos, {x = inimigo_x, y = inimigo_y})
- end
- porta_x, porta_y = nil, nil -- Esconde a porta até eliminar os inimigos
- end
- ----------------------------------------------------------
- -- Função para atualizar a porta (aparece quando todos os inimigos forem derrotados)
- ----------------------------------------------------------
- function atualizar_porta()
- if #inimigos == 0 and not porta_x then
- porta_x, porta_y = 8, 7 -- A porta é exibida na borda esquerda, coluna 7
- end
- end
- ----------------------------------------------------------
- -- Função para mover os inimigos
- -- Os inimigos se movem somente se estiverem alinhados com o jogador.
- ----------------------------------------------------------
- function mover_inimigos()
- for _, inimigo in ipairs(inimigos) do
- if inimigo.x == jogador_posicao_x then
- if inimigo.y < jogador_posicao_y then
- inimigo.y = inimigo.y + 1
- elseif inimigo.y > jogador_posicao_y then
- inimigo.y = inimigo.y - 1
- end
- elseif inimigo.y == jogador_posicao_y then
- if inimigo.x < jogador_posicao_x then
- inimigo.x = inimigo.x + 1
- elseif inimigo.x > jogador_posicao_x then
- inimigo.x = inimigo.x - 1
- end
- end
- end
- end
- ----------------------------------------------------------
- -- Função para desenhar o tabuleiro
- ----------------------------------------------------------
- function desenhar_tabuleiro()
- tabuleiro = ""
- local cor = cenarios[cenario_atual]
- local arma_x, arma_y = nil, nil
- -- Define a posição da arma: se existir algum inimigo em linha reta com o jogador,
- -- a arma é exibida na célula imediatamente adjacente ao jogador, na direção do inimigo.
- for _, inimigo in ipairs(inimigos) do
- if inimigo.x == jogador_posicao_x then
- if inimigo.y > jogador_posicao_y then
- arma_x, arma_y = jogador_posicao_x, jogador_posicao_y + 1
- else
- arma_x, arma_y = jogador_posicao_x, jogador_posicao_y - 1
- end
- break
- elseif inimigo.y == jogador_posicao_y then
- if inimigo.x > jogador_posicao_x then
- arma_x, arma_y = jogador_posicao_x + 1, jogador_posicao_y
- else
- arma_x, arma_y = jogador_posicao_x - 1, jogador_posicao_y
- end
- break
- end
- end
- for i = 0, 15 do
- for j = 0, 15 do
- -- Desenha as bordas com o símbolo do cenário atual
- if i == 0 or i == 15 or j == 0 or j == 15 then
- tabuleiro = tabuleiro .. cor
- -- Verifica a posição do jogador
- elseif i == jogador_posicao_x and j == jogador_posicao_y then
- tabuleiro = tabuleiro .. "🧕"
- -- Verifica a posição da porta
- elseif porta_x and i == porta_x and j == porta_y then
- tabuleiro = tabuleiro .. "️🚩"
- -- Verifica a posição da arma
- elseif arma_x and i == arma_x and j == arma_y then
- tabuleiro = tabuleiro .. "⚡"
- else
- local desenhado = false
- -- Verifica se há um inimigo nesta posição
- for _, inimigo in ipairs(inimigos) do
- if i == inimigo.x and j == inimigo.y then
- tabuleiro = tabuleiro .. "👹"
- desenhado = true
- break
- end
- end
- if not desenhado then
- local is_dead = false
- for _, morte in ipairs(mortes) do
- if i == morte.x and j == morte.y then
- tabuleiro = tabuleiro .. "☠️"
- is_dead = true
- break
- end
- end
- if not is_dead then
- tabuleiro = tabuleiro .. "✔"
- end
- end
- end
- end
- tabuleiro = tabuleiro .. "\n"
- end
- return "Pontuação: " .. pontuacao .. " Nível: " ..level .. "\nInimigos Mortos: " .. monster .. " Vidas: " .. vida .. "\n" .. tabuleiro
- end
- ----------------------------------------------------------
- -- Função para atacar inimigos
- -- O ataque atinge o inimigo em linha reta (mesma linha ou coluna) que esteja mais próximo do jogador.
- ----------------------------------------------------------
- function atacar()
- local inimigo_alvo = nil
- local distancia_min = math.huge -- Inicializa com um número muito grande
- for _, inimigo in ipairs(inimigos) do
- if inimigo.x == jogador_posicao_x or inimigo.y == jogador_posicao_y then
- local distancia = math.abs(inimigo.x - jogador_posicao_x) + math.abs(inimigo.y - jogador_posicao_y)
- if distancia < distancia_min then
- distancia_min = distancia
- inimigo_alvo = inimigo
- end
- end
- end
- if inimigo_alvo then
- -- Registra a morte e remove o inimigo da lista
- table.insert(mortes, {x = inimigo_alvo.x, y = inimigo_alvo.y})
- for i = #inimigos, 1, -1 do
- if inimigos[i] == inimigo_alvo then
- table.remove(inimigos, i)
- break
- end
- end
- pontuacao = pontuacao + 150
- monster = monster + 1
- atualizar_porta()
- end
- end
- function resetar_jogo()
- local escolha = gg.choice({"🔄 Reiniciar Jogo", "❌ Sair"}, nil, "O jogo terminou! Deseja reiniciar?")
- if escolha == 1 then
- -- Reseta todas as variáveis do jogo
- jogador_posicao_x, jogador_posicao_y = 14, 7
- porta_x, porta_y = nil, nil
- cenario_atual = 1
- inimigos = {}
- dificuldade = {5, 10, 15, 20, 25, 30, 35, 50}
- monster = 0
- pontuacao = 0
- vida = 3
- mortes = {}
- level = 1
- gg.toast("Jogo reiniciado!")
- jogar() -- Inicia um novo jogo
- else
- gg.toast("Jogo encerrado.")
- end
- end
- ----------------------------------------------------------
- -- Função principal do jogo
- ----------------------------------------------------------
- function jogar()
- gerar_inimigos()
- while true do
- local tabuleiro_atual = desenhar_tabuleiro()
- local escolha = gg.choice(
- {
- " ⬆️ Cima\n",
- "\n⬅️ Esquerda\n",
- "\n ➡️ Direita\n",
- "\n ⬇️ Baixo\n",
- "\n 🏹 Atacar\n",
- "❌ Sair"
- },
- nil, tabuleiro_atual)
- if escolha == 1 and jogador_posicao_x > 1 then
- jogador_posicao_x = jogador_posicao_x - 1 -- Cima: diminui a linha
- elseif escolha == 2 and jogador_posicao_y > 1 then
- jogador_posicao_y = jogador_posicao_y - 1 -- Esquerda: diminui a coluna
- elseif escolha == 3 and jogador_posicao_y < 14 then
- jogador_posicao_y = jogador_posicao_y + 1 -- Direita: aumenta a coluna
- elseif escolha == 4 and jogador_posicao_x < 14 then
- jogador_posicao_x = jogador_posicao_x + 1 -- Baixo: aumenta a linha
- elseif escolha == 5 then
- atacar()
- elseif escolha == 6 or escolha == nil then
- gg.toast("Jogo encerrado.")
- break
- end
- mover_inimigos()
- -- Verifica se algum inimigo atingiu o jogador
- for _, inimigo in ipairs(inimigos) do
- if inimigo.x == jogador_posicao_x and inimigo.y == jogador_posicao_y then
- vida = vida - 1 -- Reduz a vida corretamente
- gg.toast("Você foi atingido! Vidas restantes: " .. vida)
- if vida == 0 then
- gg.toast("Você foi derrotado pelos inimigos!")
- resetar_jogo() -- reinicia o jogo
- return
- end
- end
- end
- -- Verifica se o jogador entrou na porta para avançar de cenário
- if porta_x and jogador_posicao_x == porta_x and jogador_posicao_y == porta_y then
- if cenario_atual < #cenarios then
- cenario_atual = cenario_atual + 1
- level = cenario_atual
- jogador_posicao_x, jogador_posicao_y = 14, 7 -- Reset da posição do jogador
- mortes = {}
- gerar_inimigos()
- gg.toast("Novo cenário!")
- else
- gg.toast("Você venceu o jogo!")
- resetar_jogo()
- return
- end
- end
- end
- end
- -- Iniciar o jogo
- jogar()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement