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 < H - 1 ? 6 : 5] * (W - 2) + [5]] } o[q = H / 2][p = W / 4] = 9 o[q][W - p] = 8 z = 4 [*1..(W - 2)].product([*1..(H - 2)]).shuffle.map{|x, y| if (y - q).abs > 1 && rand < 0.1 && (f = z % 6 / 3 + 7) && [*-1..1].product([*-1..1]).all?{|p, q| i = o[y + q][x + p]; i == f || i == 6 } o[y][x] = f z += 1 end } render = -> { 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 render.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 render.call end t = Time::now if t - tt < M sleep 0.02 else tt = t h += t = [[p, q]] o[q][p] = 10 t += [i = h[h.size / 2]] o[i[1]][i[0]] = 11 t += [i = h[h.size / 4]] o[i[1]][i[0]] = 12 d = D[b] d = o[q += d[1]][p += d[0]] if d != 6 if d == c + 7 s += 10 if m % 3 > 0 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, (f = z % 6 / 3 + 7) && [*-1..1].product([*-1..1]).all?{|p, q| i = o[y + q][x + p]; i == f || i == 6 }].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 } } render.call else o[q][p] = 13 render.call print "\e[#{H / 2 + 1}A\r\e[#{W - 8}C\e[0m GAME OVER ", "\n\r" * (H / 2) 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 render.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 render.call a = (H - 2) * (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