#!/usr/bin/env ruby # -*- coding:utf-8 -*- require'io/console' require'csv' require'timeout' field=CSV.read("tetris_fie.csv") #縦20、横10 map = { "0" => "\e[30;47m .\e[m", "1" => "\e[46;37m[]\e[m", #iミノ =>シアン色 "2" => "\e[43;37m[]\e[m", #oミノ =>黄色 "3" => "\e[42;37m[]\e[m", #sミノ =>緑色 "4" => "\e[41;37m[]\e[m", #zミノ =>赤色 "5" => "\e[44;37m[]\e[m", #jミノ =>青色 "6" => "\e[48;5;166m\e[37m[]\e[m", #lミノ =>オレンジ色 "7" => "\e[45;37m[]\e[m", #tミノ =>マゼンタ色 false => "\e[37;41m .\e[m" } def byouga(field,map,hold) print("\e[2J\e[1;1H\e[47m") 22.times{puts("\e[47m ")} print("\e[21A") field.each do |row| print("\e[30;47m<!\e[m") row.each do |column| print(map[column]) end puts("\e[30;47m!>\e[m") end print("\e[30;47m<!====================!>\e[m") print("\e[20A\e[47m \e[m") print("\e[30;47m<!==hold==!>\e[m") print("\e[12D\e[1B") if hold=="1" print("\e[30;47m<!\e[46;37m[][][][]\e[30;47m!>\e[m\e[12D\e[1B") print("\e[30;47m<! . . . .!>\e[m\e[12D\e[1B") elsif hold=="2" print("\e[30;47m<! .\e[43;37m[][]\e[30;47m .!>\e[m\e[12D\e[1B") print("\e[30;47m<! .\e[43;37m[][]\e[30;47m .!>\e[m\e[12D\e[1B") elsif hold=="3" print("\e[30;47m<! .\e[42;37m[][]\e[30;47m .!>\e[m\e[12D\e[1B") print("\e[30;47m<!\e[42;37m[][]\e[30;47m . .!>\e[m\e[12D\e[1B") elsif hold=="4" print("\e[30;47m<!\e[41;37m[][]\e[30;47m . .!>\e[m\e[12D\e[1B") print("\e[30;47m<! .\e[41;37m[][]\e[30;47m .!>\e[m\e[12D\e[1B") elsif hold=="5" print("\e[30;47m<!\e[44;37m[]\e[30;47m . . .!>\e[m\e[12D\e[1B") print("\e[30;47m<!\e[44;37m[][][]\e[30;47m .!>\e[m\e[12D\e[1B") elsif hold=="6" print("\e[30;47m<! . .\e[48;5;166m\e[37m[]\e[30;47m .!>\e[m\e[12D\e[1B") print("\e[30;47m<!\e[48;5;166m\e[37m[][][]\e[30;47m .!>\e[m\e[12D\e[1B") elsif hold=="7" print("\e[30;47m<!\e[45;37m[][][]\e[30;47m .!>\e[m\e[12D\e[1B") print("\e[30;47m<! .\e[45;37m[]\e[30;47m . .!>\e[m\e[12D\e[1B") elsif hold=="" print("\e[30;47m<! . . . .!>\e[m\e[12D\e[1B") print("\e[30;47m<! . . . .!>\e[m\e[12D\e[1B") end print("\e[30;47m<!========!>\e[m") end def fall(field,movmino,y1,x1,y2,x2,y3,x3,y4,x4) xy1=y1*10+x1 xy2=y2*10+x2 xy3=y3*10+x3 xy4=y4*10+x4 xys=[xy1,xy2,xy3,xy4] if field[y1+1]==nil||field[y2+1]==nil||field[y3+1]==nil||field[y4+1]==nil return true elsif (field[y1+1][x1]=="0"||xys.include?(xy1+10))&&(field[y2+1][x2]=="0"||xys.include?(xy2+10))&&(field[y3+1][x3]=="0"||xys.include?(xy3+10))&&(field[y4+1][x4]=="0"||xys.include?(xy4+10)) return false else return true end end hold="" hold_b=0 while true byouga(field,map,hold) mino=["0","1","2","3","4","5","6"] mino_i=1 mino_s=1 mino_z=1 #2周期は1と-1の2つで区別する(-1をかける) mino_j=0 mino_l=0 mino_t=0 #4周期は4で割ったあまりで区別する(1を足す) while mino.length>0 if hold_b==0||hold=="" srand() mino_=mino[rand(mino.length)] elsif hold_b==1&&hold!="" mino_=hold hold_b=0 end if mino_=="0" #iミノ movmino="1" y1=0 #[][][][] x1=3 #field[0][3]="1" y2=0 x2=4 #field[0][4]="1" y3=0 x3=5 #field[0][5]="1" y4=0 x4=6 #field[0][6]="1" elsif mino_=="1" #oミノ movmino="2" y1=0 #[][] x1=4 #field[0][4]="2" [][] y2=0 x2=5 #field[0][5]="2" y3=1 x3=4 #field[1][4]="2" y4=1 x4=5 #field[1][5]="2" elsif mino_=="2" #sミノ movmino="3" y1=0 # [][] x1=5 #field[0][5]="3" [][] y2=0 x2=6 #field[0][6]="3" y3=1 x3=4 #field[1][4]="3" y4=1 x4=5 #field[1][5]="3" elsif mino_=="3" #zミノ movmino="4" y1=0 #[][] x1=4 #field[0][4]="4" [][] y2=0 x2=5 #field[0][5]="4" y3=1 x3=5 #field[1][5]="4" y4=1 x4=6 #field[1][6]="4" elsif mino_=="4" #jミノ movmino="5" y1=0 #[] x1=4 #field[0][4]="5" [][][] y2=1 x2=4 #field[1][4]="5" y3=1 x3=5 #field[1][5]="5" y4=1 x4=6 #field[1][6]="5" elsif mino_=="5" #lミノ movmino="6" y1=0 # [] x1=6 #field[0][6]="6" [][][] y2=1 x2=4 #field[1][4]="6" y3=1 x3=5 #field[1][5]="6" y4=1 x4=6 #field[1][6]="6" elsif mino_=="6" #tミノ movmino="7" y1=0 #[][][] x1=4 #field[0][4]="7" [] y2=0 x2=5 #field[0][5]="7" y3=0 x3=6 #field[0][6]="7" y4=1 x4=5 #field[1][5]="7" end field[y1][x1]=movmino field[y2][x2]=movmino field[y3][x3]=movmino field[y4][x4]=movmino while true byouga(field,map,hold) begin print Timeout.timeout(1){ key=STDIN.getch if key=="\e"&&STDIN.getch=="[" key=STDIN.getch if key=="A" #↑(ハードドロップ) while true if fall(field,movmino,y1,x1,y2,x2,y3,x3,y4,x4) break else field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=1 y2+=1 y3+=1 y4+=1 end end field[y1][x1]=movmino field[y2][x2]=movmino field[y3][x3]=movmino field[y4][x4]=movmino mino.delete_at(mino_.to_i) break elsif key=="D" #←(左移動) xy1=y1*10+x1 xy2=y2*10+x2 xy3=y3*10+x3 xy4=y4*10+x4 xys=[xy1,xy2,xy3,xy4] if x1<1||x2<1||x3<1||x4<1 elsif (field[y1][x1-1]=="0"||xys.include?(xy1-1))&&(field[y2][x2-1]=="0"||xys.include?(xy2-1))&&(field[y3][x3-1]=="0"||xys.include?(xy3-1))&&(field[y4][x4-1]=="0"||xys.include?(xy4-1))&&x1>=0&&x2>=0&&x3>=0&&x4>=0 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1-=1 x2-=1 x3-=1 x4-=1 end elsif key=="B" #↓(下移動) xy1=y1*10+x1 xy2=y2*10+x2 xy3=y3*10+x3 xy4=y4*10+x4 xys=[xy1,xy2,xy3,xy4] if field[y1+1]==nil||field[y2+1]==nil||field[y3+1]==nil||field[y4+1]==nil elsif (field[y1+1][x1]=="0"||xys.include?(xy1+10))&&(field[y2+1][x2]=="0"||xys.include?(xy2+10))&&(field[y3+1][x3]=="0"||xys.include?(xy3+10))&&(field[y4+1][x4]=="0"||xys.include?(xy4+10)) field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=1 y2+=1 y3+=1 y4+=1 end elsif key=="C" #→(右移動) xy1=y1*10+x1 xy2=y2*10+x2 xy3=y3*10+x3 xy4=y4*10+x4 xys=[xy1,xy2,xy3,xy4] if x1==9||x2==9||x3==9||x4==9 elsif (field[y1][x1+1]=="0"||xys.include?(xy1+1))&&(field[y2][x2+1]=="0"||xys.include?(xy2+1))&&(field[y3][x3+1]=="0"||xys.include?(xy3+1))&&(field[y4][x4+1]=="0"||xys.include?(xy4+1)) field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1+=1 x2+=1 x3+=1 x4+=1 end end end if key=="w" #hold if hold_b==0 hold=movmino field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" hold_b=1 break end elsif key=="a" #左回転 if mino_=="0" #iミノ y3,x3を中心に回転するはず if mino_i==1 if field[y3+3]==nil elsif field[y3+1][x3]=="0"&&field[y3+2][x3]=="0"&&field[y3+3][x3]&&y1<2 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1+=2 # 1 1 1 1 1 y2+=1 #[][] [] [][] 1[] x2+=1 #[][] [] => [][] 1[] y3+=2 #[][] [] [][] 1[] y4+=3 x4-=1 mino_i*=-1 elsif field[y1-3]==nil elsif field[y1-3][x1+2]=="0"&&field[y2-2][x2+1]=="0"&&field[y3-1][x3]=="0"&&y4==19 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1-=3 # [] x1+=2 # [] y2-=2 # [] x2+=1 # [][][][] => [] y3-=1 #<!========!> <!========!> x4-=1 mino_i*=-1 elsif field[y3-2][x3]=="0"&&field[y3-1][x3]=="0"&&field[y3+1][x3]=="0" field[y1][x1]="0" field[y2][x2]="0" field[y4][x4]="0" y1-=2 # [] x1+=2 # [] y2-=1 #[][][][] => [] x2+=1 # [] y4+=1 x4-=1 mino_i*=-1 end elsif mino_i==-1 if field[y1][x1-1]=="0"&&field[y1][x1-2]=="0"&&field[y1][x1+3]&&y1<2 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1-=2 # 1 1 1 1 1 y2-=1 #[][] 1[] [][] [] x2-=1 #[][] 1[] => [][] [] y3-=2 #[][] 1[] [][] [] y4-=3 x4+=1 mino_i*=-1 elsif field[y1+3]==nil elsif field[y1+3][x1-2]=="0"&&field[y2+2][x2-1]=="0"&&field[y3+1][x3]=="0"&&y4==19 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=3 # [] x1-=2 # [] y2+=2 # [] x2-=1 # [] => [][][][] y3+=1 #<!========!> <!========!> x4+=1 mino_i*=-1 elsif field[y1+2][x1-2]=="0"&&field[y2+1][x2-1]=="0"&&field[y4-1][x4+1]=="0"&&x1>1&&x1<9 field[y1][x1]="0" field[y2][x2]="0" field[y4][x4]="0" y1+=2 # [] x1-=2 # [] y2+=1 # [] => [][][][] x2-=1 # [] y4-=1 x4+=1 mino_i*=-1 end end elsif mino_=="1" #oミノ #何もしない! elsif mino_=="2" #sミノ if mino_s==1 if field[y1-1][x1]=="0"&&field[y2+1][x2]=="0" field[y3][x3]=="0" field[y4][x4]=="0" y1+=1 # [] 1 x2-=1 # [][] [][] 2 3 1 2 y3-=1 #[][] => [] 4 3 4 x3+=2 x4-=1 mino_s*=-1 end elsif mino_s==-1 end mino_s*=-1 elsif mino_=="3" #zミノ if mino_z==1 elsif mino_z==-1 end mino_z*=-1 elsif mino_=="4" #jミノ if mino_j%4==0 elsif mino_j%4==1 elsif mino_j%4==2 elsif mino_j%4==3 end mino_j+=-1 elsif mino_=="5" #lミノ if mino_l%4==0 elsif mino_l%4==1 elsif mino_l%4==2 elsif mino_l%4==3 end mino_l+=1 elsif mino_=="6" #tミノ if mino_t%4==0 elsif mino_t%4==1 elsif mino_t%4==2 elsif mino_t%4==3 end mino_j+=1 end elsif key=="s" #下移動 xy1=y1*10+x1 xy2=y2*10+x2 xy3=y3*10+x3 xy4=y4*10+x4 xys=[xy1,xy2,xy3,xy4] if field[y1+1]==nil||field[y2+1]==nil||field[y3+1]==nil||field[y4+1]==nil elsif (field[y1+1][x1]=="0"||xys.include?(xy1+10))&&(field[y2+1][x2]=="0"||xys.include?(xy2+10))&&(field[y3+1][x3]=="0"||xys.include?(xy3+10))&&(field[y4+1][x4]=="0"||xys.include?(xy4+10)) field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=1 y2+=1 y3+=1 y4+=1 field[y1][x1]=movmino field[y2][x2]=movmino field[y3][x3]=movmino field[y4][x4]=movmino end elsif key=="d" #右回転 if mino_=="0" #iミノ y3,x3を中心に回転するはずだった if mino_i==1 if field[y3+3]==nil elsif field[y3+1][x3]=="0"&&field[y3+2][x3]=="0"&&field[y3+3][x3]&&y1<2 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1+=2 # 1 1 1 1 1 y2+=1 #[][] [] [][] 1[] x2+=1 #[][] [] => [][] 1[] y3+=2 #[][] [] [][] 1[] y4+=3 x4-=1 mino_i*=-1 elsif field[y1-3]==nil elsif field[y1-3][x1+2]=="0"&&field[y2-2][x2+1]=="0"&&field[y3-1][x3]=="0"&&y4==19 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1-=3 # [] x1+=2 # [] y2-=2 # [] x2+=1 # [][][][] => [] y3-=1 #<!========!> <!========!> x4-=1 mino_i*=-1 elsif field[y3-2][x3]=="0"&&field[y3-1][x3]=="0"&&field[y3+1][x3]=="0" field[y1][x1]="0" field[y2][x2]="0" field[y4][x4]="0" y1-=2 # [] x1+=2 # [] y2-=1 #[][][][] => [] x2+=1 # [] y4+=1 x4-=1 mino_i*=-1 print("aaa") end elsif mino_i==-1 if field[y1][x1-1]=="0"&&field[y1][x1-2]=="0"&&field[y1][x1+3]&&y1<2 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" x1-=2 # 1 1 1 1 1 y2-=1 #[][] 1[] [][] [] x2-=1 #[][] 1[] => [][] [] y3-=2 #[][] 1[] [][] [] y4-=3 x4+=1 mino_i*=-1 elsif field[y1+3]==nil elsif field[y1+3][x1-2]=="0"&&field[y2+2][x2-1]=="0"&&field[y3+1][x3]=="0"&&y4==19 field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=3 # [] x1-=2 # [] y2+=2 # [] x2-=1 # [] => [][][][] y3+=1 #<!========!> <!========!> x4+=1 mino_i*=-1 elsif field[y1+2][x1-2]=="0"&&field[y2+1][x2-1]=="0"&&field[y4-1][x4+1]=="0"&&x1>1&&x1<8 field[y1][x1]="0" field[y2][x2]="0" field[y4][x4]="0" y1+=2 # [] x1-=2 # [] y2+=1 # [] => [][][][] x2-=1 # [] y4-=1 x4+=1 mino_i*=-1 end end elsif mino_=="1" #oミノ #何もしない!楽!やったね! elsif mino_=="2" #sミノ if mino_s==1 elsif mino_s==-1 end mino_s/=-1 elsif mino_=="3" #zミノ if mino_z==1 elsif mino_z==-1 end mino_z/=-1 elsif mino_=="4" #jミノ if mino_j%4==0 elsif mino_j%4==1 elsif mino_j%4==2 elsif mino_j%4==3 end mino_j-=1 elsif mino_=="5" #lミノ if mino_l%4==0 elsif mino_l%4==1 elsif mino_l%4==2 elsif mino_l%4==3 end mino_l-=1 elsif mino_=="6" #tミノ if mino_t%4==0 elsif mino_t%4==1 elsif mino_t%4==2 elsif mino_t%4==3 end mino_t-=1 end elsif key=="\C-c" print("\e[18B") p(movmino,hold,mino,y1,x1,y2,x2,y3,x3,y4,x4) p(field) p(mino_i) exit end field[y1][x1]=movmino field[y2][x2]=movmino field[y3][x3]=movmino field[y4][x4]=movmino } rescue Timeout::Error if fall(field,movmino,y1,x1,y2,x2,y3,x3,y4,x4) mino.delete(mino_.to_i) break #ここのbreakは次のミノに移る else field[y1][x1]="0" field[y2][x2]="0" field[y3][x3]="0" field[y4][x4]="0" y1+=1 y2+=1 y3+=1 y4+=1 field[y1][x1]=movmino field[y2][x2]=movmino field[y3][x3]=movmino field[y4][x4]=movmino end end end field.length.times do |i| field_a=field[i] if !(field_a.include?("0")) field[i]=["0","0","0","0","0","0","0","0","0","0"] byouga(field,map,hold) sleep(0.2) k=i while k>0 field[k]=field[k-1] k-=1 end field[0]=["0","0","0","0","0","0","0","0","0","0"] end end end end