イオ太のブログ

ゲームのこと(レトロ多め)とか、コンピュータのこととか

IchigoJam 用バッティングゲームの改造

* この記事は IchigoJam Advent Calendar 2023 に参加しています。

 


電子工作マガジン2023年秋号に私が投稿した IchigoJam 用プログラム「クリーンヒット」が掲載されました。3年ぶりの採用だったのでとても嬉しかったです。このゲームはとてもシンプルな内容なのですが、もっと入れたい仕様がいろいろあるので改造していきたいと思います。

 

ゲーム内容

まず現状の内容の確認です。これは、来た球をタイミングよく打ち返すだけの単純なバッティングゲームです。

 


www.youtube.com

 <特徴>
 ・文字や記号の組み合わせでピッチャー、バッターを表示。
 ・操作はスペースキーを押してバットを振るだけ。
 ・球はストレートのみ。速さは2種類(普通、速い)。
 ・投球モーションの速さは2種類(普通、速い)。

 

このプログラムは掲載されることを目的として作ったので、できるだけ余計な物を排除してプログラムサイズを小さくすることを心がけました。というのも、最近の電子工作マガジンはとにかく短いプログラムの方が採用されやすい傾向があるからです。

 

改造内容

ということで、いろいろやりたかったことがあるのですが、今回は以下の仕様を入れることにしました。

 

 <仕様>
 ・アニメパターンのデータ化
 ・変化球の追加(球種のデータ化)

 

アニメパターンのデータ化

選手の表示は、元のプログラムではサイズを小さくするために以下のようにしていました。変数Pは表示パターンの番号です。

 

<元のプログラム>

100 IF P=1 B=",ト'":C=" )^"
110 IF P=2 A="<O ":B=" )、":C="ノ\ "
120 IF P=3 A=" 、O":B="L/\":C=" l "
 ・
 ・
 ・
500 LC0,8:?STR$(A):LC0,9:?STR$(B):LC0,10:?STR$(C)

 

今回の改造では、選手のアニメパターンを数値データにしてメモリに置いておき、変数Pの値に応じてCOPYで必要なパターンを表示するようにします。

 

<改造後のプログラム>

800 COPY#980,#A00+P*9,3:COPY#990,#A03+P*9,3:COPY#9A0,#A06+P*9,3

 

このゲームは画面表示で VIDEO3 の拡大表示モードを使用しており、画面表示用のメモリで使ってない部分(#9C0-#BFF)があるのでそこにアニメパターンのデータを置くことにします。

 

変化球の追加(球種のデータ化)

カーブ、フォークなどいろいろな球種を投げられるようにします。なお今回は見た目だけの変更で、操作自体はタイミングを合わせて打つということに変わりはありません。将来的には、球に高低差をつけてコースによって打ち分けるなどの仕様も試してみたいと思っています。

 

球種は、軌道データと速度データの2つで決まることにします。

 

<軌道データ>

球が左から右へ移動する間の縦の座標をデータとして持ちます。以下の3種類の軌道を用意します。

 

 0. ストレート

  POKE#A40,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09


 1.  カーブ

  POKE#A50,#08,#07,#06,#05,#04,#04,#04,#05,#06,#07,#08,#09,#0A


 2. フォーク

  POKE#A60,#08,#07,#08,#07,#08,#07,#08,#07,#08,#07,#09,#0A,#09

 

<速度データ>

速度は今まで通り、WAITの値です。値が小さいほど速くなります。

 

<球種>

今回は以下の6つを用意します。軌道データと速度データによって決まります。

 

  0 ストレート(普通)
  1 カーブ(遅い)
  2 フォーク(普通)
  3 ストレート(速い)
  4 カーブ(普通)
  5 フォーク(速い)

 

なお、ゲームはいきなり全球種が出るようになっていると難しいので、だんだんと投げる球種が増えて行くようにします。最初は0番のストレート(普通)しか投げてきません。2球投げるごとに1番のカーブ(遅い)、2番のフォーク(普通)と投げる球種が増えて行きます。ただしランダムなので、すぐに出るかどうかは分かりません。

 

プログラム

データの書き込みでプログラムサイズが大きくなったので、プログラム0とプログラム1の2つに分けました。

 

 ・プログラム0 ・・・ 各種データ設定
 ・プログラム1 ・・・ ゲーム実行

 

以下が改造したプログラムとなります。プログラム0とプログラム1を保存して、プログラム0から実行します。

 

<プログラム0>

10 'C-Hit0
20 VIDEO3
30 POKE#A00,#20,#4F,#20,#20,#C4,#2C,#20,#6E,#20:POKE#A09,#20,#4F,#20,#2C,#C4,#27,#20,#29,#5E
40 POKE#A12,#3C,#4F,#20,#20,#29,#A4,#C9,#5C,#20:POKE#A1B,#20,#A4,#4F,#4C,#2F,#5C,#20,#6C,#20
50 POKE#A24,#20,#4F,#21,#20,#7C,#27,#20,#CA,#20:POKE#A2D,#20,#4F,#20,#B0,#B2,#20,#20,#D9,#20
60 POKE#A36,#20,#4F,#2F,#20,#B2,#20,#20,#D9,#20
70 POKE#A40,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09
80 POKE#A50,#08,#07,#06,#05,#04,#04,#04,#05,#06,#07,#08,#09,#0A
90 POKE#A60,#08,#07,#08,#07,#08,#07,#08,#07,#08,#07,#09,#0A,#09
100 POKE#B00,0,8,1,10,2,8,0,2,1,4,2,3
110 LRUN1

 

<プログラム1>

200 'C-Hit1
210 CLS:CLV:DRAW0,22,31,22
220 L=1
300 G=0:H=0:P=0:Q=0
310 Z=RND(L):J=#B00+Z*2:M=PEEK(J):W=PEEK(J+1)
320 IF RND(8)<6 V=20 ELSE V=5
400 GOSUB800:IF P=0 WAIT50
410 IF P<3 P=P+1:WAIT V:GOTO400 ELSE BEEP3,2
500 FOR X=3 TO 15:GOSUB900:Y=PEEK(#A40+M*16+X-3):LC X,Y:?"o";
510 IF(Q=1)&(X>12)&(X<15) H=1:X=15:BEEP9,5:S=S+1:IF L<5 L=S/2+1
520 IF H=0 WAIT W:LC X,Y:?" ";
530 NEXT:GOSUB800:IF H=0 GOTO700
600 FOR I=0 TO 6:LC13-I*2,9-I:?"o";:WAIT2:LC13-I*2,9-I:?" ";:NEXT
610 WAIT50:GOTO300
700 LC6,5:?"OUT":BEEP30,9
710 IF INKEY()=10 RUN ELSE CONT
800 COPY#980,#A00+P*9,3:COPY#990,#A03+P*9,3:COPY#9A0,#A06+P*9,3
900 IF(G=0)&(BTN(32)=1) G=1
910 IF(G=1)&(Q<2) Q=Q+1
920 COPY#98D,#A24+Q*9,3:COPY#99D,#A27+Q*9,3:COPY#9AD,#A2A+Q*9,3
950 LC0,0:?"HIT:";S:RETURN

 

とりあえず完成


www.youtube.com

急いで作ったので、変化球の軌道とか速度とか、難易度調整とか、もっといじらないとなあと思いますが、とりあえずこんな感じです。他にも入れたいものはいろいろあるので、また更新したいと思います。