Hana道場【師範】のブログ

IchigoJamの徹底解説ブログ

【メモリの読み書きコピー】スネークゲーム風プログラム for IchigoJam

f:id:hanadojo_sihan:20200202173332j:plain

実行画面は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

f:id:hanadojo_sihan:20200202175546j:plain

30 COPY#920,#900,32*21

f:id:hanadojo_sihan:20200202175542j:plain

40 COPY#901,#900,31

f:id:hanadojo_sihan:20200202175534j:plain

50 COPY#BA1,#BA0,31

f:id:hanadojo_sihan:20200202175526j:plain

// いちごの出現位置をランダムに決定。いちごの出現位置になにかあればやりなおし
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

 

【ポイント】

  1. VRAMに直接書き込めば、処理も早くなり、変数もひとつ(今回でいう変数X)で済むようになります。
  2. 90行目がこのプログラムの最重要ポイント。猫の先頭の座標Xを配列に保存し、文字コード0で残像を消す作業をしています。たとえば、猫が3匹(S=3)のとき配列は[0]〜[2]の3つを使い回すことになります。

f:id:hanadojo_sihan:20200202190800j:plain

f:id:hanadojo_sihan:20200202191131j:plain



f:id:hanadojo_sihan:20200202190742j:plain

理屈的には↑のように増えていっています。

なので、配列は102個あるので102匹まで猫を増やすことができるはず!

 

メモリの読み書きコピーを使った時短術と、配列の節約術のご紹介でした!

CC BY shoichi1031da / @shoichi1031da

twitter.com