Advertisement
MasterCheats

Mini game Archero 1.5

Feb 3rd, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 16.53 KB | Gaming | 0 0
  1. -- Configurações iniciais
  2. local tabuleiro = ""
  3. local jogador_posicao_x = 14  -- Linha do jogador (válido de 1 a 14, pois 0 e 15 são as bordas)
  4. local jogador_posicao_y = 7   -- Coluna do jogador (válido de 1 a 14)
  5. local porta_x, porta_y = nil, nil  -- A porta só aparece após derrotar os inimigos
  6. local cenarios = {"🧱","🏕️", "🏖️", "🏜️", "🏝️", "🏟️", "🏛️", "🌃", "🕌", "️🕋"}  -- Símbolos das bordas (indicam os cenários)
  7. local cenario_atual = 1
  8. local inimigos = {}
  9. local obstaculos = {}
  10. local dificuldade = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50}  -- Número de inimigos para cada cenário
  11. local monster = 0
  12. local pontuacao = 0
  13. local vida = 3  -- Lógica interna: 3 vidas
  14. local level = 1
  15. local mortes = {}  -- Registra as posições dos inimigos derrotados
  16.  
  17. ----------------------------------------------------------
  18. -- Função para verificar se há um obstáculo em uma dada posição
  19. ----------------------------------------------------------
  20. function is_obstaculo_at(x, y)
  21.     for _, o in ipairs(obstaculos) do
  22.         if o.x == x and o.y == y then
  23.             return true
  24.         end
  25.     end
  26.     return false
  27. end
  28. ----------------------------------------------------------
  29. -- Função para verificar se há um inimigo em uma dada posição (opcionalmente excluindo um índice)
  30. ----------------------------------------------------------
  31. function is_inimigo_at(x, y, excluir_index)
  32.     for idx, inimigo in ipairs(inimigos) do
  33.         if idx ~= excluir_index and inimigo.x == x and inimigo.y == y then
  34.             return true
  35.         end
  36.     end
  37.     return false
  38. end
  39. ----------------------------------------------------------
  40. -- Função para verificar se existe algum obstáculo entre duas posições (linha ou coluna)
  41. ----------------------------------------------------------
  42. function obstaculo_no_caminho(x1, y1, x2, y2)
  43.     for _, o in ipairs(obstaculos) do
  44.         if x1 == x2 and o.x == x1 and o.y > math.min(y1, y2) and o.y < math.max(y1, y2) then
  45.             return true
  46.         elseif y1 == y2 and o.y == y1 and o.x > math.min(x1, x2) and o.x < math.max(x1, x2) then
  47.             return true
  48.         end
  49.     end
  50.     return false
  51. end
  52. ----------------------------------------------------------
  53. -- Função para gerar obstáculos aleatórios
  54. ----------------------------------------------------------
  55. function gerar_obstaculos()
  56.     obstaculos = {}
  57.     for i = 1, 10 do
  58.         local obstaculo_x, obstaculo_y
  59.         repeat
  60.             obstaculo_x = math.random(1, 14)
  61.             obstaculo_y = math.random(1, 14)
  62.         until not (obstaculo_x == jogador_posicao_x and obstaculo_y == jogador_posicao_y)
  63.               and not (porta_x and obstaculo_x == porta_x and obstaculo_y == porta_y)
  64.         table.insert(obstaculos, {x = obstaculo_x, y = obstaculo_y})
  65.     end
  66. end
  67. ----------------------------------------------------------
  68. -- Função para gerar inimigos aleatórios
  69. ----------------------------------------------------------
  70. function gerar_inimigos()
  71.     inimigos = {}
  72.     local quantidade = dificuldade[cenario_atual] or 50
  73.     for i = 1, quantidade do
  74.         local inimigo_x, inimigo_y
  75.         repeat
  76.             inimigo_x = math.random(1, 12)  -- posições válidas de 1 a 14 (bordas em 0 e 15)
  77.             inimigo_y = math.random(1, 12)
  78.         until not (inimigo_x == jogador_posicao_x and inimigo_y == jogador_posicao_y)
  79.               and not is_obstaculo_at(inimigo_x, inimigo_y)
  80.               and not is_inimigo_at(inimigo_x, inimigo_y)
  81.         table.insert(inimigos, {x = inimigo_x, y = inimigo_y})
  82.     end
  83.     porta_x, porta_y = nil, nil  -- Esconde a porta até eliminar os inimigos
  84. end
  85. ----------------------------------------------------------
  86. -- Função para atualizar a porta (aparece quando todos os inimigos forem derrotados)
  87. ----------------------------------------------------------
  88. function atualizar_porta()
  89.     if #inimigos == 0 and not porta_x then
  90.         porta_x, porta_y = 8, 7  -- A porta é exibida na borda esquerda, coluna 7
  91.     end
  92. end
  93. ----------------------------------------------------------
  94. -- Função para mover os inimigos
  95. -- Os inimigos se movem somente se estiverem alinhados com o jogador, não houver obstáculos no caminho,
  96. -- e não houver colisão com outro inimigo (exceto se for a primeira a ocupar a célula do jogador).
  97. ----------------------------------------------------------
  98. function mover_inimigos()
  99.     for idx, inimigo in ipairs(inimigos) do
  100.         if inimigo.x == jogador_posicao_x and not obstaculo_no_caminho(inimigo.x, inimigo.y, jogador_posicao_x, jogador_posicao_y) then
  101.             local nova_y = inimigo.y
  102.             if inimigo.y < jogador_posicao_y then
  103.                 nova_y = inimigo.y + 1
  104.             elseif inimigo.y > jogador_posicao_y then
  105.                 nova_y = inimigo.y - 1
  106.             end
  107.             if nova_y == jogador_posicao_y then
  108.                 if not is_inimigo_at(inimigo.x, nova_y, idx) then
  109.                     inimigo.y = nova_y
  110.                 end
  111.             else
  112.                 if not is_obstaculo_at(inimigo.x, nova_y) and not is_inimigo_at(inimigo.x, nova_y, idx) then
  113.                     inimigo.y = nova_y
  114.                 end
  115.             end
  116.         elseif inimigo.y == jogador_posicao_y and not obstaculo_no_caminho(inimigo.x, inimigo.y, jogador_posicao_x, jogador_posicao_y) then
  117.             local nova_x = inimigo.x
  118.             if inimigo.x < jogador_posicao_x then
  119.                 nova_x = inimigo.x + 1
  120.             elseif inimigo.x > jogador_posicao_x then
  121.                 nova_x = inimigo.x - 1
  122.             end
  123.             if nova_x == jogador_posicao_x then
  124.                 if not is_inimigo_at(nova_x, inimigo.y, idx) then
  125.                     inimigo.x = nova_x
  126.                 end
  127.             else
  128.                 if not is_obstaculo_at(nova_x, inimigo.y) and not is_inimigo_at(nova_x, inimigo.y, idx) then
  129.                     inimigo.x = nova_x
  130.                 end
  131.             end
  132.         end
  133.     end
  134. end
  135. ----------------------------------------------------------
  136. -- Função para desenhar o tabuleiro
  137. ----------------------------------------------------------
  138. function desenhar_tabuleiro()
  139.     tabuleiro = ""
  140.     local cor = cenarios[cenario_atual]
  141.     local shooting_trail = {}
  142.    
  143.     -- Define a trilha de disparo (5) se houver um inimigo alinhado com o jogador, a distância for <= 5,
  144.     -- e sem obstáculos no caminho
  145.     for _, inimigo in ipairs(inimigos) do
  146.         if inimigo.x == jogador_posicao_x then
  147.             local distancia = math.abs(inimigo.y - jogador_posicao_y)
  148.             if distancia <= 5 and not obstaculo_no_caminho(jogador_posicao_x, jogador_posicao_y, inimigo.x, inimigo.y) then
  149.                 local dir = (inimigo.y > jogador_posicao_y) and 1 or -1
  150.                 for i = 1, 5 do
  151.                     table.insert(shooting_trail, {x = jogador_posicao_x, y = jogador_posicao_y + i * dir})
  152.                 end
  153.                 break  -- Usa o primeiro inimigo alinhado encontrado
  154.             end
  155.         elseif inimigo.y == jogador_posicao_y then
  156.             local distancia = math.abs(inimigo.x - jogador_posicao_x)
  157.             if distancia <= 5 and not obstaculo_no_caminho(jogador_posicao_x, jogador_posicao_y, inimigo.x, inimigo.y) then
  158.                 local dir = (inimigo.x > jogador_posicao_x) and 1 or -1
  159.                 for i = 1, 5 do
  160.                     table.insert(shooting_trail, {x = jogador_posicao_x + i * dir, y = jogador_posicao_y})
  161.                 end
  162.                 break
  163.             end
  164.         end
  165.     end
  166.     for i = 0, 15 do
  167.         for j = 0, 15 do
  168.             -- 1. Bordas
  169.             if i == 0 or i == 15 or j == 0 or j == 15 then
  170.                 tabuleiro = tabuleiro .. cor
  171.             -- 2. Posição do jogador
  172.             elseif i == jogador_posicao_x and j == jogador_posicao_y then
  173.                 tabuleiro = tabuleiro .. "🧕"
  174.             -- 3. Porta
  175.             elseif porta_x and i == porta_x and j == porta_y then
  176.                 tabuleiro = tabuleiro .. "️🚩"
  177.             else
  178.                 -- 4. Se houver um inimigo na célula, exibe o inimigo
  179.                 local enemy_found = false
  180.                 for _, inimigo in ipairs(inimigos) do
  181.                     if i == inimigo.x and j == inimigo.y then
  182.                         tabuleiro = tabuleiro .. "👹"
  183.                         enemy_found = true
  184.                         break
  185.                     end
  186.                 end
  187.                 if not enemy_found then
  188.                     -- 5. Se houver um obstáculo na célula, exibe o obstáculo
  189.                     if is_obstaculo_at(i, j) then
  190.                         tabuleiro = tabuleiro .. "🗿"
  191.                     -- 6. Se a célula fizer parte da trilha de disparo, exibe o efeito de disparo
  192.                     elseif (function()
  193.                             for _, pos in ipairs(shooting_trail) do
  194.                                 if pos.x == i and pos.y == j then
  195.                                     return true
  196.                                 end
  197.                             end
  198.                             return false
  199.                          end)() then
  200.                         tabuleiro = tabuleiro .. "⚡"
  201.                     -- 7. Se houver um inimigo morto na célula, exibe o símbolo de morte
  202.                     else
  203.                         local is_dead = false
  204.                         for _, morte in ipairs(mortes) do
  205.                             if i == morte.x and j == morte.y then
  206.                                 tabuleiro = tabuleiro .. "☠️"
  207.                                 is_dead = true
  208.                                 break
  209.                             end
  210.                         end
  211.                         -- 8. Caso contrário, exibe o marcador padrão
  212.                         if not is_dead then
  213.                             tabuleiro = tabuleiro .. "✔"
  214.                         end
  215.                     end
  216.                 end
  217.             end
  218.         end
  219.         tabuleiro = tabuleiro .. "\n"
  220.     end
  221.     -- Exibe as vidas usando corações
  222.     return "Pontuação: " .. pontuacao .. "                          Nível: " .. level ..
  223.            "\nInimigos Mortos: " .. monster .. "               Vidas: " .. string.rep("❤️", vida) .. "\n" .. tabuleiro
  224. end
  225. ----------------------------------------------------------
  226. -- Função para atacar inimigos
  227. -- O ataque atinge o inimigo em linha reta (mesma linha ou coluna) que esteja mais próximo do jogador,
  228. -- desde que esteja a no máximo 5 espaços e sem obstáculos no caminho.
  229. ----------------------------------------------------------
  230. function atacar()
  231.     local inimigo_alvo = nil
  232.     local distancia_min = math.huge  -- Inicializa com um número muito grande
  233.    
  234.     for _, inimigo in ipairs(inimigos) do
  235.         if inimigo.x == jogador_posicao_x or inimigo.y == jogador_posicao_y then
  236.             local distancia = math.abs(inimigo.x - jogador_posicao_x) + math.abs(inimigo.y - jogador_posicao_y)
  237.             if distancia <= 5 then  -- Verifica se o inimigo está no alcance (5 espaços)
  238.                 local bloqueado = false
  239.                 if jogador_posicao_x == inimigo.x then
  240.                     for _, obstaculo in ipairs(obstaculos) do
  241.                         if obstaculo.x == jogador_posicao_x and obstaculo.y > math.min(jogador_posicao_y, inimigo.y) and obstaculo.y < math.max(jogador_posicao_y, inimigo.y) then
  242.                             bloqueado = true
  243.                             break
  244.                         end
  245.                     end
  246.                 elseif jogador_posicao_y == inimigo.y then
  247.                     for _, obstaculo in ipairs(obstaculos) do
  248.                         if obstaculo.y == jogador_posicao_y and obstaculo.x > math.min(jogador_posicao_x, inimigo.x) and obstaculo.x < math.max(jogador_posicao_x, inimigo.x) then
  249.                             bloqueado = true
  250.                             break
  251.                         end
  252.                     end
  253.                 end
  254.                 if not bloqueado and distancia < distancia_min then
  255.                     distancia_min = distancia
  256.                     inimigo_alvo = inimigo
  257.                 end
  258.             end
  259.         end
  260.     end
  261.     if inimigo_alvo then
  262.         table.insert(mortes, {x = inimigo_alvo.x, y = inimigo_alvo.y})
  263.         for i = #inimigos, 1, -1 do
  264.             if inimigos[i] == inimigo_alvo then
  265.                 table.remove(inimigos, i)
  266.                 break
  267.             end
  268.         end
  269.         pontuacao = pontuacao + 150
  270.         monster = monster + 1
  271.         atualizar_porta()
  272.     end
  273. end
  274. ----------------------------------------------------------
  275. -- Função para reiniciar o jogo
  276. ----------------------------------------------------------
  277. function resetar_jogo()
  278.     local escolha = gg.choice({"🔄 Reiniciar Jogo", "❌ Sair"}, nil, "O jogo terminou! Deseja reiniciar?")
  279.    
  280.     if escolha == 1 then
  281.         -- Reseta todas as variáveis do jogo
  282.         jogador_posicao_x, jogador_posicao_y = 14, 7
  283.         porta_x, porta_y = nil, nil
  284.         cenario_atual = 1
  285.         inimigos = {}
  286.         obstaculos = {}
  287.         dificuldade = {5, 10, 15, 20, 25, 30, 35, 50}
  288.         monster = 0
  289.         pontuacao = 0
  290.         vida = 3
  291.         mortes = {}
  292.         level = 1
  293.        
  294.         gg.toast("Jogo reiniciado!")
  295.         jogar()  -- Inicia um novo jogo
  296.     else
  297.         gg.toast("Jogo encerrado.")
  298.     end
  299. end
  300. ----------------------------------------------------------
  301. -- Função principal do jogo
  302. ----------------------------------------------------------
  303. function jogar()
  304.     gerar_obstaculos()
  305.     gerar_inimigos()
  306.     while true do
  307.         local tabuleiro_atual = desenhar_tabuleiro()
  308.        
  309.         local escolha = gg.choice(
  310.             {
  311.                 "                    ⬆️ Cima\n",
  312.                 "\n⬅️ Esquerda\n",
  313.                 "\n                                        ➡️ Direita\n",
  314.                 "\n                    ⬇️ Baixo\n",
  315.                 "\n                                         🏹 Atacar\n",
  316.                 "❌ Sair"
  317.             },
  318.             nil, tabuleiro_atual)
  319.        
  320.         -- Movimentação do jogador com verificação de obstáculo
  321.         if escolha == 1 and jogador_posicao_x > 1 and not is_obstaculo_at(jogador_posicao_x - 1, jogador_posicao_y) then
  322.             jogador_posicao_x = jogador_posicao_x - 1  -- Cima: diminui a linha
  323.         elseif escolha == 2 and jogador_posicao_y > 1 and not is_obstaculo_at(jogador_posicao_x, jogador_posicao_y - 1) then
  324.             jogador_posicao_y = jogador_posicao_y - 1  -- Esquerda: diminui a coluna
  325.         elseif escolha == 3 and jogador_posicao_y < 14 and not is_obstaculo_at(jogador_posicao_x, jogador_posicao_y + 1) then
  326.             jogador_posicao_y = jogador_posicao_y + 1  -- Direita: aumenta a coluna
  327.         elseif escolha == 4 and jogador_posicao_x < 14 and not is_obstaculo_at(jogador_posicao_x + 1, jogador_posicao_y) then
  328.             jogador_posicao_x = jogador_posicao_x + 1  -- Baixo: aumenta a linha
  329.         elseif escolha == 5 then
  330.             atacar()
  331.         elseif escolha == 6 or escolha == nil then
  332.             gg.toast("Jogo encerrado.")
  333.             break
  334.         end
  335.         mover_inimigos()
  336.        
  337.         -- Verifica se algum inimigo atingiu o jogador (caso algum inimigo consiga ocupar a mesma célula)
  338.         for _, inimigo in ipairs(inimigos) do
  339.             if inimigo.x == jogador_posicao_x and inimigo.y == jogador_posicao_y then
  340.                 vida = vida - 1  -- Reduz a vida
  341.                 gg.toast("Você foi atingido! Vidas restantes: " .. string.rep("❤️", vida))
  342.                
  343.                 if vida == 0 then
  344.                     gg.toast("Você foi derrotado pelos inimigos!")
  345.                     resetar_jogo()  -- Reinicia o jogo
  346.                     return
  347.                 end
  348.             end
  349.         end
  350.         -- Verifica se o jogador entrou na porta para avançar de cenário
  351.         if porta_x and jogador_posicao_x == porta_x and jogador_posicao_y == porta_y then
  352.             if cenario_atual < #cenarios then
  353.                 cenario_atual = cenario_atual + 1
  354.                 level = cenario_atual
  355.                 jogador_posicao_x, jogador_posicao_y = 14, 7  -- Reset da posição do jogador
  356.                 mortes = {}
  357.                 gerar_obstaculos()
  358.                 gerar_inimigos()
  359.                 gg.toast("Novo cenário!")
  360.             else
  361.                 gg.toast("Você venceu o jogo!")
  362.                 resetar_jogo()
  363.                 return
  364.             end
  365.         end
  366.     end
  367. end
  368. -- Iniciar o jogo
  369. jogar()
  370.  
  371.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement