【メモリの読み書きコピー】スネークゲーム風プログラム for IchigoJam
実行画面はYouTubeからご覧ください。
いちごを食べるたびに猫ちゃんが増殖していきます。
壁に当たるか、自分の体に当たるとゲームオーバーです。
プログラム自体は短いですが、メモリの読み書きコピーと配列を組み合わせているため難易度は高めの4.5です(5でもいいかも?)。
【プログラム】
10 CLS:CLV:K=28:X=#A4F:S=1
20 POKE#900,1:POKE#91F,1
30 COPY#920,#900,32*21
40 COPY#901,#900,31
50 COPY#BA1,#BA0,31
60 R=RND(32*22)+#900:IF PEEK(R) CONT ELSE POKER,255
70 POKEX,236
80 WAIT3
90 POKE[B],0:[B]=X:B=(B+1)%S
100 A=INKEY():IF A K=A
110 X=X-(K=28)+(K=29)-32*(K=30)+32*(K=31)
120 IF PEEK(X)=255 S=S+1:GOTO60
130 LC0,22:?"Score:";S-1;" ";
140 IF PEEK(X)=0 GOTO70
【コメントつきプログラム】
// Xは自キャラ(猫)の座標。VRAMのアドレス
10 CLS:CLV:K=28:X=#A4F:S=1
// 壁表示プログラム(ver1.4以上ならDRAWコマンドでも可)
20 POKE#900,1:POKE#91F,1
30 COPY#920,#900,32*21
40 COPY#901,#900,31
50 COPY#BA1,#BA0,31
// いちごの出現位置をランダムに決定。いちごの出現位置になにかあればやりなおし
60 R=RND(32*22)+#900:IF PEEK(R) CONT ELSE POKER,255
// 猫を表示
70 POKEX,236
80 WAIT3
//配列[B]に先頭猫の位置を代入。猫の数分配列を使い回す(配列節約のため)
90 POKE[B],0:[B]=X:B=(B+1)%S
// 一度押した方向へ進み続けるために変数Aを用意
100 A=INKEY():IF A K=A
// 猫の位置を押したキーによって決定
110 X=X-(K=28)+(K=29)-32*(K=30)+32*(K=31)
// いちごをとったらスコアが増える
120 IF PEEK(X)=255 S=S+1:GOTO60
130 LC0,22:?"Score:";S-1;" ";
// 当たり判定。当たったら次の行へ(終了)
140 IF PEEK(X)=0 GOTO70
【ポイント】
- VRAMに直接書き込めば、処理も早くなり、変数もひとつ(今回でいう変数X)で済むようになります。
- 90行目がこのプログラムの最重要ポイント。猫の先頭の座標Xを配列に保存し、文字コード0で残像を消す作業をしています。たとえば、猫が3匹(S=3)のとき配列は[0]〜[2]の3つを使い回すことになります。
理屈的には↑のように増えていっています。
なので、配列は102個あるので102匹まで猫を増やすことができるはず!
メモリの読み書きコピーを使った時短術と、配列の節約術のご紹介でした!
CC BY shoichi1031da / @shoichi1031da