●
きのうの記事に著者さんがくれたコメントを参考に、練習としてもういっこプログラムかいてみた。
数をかく練習なら、ひたすら数をかけばいいじゃない。
こいつの機能は、上下キーで数字が上下;左右キーで移動(赤いのが編集中の数字);スペースキーで編集中の数字が0になる、というもの。何かの役に立つの? 知るか!
かき始めたときプログラムの目標は「座標と数字を指定してその数字を出す」ってだけだったんだけれど、いつの間にか外部入力まで受け付けるようになってた。とくに頭をひねった上下左右まわりを抜き出すとこう。
while 1
#上
if (pre_up = 0) * (now_up = 1)
letter(y, x, 0)
number -> number + 1
if number >= 10
number -> 0
number_save(y, x, number)
letter(y, x, 996666)
number_save(y, x, number)
pre_up -> now_up
#右
if (pre_right = 0) * (now_right = 1)
letter(y, x, 669966)
x -> x + 1
if (x >= 20) * (y = 15)
x -> 19
if (x >= 20) * (y <= 14)
y -> y + 1 x -> 0
letter(y, x, 996666)
number -> memory[10000 + (y * 20) + x]
number_save(y, x, number)
pre_right -> now_right
def number_save(y, x, number)
memory[10000 + (y * 20) + x] -> number
def letter(y, x, color)
a -> memory[10000 + (y * 20) + x] #A
memory[0] -> 60000 + (100 * (y * 6)) + (x * 5)
z -> - memory[0] + 1
if a = 0
letter_2(1, 2, 100, 103, 200, 203, 300, 303, 401, 402, z, color)
if a = 1
letter_2(2, 101, 102, 202, 302, 401, 402, 403, z, z, z, color)
{9まで}
def letter_2(a, b, c, d, e, f, g, h, i, j, k, l)
memory[memory[0] + a] -> l
memory[memory[0] + b] -> l
{kまで}
memory[0] -> 0
memory[1] -> 0
数字を変更したら memory[10000]~[10319] に記録(number_save)し、表示するときには「現在の座標の数値を memory[10000]~[10319] から引っ張ってくる(A)」→「数値ごとのドットパターンを letter_2 へ送る」という作り。苦労したのは記録のタイミングと、部分プログラム letter にある z に関すること。数字によって使うドット数が違うので、余った letter_2 内の k などが邪魔になる。そんならその変数はとりあえず memory[1] に放り込んじまえ、という発想。
プログラムを短くする作業というのは基本的に 2a + 2b を 2(a + b) にするとか、あるいは 1024a + b を c = 1024, ac + b にするものだと感じる。そういう作業って片付けに似てて結構好き。