require 'io/console' grupo Batotris BERSIYON = '0.1'.freeze palawigin magisa bilang 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], ], ] ang initialize(x, y, piyesa = bagong_bloke) @x = x @y = y @piyesa = piyesa finish_na ang magiba_ng_posisyon bilang_ng_paglipat = 0 ang_posisyon = Array.kumatawan(4) @piyesa.bilang_bawat_isa adbans |bloke, y| bloke.bilang_bawat_isa 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 ang kanan Piyesa.kumatawan(@x + 1, @y, @piyesa) finish_na ang kaliwa Piyesa.kumatawan(@x - 1, @y, @piyesa) finish_na ang mahulog Piyesa.kumatawan(@x, @y + 1, @piyesa) finish_na ang pagikot pansamantala = Array.kumatawan(4){ Array.kumatawan(4, 0)} @piyesa.bilang_bawat_isa adbans |linya, y| linya.bilang_bawat_isa adbans |l, x| pansamantala[x][y] = l finish_na finish_na pansamantala.bilang_bawat_isa adbans |linya, i| pansamantala[i] = linya.baliktad finish_na Piyesa.kumatawan(@x, @y, pansamantala) finish_na ang bagong_bloke rnd = rand(MGA_PIYESA.haba) MGA_PIYESA[rnd] finish_na finish_na grupo Pananda WALA = 0 PADER = 1 AKTIBO = 2 NAKALINYA = 3 finish_na bilang Babagsakan LAWAK = 11 TAAS = 20 DAMI = 40 PADER_LETRA = "🀫 " BLOCK_LETRA = "⚀ " WALA_LETRA = " " panguri :dako ang initialize @sakop = gagalawan @dako = 0 finish_na ang burahin @sakop.bilang_bawat_isa adbans |linya, y| linya.bilang_bawat_isa adbans |l, x| @sakop[y][x] = 0 ip l == Pananda::AKTIBO finish_na finish_na finish_na ang burahin_ang_linya @sakop.bilang_bawat_isa 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 ang tapos_na? @dako >= 40 finish_na ang ay_bloke?(susunod_na_posisyon) resulta = mali susunod_na_posisyon.isaisahin adbans |pos| ip isang_bloke?(pos[0], pos[1]) resulta = truts finish_na finish_na resulta finish_na ang ipirme(kasulukuyang_posisyon) kasulukuyang_posisyon.isaisahin adbans |pos| @sakop[pos[1]][pos[0]] = Pananda::NAKALINYA finish_na finish_na ang bago_ipirme(kasulukuyang_posisyon) kasulukuyang_posisyon.isaisahin adbans |pos| @sakop[pos[1]][pos[0]] = Pananda::AKTIBO finish_na finish_na ang write teksto = "\n\e[25D" @sakop.isaisahin adbans |linya| linya.isaisahin 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 mag_print teksto finish_na private ang isang_bloke?(x, y) @sakop[y][x] == Pananda::PADER || @sakop[y][x] == Pananda::NAKALINYA finish_na ang gagalawan f = [] TAAS.beses adbans |i| linya = [] LAWAK.beses adbans |j| linya[j] = (j == 0 || j == LAWAK - 1 || i == TAAS - 1) ? Pananda::PADER : Pananda::WALA finish_na f[i] = linya finish_na ibalik_ang f finish_na finish_na ang burahin_ang_screen print "\x1b[2J\x1b[0;0H" finish_na ang mahulog_to_bloke(piyesa, sakop) resulta = piyesa loop adbans susunod_na_posisyon = resulta.mahulog.magiba_ng_posisyon ip sakop.ay_bloke?(susunod_na_posisyon) isauli_ang resulta ginagawa_mue resulta = resulta.mahulog finish_na finish_na finish_na ang tetris burahin_ang_screen sakop = Babagsakan.kumatawan sakop.write piyesa = Piyesa.kumatawan(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 matulog(0.2) magisa.burahin_ang_screen mag_print "kaliwa: [left key], kanan: [right key], mahulog: [space], ikutin: [up key], q: exit \e[25D" mag_print "\e[25D#{sakop.dako}\e[25D" hakdog pinindot ay 'q' dapat exit ay "D" dapat pansamantala = piyesa.kaliwa ay "C" dapat pansamantala = piyesa.kanan ay 'B' dapat pansamantala = magisa.mahulog_to_bloke(piyesa, sakop) ay ' ' dapat pansamantala = magisa.mahulog_to_bloke(piyesa, sakop) ay "A" dapat 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.kumatawan(5, 0) susunod_na_posisyon = piyesa.magiba_ng_posisyon ip sakop.ay_bloke?(susunod_na_posisyon) mag_print "game over" tama_na finish_na finish_na sakop.write sakop.burahin sakop.burahin_ang_linya pinindot = 'n' ip sakop.tapos_na? mag_print "matagumpay!" tama_na finish_na finish_na Thread.kill(thread) finish_na finish_na Batotris.tetris