Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- CONFIGURAÇÕES INICIAIS
- largura = 17 -- Largura do viewport (área visível)
- altura = 6 -- Altura do viewport
- nivel = 1
- pontuacao = 0
- vidas = 3
- gameOver = false
- -- CONFIGURAÇÕES DO MUNDO
- worldWidth = 100 -- Largura total do cenário (pode aumentar conforme nível)
- world = {} -- Matriz do MUNDO
- -- VARIÁVEIS DO JOGADOR
- player = {
- x = 1, -- Posição inicial X
- y = altura - 1, -- Posição inicial Y (logo acima do chão)
- icon = "🕺"
- }
- -- VARIÁVEIS DE ITEM MÁGICO
- itemMagico = "" -- Ícone do item mágico coletado (ex: "💣", "⚡", "🔥")
- magicalShots = 0 -- Número de disparos disponíveis com o poder MÁGICO
- -- VARIÁVEIS DE CONTROLE DE CÂMERA (viewport)
- viewportOffsetX = 100
- -- EMOJIS USADOS NO JOGO
- chaoIcon = "🟫" -- Chão
- holeIcon = "🕳️" -- Buraco no chão
- coinIcon = "🪙" -- Moeda (coletável normal)
- specialBlockIcon = "🟩" -- Bloco especial (gera item mágico)
- flagIcon = "🚩" -- Bandeira para avançar de nível
- cloudIcon = "☁️" -- Céu
- -- Inimigos e Itens
- enemyIcons = {"🤡", "😈", "👽", "👹", "👾"}
- itemIcons = {"🍎", "🍇", "🍔", "🧃", "🍹"} -- (não serão usados, pois substituímos por moedas)
- magicIcons = {"🔥", "⚡", "💣"} -- Itens mágicos
- -- TABELA DE INIMIGOS
- inimigos = {} -- Cada inimigo: {x, y, icon, vida}
- ----------------------------------------------------------------
- -- FUNÇÃO AUXILIAR: Reposicionar o jogador ao cair no buraco
- ----------------------------------------------------------------
- function cairNoBuraco()
- vidas = vidas - 1
- gg.alert("Você caiu em um buraco e perdeu 1 vida! Vidas restantes: " .. vidas, "OK")
- if vidas <= 0 then
- gg.alert("Você perdeu todas as vidas! Game Over!", "OK")
- os.exit()
- else
- player.x = 1
- player.y = altura - 1
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Gerar o cenário (mundo) para o nível atual
- ----------------------------------------------------------------
- function gerarMundo(nivel)
- worldWidth = 100
- world = {}
- for r = 1, altura do
- world[r] = {}
- for c = 1, worldWidth do
- world[r][c] = "⬛" -- Espaço vazio
- end
- end
- -- Céu: primeira linha com nuvens
- for c = 1, worldWidth do
- if math.random() < 0.4 then
- world[1][c] = cloudIcon
- end
- end
- -- Chão: última linha com chance de buraco (evitando buracos consecutivos)
- for c = 1, worldWidth do
- if c > 1 and world[altura][c-1] == holeIcon then
- world[altura][c] = chaoIcon
- elseif math.random() < 0.1 then
- world[altura][c] = holeIcon
- else
- world[altura][c] = chaoIcon
- end
- end
- -- Garantir spawn seguro: célula de spawn (coluna 1) deve ser segura
- world[altura][1] = chaoIcon
- if world[altura - 1][1] == holeIcon or world[altura - 1][1] == coinIcon or world[altura - 1][1] == specialBlockIcon then
- world[altura - 1][1] = "⬛"
- end
- -- Gerar coletáveis na linha altura - 2 (100% de chance)
- for c = 3, worldWidth - 2 do
- if math.random() < 0.3 then
- -- Forçamos que o bloco especial sempre gere poder
- if math.random() < 0.2 then
- world[altura - 2][c] = specialBlockIcon
- else
- world[altura - 2][c] = coinIcon
- end
- end
- end
- -- Gerar coletáveis na linha altura - 3 (opcional, 50% de chance)
- for c = 1, worldWidth do
- if math.random() < 0.05 then
- world[altura - 3][c] = coinIcon
- end
- end
- -- Gerar escadinha final para a bandeira
- local stairs = 4 -- Número de degraus
- -- Preenche os degraus na parte final do cenário (nas últimas colunas)
- if altura >= 5 then
- -- Linha 1 (topo da escada): apenas a bandeira
- world[1][worldWidth] = flagIcon
- -- Linha 2: 1 bloco (na última coluna)
- world[2][worldWidth] = chaoIcon
- -- Linha 3: 2 blocos (nas duas últimas colunas)
- world[3][worldWidth-1] = chaoIcon
- world[3][worldWidth] = chaoIcon
- -- Linha 4: 3 blocos (nas três últimas colunas)
- world[4][worldWidth-2] = chaoIcon
- world[4][worldWidth-1] = chaoIcon
- world[4][worldWidth] = chaoIcon
- -- Linha 5: 4 blocos (nas quatro últimas colunas)
- world[5][worldWidth-3] = chaoIcon
- world[5][worldWidth-2] = chaoIcon
- world[5][worldWidth-1] = chaoIcon
- world[5][worldWidth] = chaoIcon
- end
- -- Gerar inimigos na linha do jogador (acima do chão)
- inimigos = {}
- local quantidade = math.floor(nivel * 2) -- Exemplo: nível 1 = 2, nível 2 = 4, etc.
- for i = 1, quantidade do
- local posX = math.random(10, worldWidth - 10)
- local posY = altura - 1 -- Mesma linha que o jogador
- local enemy = {
- x = posX,
- y = posY,
- icon = enemyIcons[math.random(#enemyIcons)],
- vida = nivel * 1 -- A vida aumenta com o nível
- }
- table.insert(inimigos, enemy)
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Desenhar o cenário (viewport)
- ----------------------------------------------------------------
- function desenharMundo()
- local header = "❤️Vidas: " .. vidas .. ""..string.rep(" ", 20).."💥Item Mágico: " .. (itemMagico ~= "" and itemMagico or " ") .. " " .. magicalShots .. "\n📶Nível: " .. nivel .. ""..string.rep(" ", 22).."🪙Pontuação: " .. pontuacao .. "\n\n"
- local tela = header
- viewportOffsetX = math.max(1, player.x - math.floor(largura/2))
- if viewportOffsetX + largura - 1 > worldWidth then
- viewportOffsetX = worldWidth - largura + 1
- end
- for r = 1, altura do
- local linha = ""
- for c = viewportOffsetX, viewportOffsetX + largura - 1 do
- local ch = world[r][c] or " "
- if r == player.y and c == player.x then
- ch = player.icon
- end
- for _, enemy in ipairs(inimigos) do
- if r == enemy.y and c == enemy.x then
- ch = enemy.icon
- break
- end
- end
- linha = linha .. ch
- end
- tela = tela .. linha .. "\n"
- end
- return tela
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Aplicar Gravidade – se o jogador estiver sobre um buraco ou sem suporte, perde vida e é reposicionado
- ----------------------------------------------------------------
- function aplicarGravidade()
- if world[player.y][player.x] == holeIcon then
- cairNoBuraco()
- elseif player.y < altura then
- local celulaAbaixo = world[player.y + 1][player.x]
- if celulaAbaixo ~= chaoIcon and celulaAbaixo ~= coinIcon and celulaAbaixo ~= specialBlockIcon then
- player.y = altura - 1
- end
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Processar o pulo e atualização do mundo
- -- puloTipo: "reto" ou "diagonal2"
- -- Permite alcançar até 2 linhas acima
- ----------------------------------------------------------------
- function atualizarMundoPulo(puloTipo)
- if puloTipo == "reto" then
- local tx = player.x
- local ty1 = player.y - 1
- local ty2 = player.y - 2
- if ty1 >= 1 then
- local bloco1 = world[ty1][tx]
- if bloco1 == coinIcon then
- pontuacao = pontuacao + 100
- world[ty1][tx] = "⬛" -- Remove o coletável
- gg.toast("Você coletou uma moeda! (+100 pts)")
- return
- elseif bloco1 == specialBlockIcon then
- local magia = magicIcons[math.random(#magicIcons)]
- if itemMagico == magia then
- magicalShots = magicalShots + 9
- else
- itemMagico = magia
- magicalShots = 9
- end
- pontuacao = pontuacao + 500
- world[ty1][tx] = "✅"
- gg.toast("Bloco mágico! Você coletou " .. magia .. " com 9 disparos! (+500 pts)")
- return
- end
- end
- if ty2 >= 1 then
- local bloco2 = world[ty2][tx]
- if bloco2 == coinIcon then
- pontuacao = pontuacao + 100
- world[ty2][tx] = "⬛"
- gg.toast("Você coletou uma moeda! (+100 pts)")
- return
- elseif bloco2 == specialBlockIcon then
- local magia = magicIcons[math.random(#magicIcons)]
- if itemMagico == magia then
- magicalShots = magicalShots + 9
- else
- itemMagico = magia
- magicalShots = 9
- end
- pontuacao = pontuacao + 500
- world[ty2][tx] = "✅"
- gg.toast("Bloco mágico! Você coletou " .. magia .. " com 9 disparos! (+500 pts)")
- return
- end
- end
- elseif puloTipo == "diagonal2" then
- -- Pulo diagonal: o jogador coleta o item na célula intermediária e aterrissa na célula seguinte.
- -- Exemplo: se o jogador está na célula 1, o coletável está na célula 2 e ele deve cair na célula 3.
- local intX = player.x + 1 -- Célula intermediária (possível coletável)
- local intY = player.y - 1 -- Um nível acima
- local tx = player.x + 2 -- Célula de aterrissagem
- local ty = player.y - 1 -- Mesmo nível que a célula intermediária
- -- Verifica se os índices estão válidos
- if tx > worldWidth or ty < 1 or intX > worldWidth or intY < 1 then
- return
- end
- -- Coleta o item na célula intermediária, se houver
- local coletavel = world[intY][intX]
- if coletavel == coinIcon then
- pontuacao = pontuacao + 100
- world[intY][intX] = "⬛"
- gg.toast("Você coletou uma moeda! (+100 pts)")
- elseif coletavel == specialBlockIcon then
- local magia = magicIcons[math.random(#magicIcons)]
- if itemMagico == magia then
- magicalShots = magicalShots + 9
- else
- itemMagico = magia
- magicalShots = 9
- end
- pontuacao = pontuacao + 500
- world[intY][intX] = "✅"
- gg.toast("Bloco mágico! Você coletou " .. magia .. " com 9 disparos! (+500 pts)")
- end
- -- Verifica a célula de aterrissagem
- if world[ty][tx] == holeIcon then
- cairNoBuraco()
- return
- else
- player.x = tx
- player.y = ty
- end
- aplicarGravidade()
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Atacar com o item mágico
- ----------------------------------------------------------------
- function atacar()
- if itemMagico == "" or magicalShots <= 0 then
- gg.toast("Você não possui um item mágico para disparar!")
- return
- end
- local dx = 1
- local x = player.x + dx
- local y = player.y
- local atingiu = false
- while x <= worldWidth do
- for i, enemy in ipairs(inimigos) do
- if enemy.x == x and enemy.y == y then
- enemy.vida = enemy.vida - 1
- if enemy.vida <= 0 then
- pontuacao = pontuacao + 500
- table.remove(inimigos, i)
- gg.toast("Você destruiu um inimigo com seu ataque mágico! (+500 pts)")
- else
- gg.toast("Você atingiu um inimigo! (-1 de vida)")
- end
- atingiu = true
- break
- end
- end
- if atingiu then break end
- local celula = world[y][x]
- if celula == coinIcon then
- world[y][x] = "⬛" --
- pontuacao = pontuacao + 100
- gg.toast("Seu ataque mágico coletou uma moeda! (+100 pts)")
- atingiu = true
- break
- elseif celula == specialBlockIcon then
- local magia = magicIcons[math.random(#magicIcons)]
- if itemMagico == magia then
- magicalShots = magicalShots + 9
- else
- itemMagico = magia
- magicalShots = 9
- end
- pontuacao = pontuacao + 500
- world[y][x] = "✅"
- gg.toast("Seu ataque mágico destruiu um bloco mágico e coletou " .. magia .. " (+500 pts)! Disparos: " .. magicalShots, "")
- atingiu = true
- break
- end
- x = x + dx
- end
- if not atingiu then
- gg.alert("Seu ataque mágico não atingiu nada.", "OK")
- end
- magicalShots = magicalShots - 1
- if magicalShots <= 0 then
- itemMagico = ""
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Mover o jogador com verificação de colisão com coletáveis e buracos
- ----------------------------------------------------------------
- function moverJogador(direcao)
- if direcao == "direita" then
- if player.x < worldWidth then
- local novoX = player.x + 1
- local celulaDestino = world[player.y][novoX]
- if celulaDestino == holeIcon then
- cairNoBuraco()
- return
- elseif celulaDestino == coinIcon or celulaDestino == specialBlockIcon then
- -- Impede movimento horizontal; o jogador deve pular para coletar
- return
- else
- player.x = novoX
- end
- end
- elseif direcao == "esquerda" then
- if player.x > 1 then
- local novoX = player.x - 1
- local celulaDestino = world[player.y][novoX]
- if celulaDestino == holeIcon then
- cairNoBuraco()
- return
- elseif celulaDestino == coinIcon or celulaDestino == specialBlockIcon then
- return
- else
- player.x = novoX
- end
- end
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Mover os inimigos (movimento horizontal simples)
- ----------------------------------------------------------------
- function moverInimigos()
- for _, enemy in ipairs(inimigos) do
- if math.random() < 0.5 then
- local dir = math.random(1, 2) == 1 and -1 or 1
- local novoX = enemy.x + dir
- if novoX >= 1 and novoX <= worldWidth then
- enemy.x = novoX
- end
- end
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Verificar colisões (jogador com inimigos e buracos)
- ----------------------------------------------------------------
- function checarColisoes()
- for _, enemy in ipairs(inimigos) do
- if player.x == enemy.x and player.y == enemy.y then
- return true
- end
- end
- if world[player.y][player.x] == holeIcon then
- return true
- end
- return false
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Menu de Ações (controles integrados)
- ----------------------------------------------------------------
- function menuAcoes()
- local opcoes = {
- string.rep(" ", 30).."➡️ Direita",
- string.rep(" ", 10).."⬅️ Esquerda",
- string.rep(" ", 60).."🧍♂️ Pular",
- string.rep(" ", 60).."🤸♂️ Saltar",
- string.rep(" ", 60).."💥 Atacar",
- "❌ Desistir!😪"
- }
- local textoTela = desenharMundo() .. "\nℹ️Missão: Colete moedas use poderes contra inimigos evite os buracos no chão e chegue a Bandeira🚩"
- local escolha = gg.choice(opcoes, nil, textoTela)
- return escolha
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Gerar novo cenário ao avançar de nível com escadinha
- ----------------------------------------------------------------
- function avancarNivel()
- local opcao = gg.alert("🚩 Bandeira Conquistada! \nVocê avançou para o próximo nível com mais desafios!", "OK")
- if opcao == 1 then
- nivel = nivel + 1
- gerarMundo(nivel)
- player.x = 1
- player.y = altura - 1
- end
- end
- ----------------------------------------------------------------
- -- FUNÇÃO: Menu Principal do Jogo
- ----------------------------------------------------------------
- function iniciarJogo()
- gerarMundo(nivel)
- while not gameOver do
- local escolha = menuAcoes()
- if not escolha then break end
- if escolha == 1 then
- moverJogador("direita")
- elseif escolha == 2 then
- moverJogador("esquerda")
- elseif escolha == 3 then
- atualizarMundoPulo("reto")
- elseif escolha == 4 then
- atualizarMundoPulo("diagonal2")
- elseif escolha == 5 then
- atacar()
- elseif escolha == 6 then
- gg.alert("Você desistiu do jogo!", "OK")
- os.exit()
- end
- moverInimigos()
- aplicarGravidade()
- if checarColisoes() then
- vidas = vidas - 1
- if vidas <= 0 then
- gg.alert("💥 Você colidiu e perdeu sua última vida! Game Over!", "OK")
- os.exit()
- else
- gg.alert("💥 Você foi atingido! Vidas restantes: " .. vidas, "OK")
- player.x = 1
- player.y = altura - 1
- end
- end
- if player.x >= worldWidth then
- avancarNivel()
- end
- gg.sleep(100)
- end
- end
- ----------------------------------------------------------------
- -- INICIA O JOGO
- ----------------------------------------------------------------
- iniciarJogo()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement