福野泰介の一日一創 - create every day

1KBでパックマン風ゲーム! IchigoJam BASIC プログラム解説と容量削減テクニック

2018/03/20
#IchigoJam #KidsIT 

テトリス風マインスイーパー風と、IchigoJamの1プログラムの容量制限、驚きの1KBプログラムが次々と登場する中、なんとパックマン風ゲーム「Ichigo Pac」が登場。 作者は、VLED勝手表彰でjig.jp賞をもらっていただいた、その筋屋さん!


敵キャラ、モンスターは4体が追いかけてくる!イチゴを取ったら逆転、連続確保で高得点!

すごいのはステージ生成。わずかこの1行!(RUN on IchigoJam web)

M=#FF:CLS:LET[0],M,#84,#B5,#B5,#80,#F5,#84,#BD,#A0,#AF:FORY=0TO9:FORX=0TO7:A=46-([Y]&#80>0)*43:LCX,Y:?CHR$(A):LC15-X,Y:?CHR$(A):LCX,20-Y:?CHR$(A):LC15-X,20-Y:?CHR$(A):[Y]=[Y]<<1:NEXT:NEXT


配列10コ、8bitで壁とドットを表すステージデータ。左右、上下対称に描画。

ステージ描画用プログラムを少し圧縮して短くしてみます。8bit目を表す「#80」で3文字になってしまうので反転、壁とドットキャラクターの46と3の差分は43、3に43を足すことにすると1文字へりそうです。

FORI=0TO9:N=0:FORJ=0TO7:N=N+([I]&(#80>>J)>0)<<J:NEXT:?HEX$(N),N,HEX$(N),~N&#FF:NEXT

ビットと左右反転させたステージデータを使ったステージ生成プログラムがこちら

CLS:LET[0],0,222,82,82,254,80,222,66,250,10:FORG=0TO79:X=G%8:Y=G/8:A=3+[Y]>>X&1*43:LCX,Y:?CHR$(A):LC15-X,Y:?CHR$(A):LCX,20-Y:?CHR$(A):LC15-X,20-Y:?CHR$(A):NEXT

プログラム容量削減ミニ技
- 255の代わりに ~0 で1文字短縮 (bit反転)
- #3Cなど#63以下の16進数は10進数にすることで1〜2文字短縮
- K>0 の代わりに K で2文字短縮
- -(K=28)+(K=29) のプラスを前にして1文字短縮
- ?CHR$(0) の代わりに ?" " で4文字短縮(キャラコード32になるので注意)
- +(P>0)*11 の代わりに -!P*11 で3文字短縮
- P=P-(P>0) の代わりに P=P-!!P で2文字短縮
- 2重ループを1重ループ化(X、Yは計算で求める)
- 配列への代入ループを展開(ループ回数が少ない場合有効)
- よく使う数を変数にいれる(Y=10、J=I+4、I+12 → J+8)
- SCR()でLCで設定した位置のキャラコードを取得することを利用
- シンプルな演算子の優先順位を利用して、カッコを削除
(参考、MSXユーザーのためのIchigoJam入門

この調子で 870byte(154byteの空きメモリー)まで圧縮
「Ichigo Pac」 (RUN on IchigoJam)

1 CLS:LET[0],0,222,82,82,254,80,222,66,250,10:FORG=0TO79:X=G%8:Y=G/8:A=3+[Y]>>X&1*43:LCX,Y:?CHR$(A):LC15-X,Y:?CHR$(A):LCX,20-Y:?CHR$(A):LC15-X,20-Y:?CHR$(A):NEXT 2 CLV:LC1,2:?CHR$(~0):LC14,18:?CHR$(~0):X=3:Y=10:LET[0],7,8,9,Y,Y,Y,Y,Y:POKE#700,60,#7E,#99,#BD,#99,~0,~0,#99 3 D=H:E=V:K=INKEY():IFKH=(K=29)-(K=28):V=(K=31)-(K=30) 4 A=X:B=Y:IFSCR(X+H,Y+V)=3H=D:V=E 5 X=(X+H)&15:Y=Y+V:Z=SCR(X,Y):IFZ=3X=A:Y=B 6 LCA,B:?" ":LCX,Y:?CHR$(232+C&1):LC20,0:?"SCR ";S:I=C&3:J=I+4:LC[I],[J]:?CHR$([I+8]):[J+8]=[I]:[I+16]=[J]:[I]=[I]+(X>[I])*2-1:F=SCR([I],[J]):IFP||F=3||F=224[I]=[J+8] 7 [J]=[J]+(Y>[J])*2-1:F=SCR([I],[J]):IFP||F=3||F=224[J]=[I+16] 8 LC[I],[J]:[I+8]=SCR():?CHR$(235-!P*11):FORG=0TO3:IFX=[G]&&Y=[G+4]IFPS=S+R:R=R+R:[G]=8:[G+4]=10:Q=Q+([G+8]=46):[G+8]=0ELSECLS:?"GAME OVER ";S:END 9 NEXT:IFZ=46S=S+10:Q=Q+1ELSEIFZ=255P=20:R=200 10 IFQ<146P=P-!!P:C=C+1:GOTO3

効果音や、敵キャラアルゴリズムなど、いろいろ追加要素を加えてみるのも楽しそう!

Ichigo Pac 解説


クリア!
IchigoJam実機では、なかなかエキサイティングなゲームになっています。

力作ゲーム、ぜひ電子工作マガジンのベーマガ(BASICマガジンコーナー)へも投稿もどうぞ!
電子工作マガジンWEBSITE

links
- ダイヤ編成支援システム その筋屋【公式】 on Twitter: "自作の #IchigoJam のBASICで作ったパックマン、実機で動かしてみました。 実機だと、けっこうスリルがありますよ。 ソースプログラムはこちら。実機に入れてみよう。 (まだバグがあるかも) https://t.co/sdPmIkuRx7… https://t.co/zITMSGIhXI"
- 勝手表彰「ダイヤ編成支援システム その筋屋」さん!バスリアルタイムオープンデータから本格ミニゲームまで、意外と使えるIchigoJam&sakura.io進呈! トランプゲーム実装例、神経衰弱

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image