a = [ 9, 9, 9, 9, 9, 9, 9, 9, 4, 9, 9, 9, 9, 9, 3, 9, 9, 9, 9, 9, 3, 0, 9, 9, 9, 4, 3, 4, 0, 0] x = [] # 盤面→元の番号 y = [] # 元の番号→落ちる状態 単位時間ごと z = [] # 元の番号→消える状態 単位時間ごと st = a.dup a.size.times do |i| x[i] = i y[i] = [false] z[i] = [false] end t = 0 while true c = a.dup # 消えるドロップ判定 5.times do |i| 6.times do |j| k = i*6 + j if i >= 2 if (a[k] >= 0) && (a[k] != 9) && (a[k] == a[k-6]) && (a[k] == a[k-12]) c[k] = -1 c[k-6] = -1 c[k-12] = -1 end end if j >= 2 if (a[k] >= 0) && (a[k] != 9) && (a[k] == a[k-1]) && (a[k] == a[k-2]) c[k] = -1 c[k-1] = -1 c[k-2] = -1 end end end end break if (a == c) t += 1 # 一気に消す (本家では繋がった単位で順に消える) 5.times do |i| 6.times do |j| k = i*6 + j y[k].push false if (x[k] >= 0) if c[k] != a[k] a[k] = c[k] z[x[k]].push true x[k] = -1 else z[x[k]].push false end end end end # 落とす b = true while b b = false 4.times do |i| 6.times do |j| k = i*6 + j if (a[k] >= 0) && (a[k+6] < 0) b = true break end end break if b end break unless b 4.times do |i| 6.times do |j| k = (4-i)*6 + j z[k].push false if (a[k-6] >= 0) && (a[k] < 0) a[k] = a[k-6] a[k-6] = -1 x[k] = x[k-6] x[k-6] = -1 y[x[k]].push true elsif (x[k] >= 0) y[x[k]].push false end end end 6.times do |j| k = j z[k].push false if (x[k] >= 0) y[x[k]].push false # 最上段に残っているものは動かない end end t += 1 end end t += 1 def puts_animate_line(a, t) i = a.index(true) if i puts sprintf("\t\t\t", t/3.0, (i-0.5)/t, (i+0.5)/t) end end def puts_animate_transform_line(a, t) i = a.index(true) if i values = "0.0" key_times = "0" y = 0 a.each.with_index do |x, i| if x if (!i.zero? && !a[i-1]) values += ";0,#{y}" key_times += sprintf(";%.3f", (i-0.5)/t) end y += 40 values += ";0,#{y}" key_times += sprintf(";%.3f", (i+0.5)/t) end end values += ";0,#{y}" key_times += ";1" puts sprintf("\t\t\t", t/3.0, values, key_times) end end puts < \t \t \t\t EOS 5.times do |i| 6.times do |j| k = i*6 + j next if st[k] < 0 puts "\t\t" puts "\t\t\t" puts_animate_transform_line(y[k], t) puts_animate_line(z[k], t) puts "\t\t" end end puts < EOS