#!/usr/bin/ruby require"io/console" I=_=[[0,-1],[0,1],[1,0],[-1,0],!1] K="\e[" A=[K+"0m",K+"1m"]+"#,'h_(e(#kek#df/)de/`(f)f.#j".scan(/../).map{|z|K+"#{z.ord-5};#{z[1].ord}m"}+"## []()@@OO%%XX++".scan(/../) R="arrrzzesarrzgtarrzessarzgttarzfsssazhtttazesssazgtttazdqzzcrzzfszeszgtzhtzfuzhvzkwzlqziwzjqzixzjyzmuznvzdszzdtzza".split(/z/).map{|z|z=="" ? _ : _=z.bytes.map{|a|A[a-97]}*""} U,G=A h,w=IO.console.winsize if h<12||w<40 print "console too small\n" exit end w= ~-w/2 h-=2 r=c=1 a=v=2 b=d=[] e=8 l=[s=o=n=m=tf=j=k=g=0]*8 f=qp=!1 t=ARGV[0].to_f td=t>=0.1 ? 1/t : 0.2 z=[*1..(w-2)].product([*1..(h-2)]).shuffle h.times{|i|b+=[[5]+[i>0&&i(x,y){f=t%6/3+7 i=*-1..1 i.product(i).all?{|p,q|i=b[y+q][x+p] i==f||i==6}} z.map{|x, y|if (y-q).abs>1&&rand<0.1&&ef.call(x,y) b[y][x]=f t+=1 end } rf=->{x=" #{s}" y=" "*(w*2-6-x.size) if n>0 y=" %-#{w*2-8-x.size}s"%"#{n} chain" i=[y.size,n*2].min y=A[n>9 ? (y.upcase!;15) : 14]+y[0,i]+K+"0m"+y[i,y.size] end print K+"#{h+1}A\r"+R[o*2+e-7]+y+G+x+U+"\n\r"+b.map{|p|p.map{|q|R[q*2+c]}*""}*"#{U}\n\r"+?\n } ti=Thread.new{while r id=K.index(ik=STDIN.getch) ? !1 : ("AwBsCdDa".index(ik)||8)/2 if id l[iw=-~j%8]=id j=iw end end } STDIN.echo=!1 print "\e[?25l\n"*h rf.call t0=Time::now while r if o>2 print K+"#{h+1}A\r#{R[e-1+tf]}\e[#{h+1}B" tf^=2 end if k!=j i=I[x=l[k=-~k%8]] y=i ? b[q+i[1]][p+i[0]] : (c^=1) if y>5&&y<9 a=x t0=Time.at(0) end rf.call end t1=Time::now if t1-t00 ? e==i ? o==2 ? (n+=1;m=[m,n].max;s+=2**[n-1,8].min*100;3) : o+1 : (e=i;n=0;1) : (e=i;1) v+=2 b[q][p]=9 pq=!1 3.times{|i|z.size.times{g=-~g%z.size x,y=z[g] if [!pq,b[y][x]==6,(x-p).abs>3||(y-q).abs>3,ef.call(x,y)].take(4-i).all? qp||=i>0&&(b[h-1][w-1]=f+7) b[y][x]=f pq=rand>0.1 t+=qp ? 0 : 1 end }} rf.call next end b[q][p]=13 rf.call print K+"#{h/2+1}A\r\e[#{w-8}C#{U} GAME OVER ","\n\r"*(h/2) r=!1 next end b[q][p]=9 u+=[[p,q]] if d.size>v x,y=d.shift b[y][x]=6 u+=[[x,y]] if o == 3 o=0 rf.call end end print K+"#{h}A"+u.map{|x,y|"\e[#{y}B\r\e[#{x*2}C#{R[b[y][x]*2+c]}\e[#{y}A"}*""+K+"#{h}B" end ti.join rf.call a=(h-2)*(w-2) g="Dot eater" if m>0 i=a/2 4.times{|f|g=d.size>a*(f*0.3-0.1)||s>i*10+i/3*100*2**(f*3-2) ? "CBAS"[f] : g} end print "#{U}\e[?25h\nArea: #{G}#{d.size*100/a}%#{U}\nScore: #{G}#{s}#{U}\nMax: #{G}#{m} chain#{U}\nGrade: #{G}#{g}#{U}\n" STDIN.echo=true