#!/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
y3-=1 #[][] => [] 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]
field_b=[]
if !(field_a.include?("0"))
field[i]=["0","0","0","0","0","0","0","0","0","0"]
field_b << i
end
end
byouga(field,map,hold)
sleep(0.2)
i=19
while true
if !(field[i].include?("1")||field[i].include?("2")||field[i].include?("3")||field[i].include?("4")||field[i].include?("5")||field[i].include?("6")||field[i].include?("7"))
break
end
i-=1
end
end
end