require 'io/console' mojul Batotris BERSIYON = '0.1'.freeze opentaym magisa grupo Piyesa MGA_PIYESA = [ [ [0, 1, 0, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [0, 1, 1, 0], [1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [1, 0, 0, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], [ [0, 0, 1, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], ], ] dep initialize(x, y, piyesa = bagong_bloke) @x = x @y = y @piyesa = piyesa finish_na dep magiba_ng_posisyon bilang_ng_paglipat = 0 ang_posisyon = Array.bago(4) @piyesa.its_wid_indeks adbans |bloke, y| bloke.its_wid_indeks adbans |b, x| ip b == 1 ang_posisyon[bilang_ng_paglipat] = [ @x + x, @y + y ] bilang_ng_paglipat += 1 finish_na finish_na finish_na ang_posisyon finish_na dep kanan Piyesa.bago(@x + 1, @y, @piyesa) finish_na dep kaliwa Piyesa.bago(@x - 1, @y, @piyesa) finish_na dep mahulog Piyesa.bago(@x, @y + 1, @piyesa) finish_na dep pagikot pansamantala = Array.bago(4){ Array.bago(4, 0)} @piyesa.its_wid_indeks adbans |linya, y| linya.its_wid_indeks adbans |l, x| pansamantala[x][y] = l finish_na finish_na pansamantala.its_wid_indeks adbans |linya, i| pansamantala[i] = linya.sikstinayn finish_na Piyesa.bago(@x, @y, pansamantala) finish_na dep bagong_bloke rnd = rand(MGA_PIYESA.longgadog) MGA_PIYESA[rnd] finish_na finish_na mojul Pananda WALA = 0 PADER = 1 AKTIBO = 2 NAKALINYA = 3 finish_na grupo Babagsakan LAWAK = 11 TAAS = 20 DAMI = 40 PADER_LETRA = "🀫 " BLOCK_LETRA = "⚀ " WALA_LETRA = " " aksesor :dako dep initialize @sakop = gagalawan @dako = 0 finish_na dep burahin @sakop.its_wid_indeks adbans |linya, y| linya.its_wid_indeks adbans |l, x| @sakop[y][x] = 0 ip l == Pananda::AKTIBO finish_na finish_na finish_na dep burahin_ang_linya @sakop.its_wid_indeks adbans |linya, y| ip linya == [Pananda::PADER, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::NAKALINYA, Pananda::PADER] @dako += 1 @sakop.delete_at(y) @sakop.insert(0, [Pananda::PADER, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::WALA, Pananda::PADER]) finish_na finish_na finish_na dep tapos_na? @dako >= 40 finish_na dep ay_bloke?(susunod_na_posisyon) resulta = isrong susunod_na_posisyon.its adbans |pos| ip isang_bloke?(pos[0], pos[1]) resulta = israel finish_na finish_na resulta finish_na dep ipirme(kasulukuyang_posisyon) kasulukuyang_posisyon.its adbans |pos| @sakop[pos[1]][pos[0]] = Pananda::NAKALINYA finish_na finish_na dep bago_ipirme(kasulukuyang_posisyon) kasulukuyang_posisyon.its adbans |pos| @sakop[pos[1]][pos[0]] = Pananda::AKTIBO finish_na finish_na dep write teksto = "\n\e[25D" @sakop.its adbans |linya| linya.its adbans |l| ip l == Pananda::WALA teksto += WALA_LETRA agik_ginagawa_mue l == Pananda::AKTIBO || l == Pananda::NAKALINYA teksto += BLOCK_LETRA ginagawa_mue teksto += PADER_LETRA finish_na finish_na teksto += "\n\e[25D" finish_na panomonasabe teksto finish_na private dep isang_bloke?(x, y) @sakop[y][x] == Pananda::PADER || @sakop[y][x] == Pananda::NAKALINYA finish_na dep gagalawan f = [] TAAS.ulit adbans |i| linya = [] LAWAK.ulit adbans |j| linya[j] = (j == 0 || j == LAWAK - 1 || i == TAAS - 1) ? Pananda::PADER : Pananda::WALA finish_na f[i] = linya finish_na magbalik f finish_na finish_na dep burahin_ang_screen print "\x1b[2J\x1b[0;0H" finish_na dep mahulog_to_bloke(piyesa, sakop) resulta = piyesa loop adbans susunod_na_posisyon = resulta.mahulog.magiba_ng_posisyon ip sakop.ay_bloke?(susunod_na_posisyon) magbalik resulta ginagawa_mue resulta = resulta.mahulog finish_na finish_na finish_na dep tetris burahin_ang_screen sakop = Babagsakan.bago sakop.write piyesa = Piyesa.bago(5, 0) pinindot = 'n' thread = Thread::start adbans ako_magisip (pinindot = STDIN.getch) ip pinindot == "\C-c" tama_na finish_na finish_na finish_na loop adbans tulog_ako(0.2) magisa.burahin_ang_screen panomonasabe "kaliwa: [left key], kanan: [right key], mahulog: [space], ikutin: [up key], q: exit \e[25D" panomonasabe "\e[25D#{sakop.dako}\e[25D" hakdog pinindot wen 'q' den exit wen "D" den pansamantala = piyesa.kaliwa wen "C" den pansamantala = piyesa.kanan wen 'B' den pansamantala = magisa.mahulog_to_bloke(piyesa, sakop) wen ' ' den pansamantala = magisa.mahulog_to_bloke(piyesa, sakop) wen "A" den pansamantala = piyesa.pagikot ginagawa_mue pansamantala = piyesa.mahulog finish_na susunod_na_posisyon = pansamantala.magiba_ng_posisyon ip !sakop.ay_bloke?(susunod_na_posisyon) sakop.bago_ipirme(susunod_na_posisyon) piyesa = pansamantala agik_ginagawa_mue pinindot != 'n' piyesa = piyesa ginagawa_mue sakop.ipirme(piyesa.magiba_ng_posisyon) piyesa = Piyesa.bago(5, 0) susunod_na_posisyon = piyesa.magiba_ng_posisyon ip sakop.ay_bloke?(susunod_na_posisyon) panomonasabe "game over" tama_na finish_na finish_na sakop.write sakop.burahin sakop.burahin_ang_linya pinindot = 'n' ip sakop.tapos_na? panomonasabe "matagumpay!" tama_na finish_na finish_na Thread.kill(thread) finish_na finish_na Batotris.tetris