#!/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 < h - 1 ? 6 : 5] * (w - 2) + [5]] } b[q = h / 2][p = w / 4] = 9 b[q][w - p] = 8 t = 4 ef = ->(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 - t0 < td sleep 0.02 next end t0 = t1 d += u = [[p, q]] u += [d[d.size / 2], d[d.size / 4]] 3.times{|i| b[u[i][1]][u[i][0]] = 10 + i} x = I[a] p += x[0] q += x[1] i = b[q][p] if i != 6 if i == c + 7 s += 10 o = o % 3 > 0 ? 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