Advertisement
MasterCheats

Jogo Tetris GG

Jan 31st, 2025 (edited)
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 15.76 KB | Gaming | 0 0
  1. -- Configurações do Tabuleiro Principal
  2. local largura = 10
  3. local altura = 20
  4. ultimoBonus = 0
  5.  
  6. -- Inicializa o tabuleiro principal (matriz altura x largura)
  7. local tabuleiro = {}
  8. for y = 1, altura do
  9.   tabuleiro[y] = {}
  10.   for x = 1, largura do
  11.     tabuleiro[y][x] = 0  -- 0: célula vazia
  12.   end
  13. end
  14. -- Definição das Peças (cada peça é uma matriz 2D)
  15. -- As peças normais são representadas com 1; a peça especial (última) é um bloco único
  16. local pecas = {
  17.   { {1,1,1,1} },           -- Linha
  18.   { {1,1}, {1,1} },        -- Quadrado
  19.   { {0,1,0}, {1,1,1} },     -- T
  20.   { {1,0}, {1,0}, {1,1} },  -- L
  21.   { {0,1}, {0,1}, {1,1} },  -- J
  22.   { {1,1,0}, {0,1,1} },     -- Z
  23.   { {0,1,1}, {1,1,0} },     -- S
  24.   { {1} }                  -- Peça especial (um bloco único)
  25. }
  26.  
  27. -- Função para girar uma peça (matriz) 90° no sentido horário
  28. local function girarPeca(peca)
  29.   local nova = {}
  30.   local larguraPeca = #peca[1]
  31.   local alturaPeca = #peca
  32.   for x = 1, larguraPeca do
  33.     nova[x] = {}
  34.     for y = 1, alturaPeca do
  35.       nova[x][y] = peca[alturaPeca - y + 1][x]
  36.     end
  37.   end
  38.   return nova
  39. end
  40. -- Cria uma cópia do tabuleiro principal para exibição (não altera o estado real)
  41. local function copiarTabuleiro()
  42.   local copia = {}
  43.   for y = 1, altura do
  44.     copia[y] = {}
  45.     for x = 1, largura do
  46.       copia[y][x] = tabuleiro[y][x]
  47.     end
  48.   end
  49.   return copia
  50. end
  51. --------------------------------------------------------------------------------
  52. -- Função para gerar a string do mini-tabuleiro (4x4) com a próxima peça.
  53. -- A peça é centralizada (se couber) dentro da área 4x4.
  54. local function gerarMiniTabuleiro(peca)
  55.   -- Inicializa uma matriz 4x4 com zeros
  56.   local mini = {}
  57.   for y = 1, 4 do
  58.     mini[y] = {}
  59.     for x = 1, 4 do
  60.       mini[y][x] = 0
  61.     end
  62.   end
  63.   local pAltura = #peca
  64.   local pLargura = #peca[1]
  65.  
  66.   -- Calcula offsets para centralizar a peça no mini-tabuleiro 4x4
  67.   local offsetX = math.floor((4 - pLargura) / 2)
  68.   local offsetY = math.floor((4 - pAltura) / 2)
  69.  
  70.   -- Preenche o mini-tabuleiro com a peça centralizada
  71.   for y = 1, pAltura do
  72.     for x = 1, pLargura do
  73.       if peca[y][x] == 1 then
  74.         local mx = x + offsetX
  75.         local my = y + offsetY
  76.         if mx >= 1 and mx <= 4 and my >= 1 and my <= 4 then
  77.           -- Para a peça especial, usamos o valor 3; para as demais, 1.
  78.           mini[my][mx] = (pLargura == 1 and pAltura == 1) and 3 or 1
  79.         end
  80.       end
  81.     end
  82.   end
  83.  
  84.   -- Converte o mini-tabuleiro para string (usando os mesmos emojis)
  85.   local s = ""
  86.   for y = 1, 4 do
  87.     for x = 1, 4 do
  88.       if mini[y][x] == 0 then
  89.         s = s .. "⬛"
  90.       elseif mini[y][x] == 1 then
  91.         s = s .. "⬜"
  92.       elseif mini[y][x] == 3 then
  93.         s = s .. "🟥"
  94.       end
  95.     end
  96.     s = s .. "\n"
  97.   end
  98.   return s
  99. end
  100. --------------------------------------------------------------------------------
  101. -- Variáveis globais de pontuação e bônus
  102. local pontuacao = 0
  103. local ultimoBonus = 0  -- Valor do bônus obtido na última jogada
  104.  
  105. -- Função para exibir o tabuleiro principal com a peça em movimento, a pontuação e o bônus.
  106. -- A exibição incluirá, do lado direito, o mini-tabuleiro com a próxima peça.
  107. local function exibirTabuleiro(peca, px, py, pontuacao, proximaPeca)
  108.    
  109. if not peca then
  110.         gg.toast("Erro: Nenhuma peça foi carregada!")
  111.         return
  112. end
  113.  
  114.   local temp = copiarTabuleiro()
  115.  
  116.   -- Insere a peça atual na cópia do tabuleiro
  117.   for y = 1, #peca do
  118.     for x = 1, #peca[y] do
  119.       if peca[y][x] == 1 then
  120.         local tx = px + x - 1
  121.         local ty = py + y - 1
  122.         if ty >= 1 and ty <= altura and tx >= 1 and tx <= largura then
  123.           -- Se for a peça especial (único bloco), usamos o valor 3 para diferenciá-la
  124.           if (#peca == 1 and #peca[1] == 1) then
  125.             temp[ty][tx] = 3
  126.           else
  127.             temp[ty][tx] = 1
  128.           end
  129.         end
  130.       end
  131.     end
  132.   end
  133.  
  134.   -- Monta a string do cabeçalho: pontuação e bônus (sempre exibindo o bônus, mesmo que 0)
  135.   local saida = "🏆 Pontuação: " .. pontuacao .. "\n"
  136.  
  137.  -- saida = saida .. "Bônus: " .. tostring(ultimoBonus) .. " pts\n"
  138. saida = saida ..string.rep(" ", 50).. "🔜Próxima Peça:\n"
  139.  
  140.   -- Constrói o mini-tabuleiro da próxima peça
  141.   local miniStr = gerarMiniTabuleiro(proximaPeca)
  142.   local miniLinhas = {}
  143.   for linha in miniStr:gmatch("[^\n]+") do
  144.     table.insert(miniLinhas, linha)
  145.   end
  146.  
  147.   -- Concatena o tabuleiro principal com o mini-tabuleiro
  148.   for y = 1, altura do
  149.     for x = 1, largura do
  150.       if temp[y][x] == 0 then
  151.         saida = saida .. "⬛"
  152.       elseif temp[y][x] == 1 then
  153.         saida = saida .. "⬜"
  154.       elseif temp[y][x] == 2 then
  155.         saida = saida .. "🟨"
  156.       elseif temp[y][x] == 3 then
  157.         saida = saida .. "🟥"
  158.       end
  159.     end
  160.     if y <= 3 and miniLinhas[y] then
  161.       saida = saida .. "    " .. miniLinhas[y]
  162.     end
  163.     saida = saida .. "\n"
  164.   end
  165.   return saida
  166. end
  167. --------------------------------------------------------------------------------
  168. -- Função para verificar se uma peça pode ser colocada na posição (px, py)
  169. -- Para peças normais, a célula deve estar vazia.
  170. -- Para a peça especial, ela ignora obstruções enquanto se move.
  171. local function podeColocarPeca(peca, px, py, isSpecial)
  172.   for y = 1, #peca do
  173.     for x = 1, #peca[y] do
  174.       if peca[y][x] == 1 then
  175.         local tx = px + x - 1
  176.         local ty = py + y - 1
  177.         if tx < 1 or tx > largura or ty < 1 or ty > altura then
  178.           return false
  179.         end
  180.         if not isSpecial then
  181.           if tabuleiro[ty][tx] ~= 0 then
  182.             return false
  183.           end
  184.         end
  185.       end
  186.     end
  187.   end
  188.   return true
  189. end
  190. --------------------------------------------------------------------------------
  191. -- Função para fixar uma peça no tabuleiro.
  192. -- Peças normais são marcadas com 2; a peça especial com 3.
  193. local function fixarPeca(peca, px, py, isSpecial)
  194.   for y = 1, #peca do
  195.     for x = 1, #peca[y] do
  196.       if peca[y][x] == 1 then
  197.         local tx = px + x - 1
  198.         local ty = py + y - 1
  199.         if isSpecial then
  200.           tabuleiro[ty][tx] = 3
  201.         else
  202.           tabuleiro[ty][tx] = 2
  203.         end
  204.       end
  205.     end
  206.   end
  207. end
  208. --------------------------------------------------------------------------------
  209. -- Função para limpar as linhas completas de uma única jogada.
  210. -- Cria uma nova lista de linhas não completas e adiciona linhas vazias no topo.
  211. local function limparLinhas()
  212.   local linhasLimpa = 0
  213.   local nova = {}
  214.  
  215.   for y = 1, altura do
  216.     local completa = true
  217.     for x = 1, largura do
  218.       if tabuleiro[y][x] == 0 then
  219.         completa = false
  220.         break
  221.       end
  222.     end
  223.     if completa then
  224.       linhasLimpa = linhasLimpa + 1
  225.     else
  226.       table.insert(nova, tabuleiro[y])
  227.     end
  228.   end
  229.  
  230.   for i = 1, linhasLimpa do
  231.     local linhaVazia = {}
  232.     for x = 1, largura do
  233.       linhaVazia[x] = 0
  234.     end
  235.     table.insert(nova, 1, linhaVazia)
  236.   end
  237.  
  238.   tabuleiro = nova
  239.   return linhasLimpa
  240. end
  241. --------------------------------------------------------------------------------
  242. -- Função para gerar uma nova peça.
  243. -- Retorna a peça, posição inicial (px, py) e flag isSpecial.
  244. local function novaPeca()
  245.   local indice = math.random(#pecas)
  246.   local peca = pecas[indice]
  247.   local isSpecial = (indice == #pecas)
  248.   local px = math.floor(largura / 2)
  249.   local py = 1
  250.   return peca, px, py, isSpecial
  251. end
  252. --------------------------------------------------------------------------------
  253.  
  254. function cnt()
  255.     gg.alert([[
  256. 🔔 **Script made for the Channel**
  257.     📽 **Master Cheats⚜** - Created by: **Edrwuan👑**
  258.    
  259.     ➡️ **Subscribe to the Channel** for more Cheats and Game News 🎮
  260.    
  261.     🔗 **Telegram Contact**: [Click here to join](https://t.me/joinchat/IarWN9hjkgcunWEN)
  262.     📧 **Email**: edrwuan@live.com
  263.    
  264.     📱 **Official Telegram**: @MastercheatsAnonymous
  265.  
  266.  
  267.  
  268.     🔔 **Script produzido para o Canal**
  269.     📽 **Master Cheats⚜** - Criado por: **Edrwuan👑**
  270.    
  271.     ➡️ **Inscreva-se no Canal** para mais Cheats e Novidades sobre Jogos 🎮
  272.    
  273.     🔗 **Contato Telegram**: [Clique aqui para entrar](https://t.me/joinchat/IarWN9hjkgcunWEN)
  274.     📧 **E-mail**: edrwuan@live.com
  275.    
  276.     📱 **Telegram Oficial**: @MastercheatsAnonymous
  277.     ]])
  278.    
  279.     return
  280. end
  281.  
  282. -- Função para exibir a mensagem de saída com um tom mais emocional
  283. function sairJogo()
  284.     local resposta = gg.choice({"✅Sim, sair", "❌Não, continuar"}, nil, "Você tem certeza? 😔 Quer mesmo deixar o jogo?")
  285.    
  286.     if resposta == 1 then
  287.         -- Mensagem de despedida mais emotiva
  288.         gg.alert("Oh não! 😢 O jogo terminou. Volte logo para se divertir mais! Até a próxima! 👋")
  289.         os.exit()  -- Isso encerra o script
  290.     else
  291.         -- Mensagem de ânimo caso o jogador escolha continuar
  292.         gg.alert("Ufa! Que bom que você decidiu continuar! 😎 Vamos nessa, boa sorte! 🍀")
  293.     end
  294. end
  295.  
  296. -- Função para reiniciar o jogo
  297. local function reiniciarJogo()
  298.   -- Zera a pontuação
  299.   pontuacao = 0
  300.   -- Zera o bônus
  301.   ultimoBonus = 0
  302.   -- Reseta o tabuleiro
  303.   tabuleiro = {}
  304.   for y = 1, altura do
  305.     tabuleiro[y] = {}
  306.     for x = 1, largura do
  307.       tabuleiro[y][x] = 0  -- 0: célula vazia
  308.     end
  309.   end
  310.   -- Gera a primeira peça
  311.   proximaPeca, proximaPx, proximaPy, proximaIsSpecial = novaPeca()
  312.   -- Você pode adicionar qualquer outro reset necessário para o jogo, como o nível, timer, etc.
  313. end
  314.  
  315. function info()
  316. gg.alert([[
  317. 🟩🟦🟥🟨 TETRIS CLASSIC 🟩🟦🟥🟨
  318.  
  319. Bem-vindo ao Tetris Clássico! 🎮
  320.  
  321. Objetivo do Jogo:
  322. O objetivo é preencher linhas horizontais inteiras no tabuleiro com blocos coloridos que caem do topo. Quando uma linha é completada, ela desaparece, e você ganha pontos!
  323.    
  324. Como Jogar:
  325. - Use as setas para mover as peças para a esquerda (⬅️) ou para a direita (➡️).
  326. - Pressione 🌀 para girar a peça.
  327. - Pressione ⏬ para fazer a peça descer mais rápido.
  328. - O jogo termina quando o tabuleiro se enche e não há mais espaço para as peças caírem.
  329.  
  330. Lógica do Jogo:
  331. - O tabuleiro é composto por linhas e colunas onde as peças caem.
  332. - Cada peça é composta por quatro blocos, e existem diferentes formas de peças.
  333. - Você precisa encaixar as peças de maneira estratégica para completar as linhas.
  334. - A cada linha completada, você ganha pontos e o jogo fica mais rápido!
  335.  
  336. Pontuação e Combos:
  337. - Cada linha completada dá pontos! 🏅
  338. - Se você conseguir completar várias linhas ao mesmo tempo (combo), você ganhará **muito mais pontos!** 💥
  339. - O bônus por combo é multiplicado da seguinte forma:
  340.     - 1 linha = 100 pontos
  341.     - 2 linhas = 400 pontos
  342.     - 3 linhas = 900 pontos
  343.     - 4 linhas = 1600 pontos
  344. - Aproveite os combos para maximizar sua pontuação! 🎉
  345.  
  346. 🎉 Boa sorte e divirta-se jogando Tetris Clássico! 🏅
  347. ]])
  348.    return
  349. end
  350.  
  351. -- Função para efetuar o “drop” (encaixe) da peça.
  352. -- Para peças normais, desce até que não seja possível mover mais para baixo.
  353. -- Para a peça especial, ela ignora obstruções e desce até o último espaço vazio na coluna.
  354. local function descerPeca(peca, px, py, isSpecial)
  355.   if not isSpecial then
  356.     while podeColocarPeca(peca, px, py + 1, isSpecial) do
  357.       py = py + 1
  358.     end
  359.   else
  360.     local finalY = py
  361.     for y = altura, py, -1 do
  362.       if tabuleiro[y][px] == 0 then
  363.         finalY = y
  364.         break
  365.       end
  366.     end
  367.     py = finalY
  368.   end
  369.   return px, py
  370. end
  371. --------------------------------------------------------------------------------
  372. -- Loop principal do jogo usando gg.choice para a interação.
  373. -- Utilizamos uma variável 'proximaPeca' para armazenar a próxima peça que será exibida.
  374. math.randomseed(os.time())
  375.  
  376. -- Gera a primeira "próxima peça"
  377. local proximaPeca, proximaPx, proximaPy, proximaIsSpecial = novaPeca()
  378.  
  379. while true do
  380.   -- A peça atual será a que estava em "próxima", e geramos uma nova próxima peça
  381.   local peca, px, py, isSpecial = proximaPeca, math.floor(largura/2), 1, proximaIsSpecial
  382.   proximaPeca, proximaPx, proximaPy, proximaIsSpecial = novaPeca()
  383.  
  384.   -- Se a peça atual não couber na posição inicial, encerra o jogo.
  385.   if not podeColocarPeca(peca, px, py, isSpecial) then
  386.     gg.alert("🚨 **Jogo Finalizado!** 🚨\n\n🏆 **Sua Pontuação Final: " .. pontuacao .. "**\n\n💪 **Você mandou bem!** 💪\n\n🌟 Vamos tentar de novo e superar essa pontuação? 🌟\n\n🎮 **Clique para jogar novamente e se divertir ainda mais!** 🎮")
  387.    
  388. reiniciarJogo()
  389. end
  390.  
  391.   -- Zera o bônus da jogada atual
  392.   ultimoBonus = 0
  393.  
  394.   -- Suponha que você já tenha definido as funções: exibirTabuleiro(), podeColocarPeca(), girarPeca(), descerPeca(), fixarPeca(), limparLinhas(), sairJogo(), etc.
  395.  
  396. while true do
  397.     -- Exibe o tabuleiro atualizado
  398.     local tabuleiroExibido = exibirTabuleiro(peca, px, py, pontuacao, proximaPeca)
  399.    
  400.     -- Exibe as opções para o jogador
  401.     local opcoes = {
  402.       "⬅️ Mover Esquerda",
  403.       string.rep(" ", 20).."➡️ Mover Direita",
  404.       string.rep(" ", 60).."🌀 Girar",
  405.       "⏬ Encaixar\n",
  406.       "📖 Sobre este Jogo",
  407.       "🌐 Contate Me",
  408.       "❌ Desistir"
  409.     }
  410.    
  411.     -- Apresenta o menu de escolha ao jogador
  412. local escolha = gg.choice(opcoes, nil, tabuleiroExibido .. "\n🕹️Classic Tetris🧮️ GG - Game Made by MasterYT😎")
  413.  
  414.     if escolha == nil then
  415.       os.exit()  -- Encerra o jogo se o jogador não escolher nada
  416.     end
  417.    
  418.     if escolha == 1 then
  419.       -- Mover para a esquerda se possível
  420.       if podeColocarPeca(peca, px - 1, py, isSpecial) then
  421.         px = px - 1
  422.       end
  423.     elseif escolha == 2 then
  424.       -- Mover para a direita se possível
  425.       if podeColocarPeca(peca, px + 1, py, isSpecial) then
  426.         px = px + 1
  427.       end
  428.     elseif escolha == 3 then
  429.       -- Girar a peça se possível
  430.       local pecaRotacionada = girarPeca(peca)
  431.       if podeColocarPeca(pecaRotacionada, px, py, isSpecial) then
  432.         peca = pecaRotacionada
  433.       end
  434.     elseif escolha == 4 then
  435.       -- Descer a peça e fixar no tabuleiro
  436.       px, py = descerPeca(peca, px, py, isSpecial)
  437.       fixarPeca(peca, px, py, isSpecial)
  438.      
  439.       -- Limpar linhas se necessário
  440.       local linhas = limparLinhas()
  441.       gg.toast("Linhas limpas: " .. linhas)  -- Mensagem de depuração
  442.      
  443.       if linhas > 0 then
  444.         -- Calcular bônus de acordo com as linhas limpas
  445.         local mult = linhas
  446.         local pontosGanho = linhas * 100 * mult
  447.         pontuacao = pontuacao + pontosGanho
  448.         ultimoBonus = pontosGanho  -- Armazena o bônus desta jogada
  449.         gg.toast("🎉 Bônus desta jogada: " .. ultimoBonus .. " 🏅 pts!")
  450.       else
  451.         ultimoBonus = 0
  452.       end
  453.      
  454.       -- Exibir o tabuleiro após a ação
  455.       exibirTabuleiro()
  456.      
  457.       -- Sair do loop para gerar uma nova peça
  458.       break
  459.     elseif escolha == 5 then
  460.       info()
  461.     elseif escolha == 6 then
  462.       cnt()
  463.     elseif escolha == 7 then
  464.       -- Opção de sair do jogo
  465.       sairJogo()
  466.       break
  467.     end
  468.    
  469.     -- Verificar se a peça pode descer, se não, fixa a peça automaticamente
  470.     if not podeColocarPeca(peca, px, py + 1, isSpecial) then
  471.       fixarPeca(peca, px, py, isSpecial)
  472.      
  473.       local linhas = limparLinhas()
  474.       gg.toast("Linhas limpas: " .. linhas)
  475.      
  476.       if linhas > 0 then
  477.         local mult = linhas
  478.         local pontosGanho = linhas * 100 * mult
  479.         pontuacao = pontuacao + pontosGanho
  480.         ultimoBonus = pontosGanho  -- Armazena o bônus desta jogada
  481.       else
  482.         ultimoBonus = 0
  483.       end
  484.      
  485.       -- Sair do loop para gerar uma nova peça
  486.       break
  487.     end
  488.   end
  489. end
  490.  
  491.  
  492.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement