SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

横シューティングゲームその2 for IchigoJam P

★この記事は「IchigoJam Advent Calendar 2024」に参加しています。
https://qiita.com/advent-calendar/2024/ichigojam

先日公開した横スクロールシューティングゲームを改造。
プログラム2本に分割して、通常ステージとボスステージを設けてグラディウス風に。懐かしいな~。
紹介動画はこちら。

遊び方

  • 右側から飛んでくる敵を避けつつ、ビームで撃ってください。当たると点数が1点入ります。
  • 自機の操作は、カーソルキーの上下左右で移動、スペースキーでビーム発射です。
  • 敵を10体倒すとボスステージへ移行します。ボスの中心核へビームを10発当ててください。ボスを倒すと通常ステージへ戻ります。
  • 自機が敵や敵の弾に当たるとゲームオーバーとなり、プログラムが終了します。

プログラム

プログラムは2分割です。どちらも1Kバイトぎりぎり。
0番と1番など、連続したSAVEファイル2個に置いて、ファイル0から実行してください。
IchigoJam Sでは遅いのでお勧めしません(^_^;)

ファイル0:通常ステージ

1 CLV:Z=FILE():Y=12
2 [0]=0:COPY#801,#800,203:M=0:CLS:?S
3 GSB9:FORE=15TO31STEP4:FORB=0TO6STEP3:IF[B]GSB13
4 NEXT:WAIT1:B=(E-15)/8*3:IF![B]&&BTN(32)GSB12
5 IF[E]GSB16 ELSEIFRND(20)=1GSB15
6 NEXT:COPY#BE0,#BE1,30:LC30,23:?CHR$(RND(4)+140);:IFS%20=10LRUNZ+1
7 IF!MGOTO3
8 BEEP30,30:LCX,Y:?"*";:LC11,11:?"GAME OVER":CLK:END
9 U=X-BTN(28)*(X>0)+BTN(29)*(X<30):V=Y-BTN(30)*(Y>1)+BTN(31)*(Y<22)
10 LCX,Y:?" ":X=U:Y=V:IFSCR(X,Y)>139M=1:RTN
11 LCX,Y:?CHR$(243):RTN
12 [B]=1:[B+1]=X+1:[B+2]=Y:LC[B+1],[B+2]:?"-":RTN
13 C=[B+1]:D=[B+2]:LCC,D:?" ":C=C+1:[B+1]=C:IFC>30[B]=0:RTN
14 LCC,D:?"-":J=B:FORI=15TO31STEP4:GSB20:NEXT:RTN
15 [E]=1:[E+1]=30:[E+2]=RND(22)+1:[E+3]=RND(2)*2-1:LC[E+1],[E+2]:?CHR$(237):RTN
16 F=[E+1]:G=[E+2]:LCF,G:?" ":F=F-1:IFF<0[E]=0:RTN
17 G=G+[E+3]:IFG<1ORG>22[E+3]=-[E+3]:CONT
18 [E+1]=F:[E+2]=G:IFX=F&&Y=GM=1:RTN
19 LCF,G:?CHR$(237):I=E:FORJ=0TO6STEP3:GSB20:NEXT:RTN
20 K=0:IF[I]&&[J]&&[I+1]=[J+1]&&[I+2]=[J+2]K=I:L=J
21 IF!KRTNELSE[K]=0:[L]=0:BEEP:S=S+1:LC0:?S:LC[K+1],[K+2]:?" ":RTN

ファイル1:ボスステージ

1 CLS:?S:[0]=0:COPY#801,#800,203:P=28:T=0:W=9
2 GSB8:FORE=15TO31STEP4:FORB=0TO6STEP3:IF[B]GSB13
3 NEXT:WAIT1:B=(E-15)/8*3:IF![B]&&BTN(32)GSB12
4 IF[E]GSB17ELSEIFRND(20)=1GSB16
5 GSB20:NEXT:IFM=-1BEEP10,30:WAIT60:LRUNZ,2
6 IF!MGOTO2
7 BEEP30,30:LCX,Y:?"*";:LC11,11:?"GAME OVER":CLK:END
8 U=X-BTN(28)*(X>0)+BTN(29)*(X<30):V=Y-BTN(30)*(Y>1)+BTN(31)*(Y<22)
9 H=SCR(X,Y):IFH=61||(H>127&&H!=243)M=1:RTN
10 H=SCR(U,V):IFH=61||(H>127&&H!=243)M=1:RTN
11 LCX,Y:?" ":LCU,V:?CHR$(243):X=U:Y=V:RTN
12 [B]=1:[B+1]=X+1:[B+2]=Y:LC[B+1],[B+2]:?"-":RTN
13 C=[B+1]:D=[B+2]:LCC,D:?" ":C=C+1:H=SCR(C,D):IFH=255GSB22
14 [B+1]=C:IFC>30||H>32[B]=0:RTN
15 LCC,D:?"-":RTN
16 [E]=1:[E+1]=28:[E+2]=Q+1:LC[E+1],[E+2]:?"=":RTN
17 F=[E+1]:G=[E+2]:LCF,G:?" ":F=F-1:IFF<0[E]=0:RTN
18 [E+1]=F:IFX=F&&Y=GM=1:RTN
19 LCF,G:?"=":RTN
20 FORR=0TO2:LCP,Q+R:?"   ":NEXT:T=T+2:Q=10+SIN(T)/24
21 LCP,Q:?CHR$(140,140,159):LCP,Q+1:?CHR$(0,255);W:LCP,Q+2:?CHR$(131,131,157):RTN
22 BEEP:[B]=0:S=S+1:LC0:?S:W=W-1:IFW<0M=-1
23 RTN

プログラム2分割ですが、データを引き継いでいるだけでほぼ別のゲームです。
かつてのグラディウスのプログラムもこんな作り方だったのかな…?

おまけ:ビッグパイパー

以前にStable Diffusionで生成したグラディウスの自機・ビッグパイパーのイラスト。
以下のプロンプトで出ました。AIはグラディウスを理解している!(^_^)

bigpiper, flying in outer space, shooting beam, konami, gradius