require"io/console" D=[[0,-1],[0,1],[1,0],[-1,0],!1] r=R=["\e[0m"]+"#,'h_(e(#kek#df/)de/`(f)f.#j".scan(/../).map{|x|"\e[#{x.ord-5};#{x[1].ord}m"}+"## []()@@OO%%XX++".scan(/../) S="aqqqyydraqqyfsaqqydrraqyfssaqyerrraygsssaydrrrayfsssaycpyybqyyerydryfsygsyetyguyjvykpyhvyipyhwyixyltymuycryycsyya".split(/y/).map{|x|x=="" ? r : r=x.bytes.map{|y|R[y-97]}*""} p,q=IO.console.winsize if p<12||q<39 print "console too small\n" exit end W= ~-q/2 H=p-2 c=1 o=h=[] b=g=2 a=8 f=e=!1 p=ARGV[0].to_f M=p>=0.1 ? 1/p : 0.2 ii=[s=m=n=l=cc=j=k=0]*8 H.times{|w|o+=[[5]+[w>0&&w(x,y){ f=z%6/3+7 [*-1..1].product([*-1..1]).all?{|p,q|i=o[y+q][x+p];i==f||i==6} } [*1..W-2].product([*1..H-2]).shuffle.map{|x,y| if (y-q).abs>1&&rand<0.1&&ef.call(x,y) o[y][x]=f z+=1 end } rf=->{ w=" #{s}" v=" "*(W*2-6-w.size) if n>0 v=" %-#{W*2-8-w.size}s"%"#{n} chain" i=[v.size,n*2].min v=R[n>9 ? (v.upcase!;14) : 13]+v[0,i]+"\e[0m"+v[i,v.size] end print "\e[#{H+1}A\r"+S[m*2+a-7]+v+"\e[1m#{w}\e[0m\n\r"+o.map{|x|x.map{|y|S[y*2+c]}*""}*"\e[0m\n\r"+"\n" } it=Thread.new{ while r v="\e[".index(w=STDIN.getch) ? !1 : ("AwBsCdDa".index(w)||8)/2 if v ii[w=-~j%8]=v j=w end end } STDIN.echo=!1 print "\e[?25l\n"*H rf.call tt=Time::now while r if m>2 print "\e[#{H+1}A\r#{S[a-1+cc]}\e[#{H+1}B" cc^=2 end if k!=j d=D[w=ii[k=-~k%8]] d=d ? o[q+d[1]][p+d[0]] : (c^=1) if d>5&&d<9 b=w tt=Time.at(0) end rf.call end t=Time::now if t-tt0 if a==d m+=1 if m==3 n+=1 l=[l,n].max s+=2**[n-1,8].min*100 end else a=d m=1 n=0 end else a=d m=1 end g+=2 o[q][p]=9 u=1 3.times{|w|[*1..W-2].product([*1..H-2]).shuffle.map{|x,y| if [u,o[y][x]==6,(x-p).abs>3||(y-q).abs>3,ef.call(x,y)].take(4-w).all? e||=w>0&&(o[H-1][W-1]=f+7) o[y][x]=f u=rand<0.1 z+=e ? 0 : 1 end }} rf.call else o[q][p]=13 rf.call print "\e[#{C+1}A\r\e[#{W-8}C\e[0m GAME OVER ","\n\r"*C r=!1 end else o[q][p]=9 t+=[[p,q]] if h.size>g x,y=h.shift o[y][x]=6 t+=[[x,y]] if m==3 m=0 rf.call end end print "\e[#{H}A"+t.map{|x,y|"\e[#{y}B\r\e[#{x*2}C#{S[o[y][x]*2+c]}\e[#{y}A"}*""+"\e[#{H}B" end end end it.join rf.call a=H-2 a*=W-2 g="Dot eater" if l>0 i=a/2 4.times{|w|if h.size>a*(w*0.3-0.1)||s>i*10+i/3*100*2**(w*3-2) g="CBAS"[w] end } end print "\e[0m\e[?25h\nArea: \e[1m#{h.size*100/a}%\e[0m\nScore: \e[1m#{s}\e[0m\nMax: \e[1m#{l} chain\e[0m\nGrade: \e[1m#{g}\e[0m\n" STDIN.echo=true