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 <
EOS