【IchigoJam】????????
また note の記事を書いていない週末がやってきてしまった…あまり時間も残ってないし、面倒だから複雑なことは書きたくない…また雑な IchigoJam 用のプログラムを書いてごまかすか…アドベントカレンダーに載せるほどではない程度に雑なのを…
というわけで、何を書くべきかよくわからない気持ちをハテナの山で表現した。
※IchigoJamはjig.jpの登録商標です。
作ったもの
「?」がどんどん積もっていく。
画面いっぱいに積もると、落ちていき、また積もっていく。
プログラム
10 ' ????????
20 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
30 CLS:N=W:FOR I=0 TO N-1:[I]=I:[W+I]=H-1:NEXT
40 P=RND(N):X=[P]:Y=[W+P]
50 IF X=W-1 AND Y=H-1 POKE#900+Y*W+X,#3F ELSE LOCATE X,Y:?"?";
60 [W+P]=[W+P]-1:IF [W+P]<0 [P]=[N-1]:[W+P]=[W+N-1]:N=N-1
70 IF N>0 WAIT 1:GOTO 40
80 WAIT 60
90 FOR I=1 TO H:SCROLL DOWN:WAIT 2:NEXT
100 WAIT 60
110 GOTO 30
このプログラムは、CC0 1.0 でライセンスする。
OneFiveCrowd で実行 (高速、非公式) (推奨)
IchigoJam web で実行 (公式、低速)
解説
10 ' ????????
FILES 対応のタイトル。
20 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
画面のサイズを取得する。
30 CLS:N=W:FOR I=0 TO N-1:[I]=I:[W+I]=H-1:NEXT
画面をクリアし、各列で今どこまで「?」が積もっているか (次にどこに「?」を置くべきか) の情報を初期化する。
40 P=RND(N):X=[P]:Y=[W+P]
候補の列の中から、今回どこに「?」を積むかをランダムに選択する。
それに応じて、具体的にどこに「?」を置くかを決定する。
50 IF X=W-1 AND Y=H-1 POKE#900+Y*W+X,#3F ELSE LOCATE X,Y:?"?";
決定した位置に「?」を置く。
右下に置く際は、PRINT で置いてしまうと意図に反してスクロールしてしまうので、POKE で置く。
それ以外に置く際は、シリアル通信でも見られるよう、PRINT (の省略形) で置く。
60 [W+P]=[W+P]-1:IF [W+P]<0 [P]=[N-1]:[W+P]=[W+N-1]:N=N-1
「?」を置いた列について、次に「?」を置く位置を1行上げる。
その結果、次に「?」を置く位置が画面外になったら、候補列の末尾にある候補を今回積んだ列の情報の位置に上書きし、今回積んだ列を候補から外す。
70 IF N>0 WAIT 1:GOTO 40
まだ積める列が残っているならば、少し待機し、次の「?」を積みに向かう。
積める列が無くなった (画面全体が「?」で埋まった) ら、下の処理を行う。
80 WAIT 60
90 FOR I=1 TO H:SCROLL DOWN:WAIT 2:NEXT
100 WAIT 60
110 GOTO 30
少し間を置いたあと、スクロールにより「?」を下に落とす。
画面が空になったら、再び少し間を置き、最初に戻る。