Newer
Older
Ruby / tetris.rb
#!/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