オモシロかわくだりゲームが作りたい(3)
* この記事は IchigoJa m Advent Calendar 2024 に参加しています。
2024年、私がIchigoJamで作ったもの、作りかけたものについて振り返ります。前回、前々回の続きです。
自機を変形させたい!
他に考えていた案は、自機をリアルタイムに変形することです。拡大縮小したり、回転させたりして何かをしたいということです。

そのためにDRAWで自機を描きます。絵は単純な三角や四角になってしまいますが、IchigoJam BASICは結構速いので描いて消してを交互に繰り返すことでアクションゲームにも使えます。
これは電子工作マガジン2020年夏号に掲載された「スペースデルタ」というシューティングゲームですが、敵機をDRAWで描いています。
自機がジャンプするゲーム

まず、ジャンプで障害物を避けるゲームです。自機の拡大縮小でジャンプを表現します。ゲームとして考えればジャンプするために何か制限をつけるべきだと思います。例えば、以下のような方法が考えられます。
・ジャンプ台に乗るとジャンプする。
・アイテムを取ったらジャンプできる。アイテムの所持数がジャンプできる回数。
・いつでも自由にジャンプできるが、障害物の出し方で難しさを調整する。
10 CLS:CLV:X=15
20 LET[0],0,3,5,6,6,6,5,3
30 V=X*2:IF E=1 F=F-1:IF F>=0 GSB 400 ELSE E=0
40 A=1:GSB 300
50 IF H=1 GOTO 200
60 WAIT0
70 A=0:GSB 300
80 IF(E=0)&(RND(8)=0) E=1:F=23:GSB 400 ELSE LC RND(31),23:?"*"
100 IF J>0 COPY#A20-J*32,#828,160:J=(J+1)&7
110 X=X-BTN(28)&(X>0)+BTN(29)&(X<28)
120 IF(BTN(32))&(J=0) BEEP3,4:J=1:COPY#828,#A20,160
130 IF J>0 GOTO 30
150 FORI=0TO8:IF SCR(X+I%3,I/3+4)=42 [8+I]=1:H=1
160 NEXT
170 GOTO 30
200 FORI=0TO11:IF [8+I]=1 LC X+I%3,I/3+4:?"x"
210 NEXT:BEEP80,20
220 IF INKEY()=10 RUN ELSE CONT
300 DRAW V-[J],9-[J],V-[J],12+[J],A:DRAW V+5+[J],9-[J],V+5+[J],12+[J],A
310 DRAW V+1-[J],8-[J],V+4+[J],8-[J],A:DRAW V+1-[J],13+[J],V+4+[J],13+[J],A
320 RTN
400 LC0,F:?"*******************************":RTN
*プログラム60行目は、IchigoJam web用にWAIT0としています。
とりあえずこれでやってみたのですが、何か「キモチイイ!」とか「オモシロイ!」というような感じるものがなく、これ以上深掘りするのをやめました。
自機がだんだん大きくなるゲーム

同じく拡大縮小を使って自機がだんだん大きくなるというのを試してみました。イチゴを取るたびに自機が大きくなります。大きくなると障害物に当たりやすくなるというデメリットをどうするか悩んだのですが、とりあえず当たり判定は無視して作ってみました。
<プログラム>
10 CLS:CLV:X=15:Y=4:L=3
30 LC0,0:?"L=";L:V=X*2
40 E=1:GSB 300
50 WAIT0
60 E=0:GSB 300
70 IF G=1 BEEP2,20:L=L+1:G=0
80 LC RND(31),23:IF RND(10)<9 ?"*" ELSE ?"🍓"
110 X=X-BTN(28)&(X>0)+BTN(29)&(X<31-L)
150 FORI=0TOL-1:P=SCR(X+I,Y+L-1):Q=SCR(X,Y+I):R=SCR(X+L-1,Y+I)
160 IF(P=255)|(Q=255)|(R=255) G=1
170 NEXT
180 GOTO 30
200 BEEP80,20
220 IF INKEY()=10 RUN ELSE CONT
300 A=X*2:B=Y*2:C=A+L*2-1:D=B+L*2-1
310 DRAW A,B+1,A,D-1,E:DRAW C,B+1,C,D-1,E
320 DRAW A+1,B,C-1,B,E:DRAW A+1,D,C-1,D,E
330 RTN
*プログラムの50行目は、IchigoJam web用にWAIT0としています。
*大きくなるサイズには制限があり、それ以上は大きくなりません。
*障害物との判定はしていません。
これもやってみたけど特に何も思いつかなかったので、ここまででやめました。
自機が曲がりながら進むゲーム
「くねくねかわくだり」
そして、これが本命で作りたかったゲームになるのですが、自機が向きを変えて曲がるゲーム、いわゆる真上視点のドライブゲームのようなものです。特にやりたかったのは急カーブをドリフトしながら曲がる感じです。これはもう最初から頭の中で動きのイメージができていました。

かわくだりゲームにこだわっていたので、車ではなくモーターボートで川を進むことにしました。画面下に向かって進みます。急カーブを曲がるようにするために障害物は左右から交互に壁が伸びている形にしました。操作はカーソルーの左右のみです。
縦のスクロールスピードは一定で、横に進む時だけ加速します。これはちょっと変な感じもしますが、実は横スクロールタイプの空中制御しながら進むゲームがイメージにありました。

このようなゲームを縦向きにして、画面左右にだけ加速する感じで考えました。ボート自体の動きによる加速に加えて、川の流れの感じを出すために左に進む所は左に流され、右に進む所は右に流されるような動きを加えるようにしました。
<プログラム>
10 'kune_kune
20 VIDEO1:CLS:CLV:X=32:Y=16:H=3:J=H:K=1:S=4:U=2:N=1
30 FORI=0TO11:[I*2]=COS(I*30)/64:[I*2+1]=SIN(I*30)/64:NEXT
40 FORI=24TO39:[I]=#404:NEXT:LET[56],1,1,-1,-1
100 R=(H+4)%12:L=(H+8)%12
110 A=X+[H*2]*5/3:B=Y+[H*2+1]*5/3:C=X+[R*2]:D=Y+[R*2+1]
120 E=X+[L*2]:F=Y+[L*2+1]:V=X+[H*2]/5*2:W=Y+[H*2+1]/5*2
130 IF(POINT(A,B)=1)|(POINT(V,W)=1) G=1
140 IF(V<0)|(V>63) G=1
150 DRAWA,B,C,D:DRAWC,D,E,F:DRAWE,F,A,B
160 IF G=1 GOTO500
170 H=H+(BTN(29)=1)&(H<6)-(BTN(28)=1)&(H>0):IF H<>J BEEP1,1
180 J=H
190 DRAWA,B,C,D,0:DRAWE,F,A,B,0
200 Z=Z+[H*2]/2:IF Z>4 Z=4 ELSE IF Z<-4 Z=-4
210 X=X+Z+N
220 SCROLL0:M=M+1:IF(T=1)|(T=3) COPY#BE0+P,#830,Q
230 COPY#850,#852,30:[55]=[56+T]:N=[42]
240 K=K-1:IF K=0 T=(T+1)&3:K=10:Q=RND(U)+19:IF T=1 K=2:P=0 ELSE IF T=3 K=2:P=32-Q
250 LC0,0:?M;"m":IF(M%50=0)&(S>0) S=S-1:U=U+2:BEEPS+2,10
260 WAITS:GOTO100
500 LC12,10:?"Game Over":BEEP20,20
510 IF INKEY()=10 RUN ELSE CONT
IchigoJam web版はこちら(実機で遊ぶ前提で作っているので遅いです)
これでいちおう作りたかった形にはなりました。自機を曲げて進む操作感も気持ち良くなったと思います。元のかわくだりゲームからは全然違うものになったのでこれをかわくだりゲームの改造と言えるのかは微妙ですが・・・。
上に進むようにしてプログラムをシンプルにした
「くねくねリバー」
実はもう1つの裏テーマがあってそれは「電子工作マガジンの投稿コーナーに掲載してもらうこと」でした。「くねくねかわくだり」を投稿するつもりでしたが、電子工作マガジンに載るプログラムはかなり短いものが多い傾向にあるのでもっと削ぎ落とすことにしました。
それと1つ気になっていたのが、自機が下に向かって進むのですが、左右に曲がるハンドル操作はカーソルキーの右を押すと向きが右回転、左を押すと左回転します。これは、下に向かって進んでいる時は押した方向と自機の向きが変わる方向が逆なので直感的ではないのではと思いました。どう考えても上に向かって進む方が遊びやすいので変更しました。
画面上に向かって進むのは「かわくだり」と言いづらいので名前も「くねくねリバー」にしました。そして、電子工作マガジン2024年冬号に掲載されて目的は達成したのですが、最終的にかわくだりゲームからはすごく遠くなった気がします 笑
【追記】
電子工作マガジンに掲載されている「くねくねリバー」のプログラムについてですが、200行目のWAITをやめて、130行目の自機表示の直後にWAITを置いた方が、自機がくっきり表示されます。
オモシロかわくだりゲームが作りたい(2)
* この記事は IchigoJa m Advent Calendar 2024 に参加しています。
2024年、私がIchigoJamで作ったもの、作りかけたものについて振り返ります。前回の続きです。
オモシロゲームが思いつかない!
「かわくだりさっちゃん」を作ってから、それ以上におもしろいゲームが思いつきませんでした。どうしても「かわくだりさっちゃん」の内容に引っ張られてしまいます。特に、
・人(生物)が舟に乗っていて何かする。
・人(あるいは舟)がジャンプする。
という内容で考えようとしていました。
舟のデザインに凝ってみる
ゲームの内容が思いつかないので、舟に人が乗る絵を凝ってみることにしました。

画面のようにいろいろな形や大きさで描いてみました。サイズが大きくなると障害物に当たりやすくなるというデメリットがあります。それを回避するには、以下のようなことを考えました。
・障害物を減らす。
・障害物を破壊できるようにする(シューティングとか)
・障害物を無効にする何か(ジャンプとか無敵とか)
しかし特にこれという良いものは思いつきませんでした。ただ、見た目だけで考えれば、人がいっぱい乗っているのは人生ゲームのコマのようで楽しそうだなと思いました。



<プログラム>
10 CLS
20 COPY#700,#000,3:COPY#703,#7D0,5
30 COPY#708,#000,3:COPY#70B,#7C8,5
40 COPY#710,#000,4:COPY#714,#7D0,4
50 COPY#718,#000,3:COPY#71B,#7C8,5
100 LOCATE0,0:?CHR$(224);" ";CHR$(226)
110 WAIT20
120 LOCATE0,0:?CHR$(225);" ";CHR$(227)
130 WAIT20
140 GOTO100
また、おぼれる人を救出する時に「UFOキャッチャー」のように引っ張り上げるとおもしろいなと思いました。

というようなことを考えていたものの、プログラムが長くなりそうなことと、ちゃんとおもしろいゲームにする自信がなかったのでそれ以上は作っていませんでした。
でも、ためしに作ってみた
せっかくなので今回、やりたかった要素だけで作ってみました。ゲームにはなっていません。不具合もあります。
動画は、IchigoJam web で実行しているためスピードが遅くなっています。
<内容>
・舟をカーソルキーで上下左右に移動します。
・川でおぼれている人たちが画面下から現れます。
・スペースキーを押すとクレーンが伸びます。
・クレーンで人をキャッチして救助します。
・救助した人は舟に乗ります(6人まで)。
・クレーンの正面以外が人にぶつかると人は消えます。
・舟にぶつかった人も消えます。
<プログラム>
10 VIDEO1:CLS:CLV:X=14:Y=3:V=X:W=Y
20 POKE#800,#8E,#83,#83,#83,#8D,#85,#00,#92,#00,#8A,#85,#00,#92,#00,#8A
30 POKE#80F,#85,#00,#92,#00,#8A,#8B,#8C,#00,#8C,#87,#00,#8B,#8F,#87,#00
40 POKE#81E,#00,#00,#83,#00,#00
60 COPY#700,#000,4:COPY#704,#7D0,4:COPY#708,#000,3:COPY#70B,#7C8,5
100 FORI=0TO6:COPY#900+I*32+X+Y*32,#800+I*5,5:NEXT
110 V=X:W=Y:WAIT0
120 IF(P=0)&BTN(32) P=1:Q=0
130 IFP>0 GOSUB500:GOTO200
140 X=X-BTN(28)&(X>0)+BTN(29)&(X<26)
150 Y=Y-BTN(30)&(Y>0)+BTN(31)&(Y<16)
160 IF(X!=V)|(Y!=W) FORI=0TO5:LCV,W+I:?" ";:NEXT
200 C=(C+1)%8:A=C%2:COPY#710,#700+A*8,8
210 IFC=0 LCRND(31),23:?"↑":IFY>0 Y=Y-1:W=W-1
300 GOTO100
500 IFP=2 LCX+1,Y+8+Q:?" ":IFQ<0 P=0:RETURN
510 IFP=3 LCX+2,Y+9+Q:?" ":LCX+1,Y+8+Q:IFQ>=0 ?" 🕺 " ELSE P=0:?" ":IFN<6 N=N+1:POKE#812-(((N-1)%2)*2+(N-1)/2*5),#F9:RETURN
520 LCX+1,Y+7+Q:IFP=1 ?"▟▀▙" ELSE ?"▐▀▌"
530 IF(P=1)&(Q>0) LCX+1,Y+6+Q:?" ┃ ":IF(Q=8)|(Y+7+Q=23) P=2
540 IFSCR(X+2,Y+8+Q)=226 BEEP:LCX+2,Y+8+Q:?"🕺":P=3
550 IFP=1 Q=Q+1 ELSE Q=Q-1
560 RETURN
*プログラムの110行目は、IchigoJam web用にWAIT0としています。
まあこんな感じです。ここまで作ってみたところで、982byteになったのでこれ以上作るにはプログラム1つ(1KB)では難しいですね。ということで、このゲームはここまでです。
次回、DRAWで自機を表現する

(つづく)
オモシロかわくだりゲームが作りたい(1)
* この記事は IchigoJa m Advent Calendar 2024 に参加しています。
2024年、私がIchigoJamで作ったもの、作りかけたものについて振り返ります。
IchigoJam10周年
2024年4月1日、IchigoJamは10周年を迎えました。Facebook内のグループ、IchigoJam-FANではユーザーの方々が記念にプログラムや工作物を作って公開するという動きがあったので、私も「かわくだりゲーム」の改造ゲームを作ることにしました。

かわくだりゲームというのは、障害物に当たらないように左右に避けながら進んで行くというおなじみのスクロールゲームです。IchigoJamと言えばこのゲームですね。
とてもシンプルなプログラムで初心者が変更したり追加したりして学ぶにはとても良いと思います。また、ゲーム制作者にとってもこのシンプルなゲームをいかにおもしろく改造できるか考えることはとても良いトレーニングであると思います。ということで、私は「オモシロかわくだりゲーム」を作ろうとして今年ずっと苦悩することになるのでした 笑
軽い気持ちで作った一作目
「イチゴ取り&障害物避けゲーム」

最初に作ったのがこのゲームです。イチゴ(🍓)の時は取って行き、障害物(*)の時は避けるというゲームです。COPYを使ってキャラクタのデータを書き換えて画面上のキャラをいっせいに切り替えています。この画面上の全てのキャラがいっせいに変わるというのをやってみたかったのです。
<プログラム>
10 CLS:X=15:A=0:S=0:[0]=#7F8:[1]=#150:COPY#700,[0],8
20 LC 0,0:?"🍓=";S:LC X,5:?"O"
25 IF RND(50)=0 THEN A=A^1:BEEP1,10:COPY#700,[A],8:WAIT20
30 LC RND(31),23:?CHR$(224)
35 WAIT 4-A
36 X=(X-BTN(28)+BTN(29)+31)%31
39 IF SCR(X,5)>0 IF A=0 BEEP70,2:S=S+1 ELSE BEEP90,20:?"🍓=";S:END
40 GOTO 20
SHIROさんの作品を見て触発される
さて私が1つ目の改造ゲームを作った頃、過去にも多数のかわくだりゲームの改造を公開されているSHIROさんがとんでもなく10周年記念にふさわしいオモシロかわくだりゲームを公開されたのでした。
ネタとしておもしろいし、ゲーム的に見ても文字を取るたびに自機がだんだん横に伸びていって避けにくくなるというのが良いと思いました。すごく難しいゲームですが、なんか何度も挑戦したくなる中毒性があります。これを見て自分も「もっとおもしろいものを考えなければ!」と思い、ここから苦悩が始まったのでした 笑
適当に作ったらオモシロゲームができてしまった!
「かわくだりさっちゃん」

IchigoJamの有名な作品に「なわとびさっちゃん」というゲームがあります。
この「なわとびさっちゃん」と「かわくだりゲーム」と合体させたらどうなるかなと適当に作ってみたら、これがめちゃめちゃ軽快でテンポ良くておもしろい!二作目にしてあっさりとオモシロゲームができてしまったのでした。ただし、オリジナリティは全くないですけどね!
<プログラム>
10 CLS:X=15:Y=8:V=99:R=16:U=5:J=0:M=0:S=0
20 IF V!=99 Y=Y+V:V=V+1
30 IF(J>0)&(Y>=8) Y=8:V=99:J=0:S=S+1:BEEP 3,3
40 R=R+U
50 IF R>15 U=U-1:IF R>26 R=26
60 IF R<11 U=U+1:IF R<0 R=0
70 IF(BTN(32)=1)&(J<3) V=-2:J=J+1:BEEP 1,2
80 LC X,Y:?"@":LC X,9:?"
"
90 LC R,8:?"-----"
100 IF(Y=8)&(X>=R)&(X<R+5) GOTO 180
110 WAIT 5
120 LC X,Y:?" ":LC X,9:?" "
130 LC R,8:?" "
140 X=X-(BTN(28)&(X>0))+(BTN(29)&(X<30))
150 LC RND(31),23:?"*"
160 M=M+1:LC 0,0:?M;"m":LC 10,0:?"JUMP:";S
170 IF SCR(X,9)!=42 GOTO 20
180 BEEP 90,20
190 IF INKEY()=10 RUN ELSE CONT
IchigoJam web版はこちら(実機より遅いため、110行目のWAITを無効にしています)
次回、舟の形や大きさにこだわり出して迷走する

いちおう、「かわくだりさっちゃん」というオモシロゲームは偶然にもできてしまったのですが、これは他の方が作られたゲームを合体させただけ。プログラムもほぼ流用。「もっとオリジナルなゲームを考えたい!」と思ったのでした。そして引き続き考えるのですが、「かわくだりさっちゃん」のおもしろさを超えられない!という苦悩を抱えることになるのでした。
(つづく)
IchigoJam 用バッティングゲームの改造
* この記事は IchigoJam Advent Calendar 2023 に参加しています。

電子工作マガジン2023年秋号に私が投稿した IchigoJam 用プログラム「クリーンヒット」が掲載されました。3年ぶりの採用だったのでとても嬉しかったです。このゲームはとてもシンプルな内容なのですが、もっと入れたい仕様がいろいろあるので改造していきたいと思います。
ゲーム内容
まず現状の内容の確認です。これは、来た球をタイミングよく打ち返すだけの単純なバッティングゲームです。
<特徴>
・文字や記号の組み合わせでピッチャー、バッターを表示。
・操作はスペースキーを押してバットを振るだけ。
・球はストレートのみ。速さは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
とりあえず完成
急いで作ったので、変化球の軌道とか速度とか、難易度調整とか、もっといじらないとなあと思いますが、とりあえずこんな感じです。他にも入れたいものはいろいろあるので、また更新したいと思います。
「イチゴサーカス」更新(2023/04/04)
IchigoJam 用「イチゴサーカス」のプログラムを更新しました。オリジナルの「サーカス」に近づけるためにキャラのアニメと曲の追加をしました。プログラムは4つになり、合計4KB近くまでになってしまいました。ただ、見やすいように行を分けたり増やして書いているので、詰めればもっとメモリは空くと思います。
(2023/04/04)
- キャラクターのアニメパターンを追加
- スタート時、ボーナス時の曲を追加
プログラムは、IchigoJam BASIC 用(プログラム0〜3)と IchigoCake BASIC 用(プログラム0)の2種類あります。どちらも行番号と内容は同じになっています。
IchigoJam BASIC 用(Ver. 1.2.3以降)
<プログラム0>
NEW
10 'Circus-0
20 CLV
30 POKE#778,#18,#99,#7E,#18,#18,#24,#24,#66,#10,#21,#27,#7C,#7C,#24,#26,#42
50 POKE#788,#60,#23,#3E,#18,#98,#7E,#19,#00,#42,#64,#24,#3E,#3E,#E4,#84,#08
70 POKE#798,#00,#98,#7E,#19,#18,#7C,#C4,#06,#00,#19,#7E,#98,#18,#3E,#23,#60
90 POKE#7A8,#00,#99,#7E,#18,#18,#3C,#42,#C3,#00,#00,#18,#7E,#99,#3C,#24,#66
110 POKE#7B8,#00,#00,#00,#18,#7E,#99,#7E,#C3,#00,#00,#00,#00,#00,#C8,#2B,#FF
130 POKE#7E0,#00,#18,#18,#30,#3C,#10,#10,#18
140 POKE#7F0,#00,#18,#18,#0C,#3C,#08,#08,#18
150 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
160 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
170 POKE#8C8,19,19,19,19
180 LET[0],0,4,6,1
190 LET[4],-1,-1,-1,1,-1,1,1,1
200 LET[12],50,25,0,0,0,0,25,50
210 LET[24],100,50,20
220 LET[28],0,12,75,-200,31,12,-75,-200,0,17,100,-200,31,17,-100,-200
310 LET[44],252,251,252,251,254,253,254,253
320 LET[52],243,250,244,245,240,241,242,243
330 LET[60],239,239,239,239,239,246,247,248
350 LRUN1
SAVE0
<プログラム1>
NEW
400 'Circus-1
410 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
420 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
430 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1700:GSB1800
440 COPY#900,#940,32:COPY#A00,#940,32:COPY#A40,#940,32:COPY#A80,#940,32
450 PLAY"T100O5F8R64F16R64F4R64F16G16F16G16A4"
460 WAIT180:H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0
500 '
510 COPY#BC0,#940,32:T=30:U=-350:M=-1
520 A=RND(4)*4:X=[28+A]:Y=[29+A]:P=[30+A]:Q=[31+A]:IF X=0 Z=1 ELSE Z=2
530 E=X*100:F=Y*100:V=X:W=Y
600 '
610 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT
620 LRUN2
1100 '
1110 IF H=0 A=200:LC11,8:?"GAME OVER" ELSE A=150
1120 IF[20]<S [20]=S
1130 PLAY"T120O3B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1140 GSB1700:WAIT A:IF H=0 GOTO400
1150 GSB1800:COPY#A40,#940,32:GOTO500
1700 '
1710 LC5,10:?"TODAYS HIGH SCORE ";[20]
1720 RTN
1800 '
1810 IF BTN(32) [27]=1 ELSE IF BTN() [27]=2 ELSE CONT
1820 RTN
SAVE1
<プログラム2>
NEW
700 'Circus-2
710 'Main_Start
720 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
730 IF(Z<3)|(Z>5) GOTO800
740 IF(X<4)|(X>27) GSB1200
750 IF X=0 P=T:Z=4 ELSE IF X=31 P=-T:Z=4
760 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB1300
770 IF Y>=22 Y=22:F=2200:Q=0:Z=6:G=0
800 '
810 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L
820 IF Z>0 LCV,W:?" ";
830 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B
840 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
850 LRUN3
1200 '
1210 A=0
1220 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
1230 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
1240 IF A=1 Z=4:T=75:IF X<4 P=T ELSE P=-T
1250 RTN
1300 '
1310 BEEP:Z=3:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
1320 IF T<200 T=T+[12+A]
1330 P=T*[4+A]:K=L:L=L^1
1340 RTN
SAVE2
<プログラム3>
NEW
900 'Circus-3
920 G=(G+1)%4:IF(Y>17)&(Q>0) Z=5
930 IF Z=1 E=E+25:IF E=400 Z=3
940 IF Z=2 E=E-25:IF E=2800 Z=3
950 R=[40+Z*4+G]
960 IF(Z=6)&(G=3) Z=7:H=H-1
980 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
1000 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1600:LRUN1,600
1010 IF Z=7 BEEP30,20:WAIT30:LRUN1,1100
1020 M=N:IF [27]=1 GSB1400 ELSE IF [27]=2 GSB1500
1030 IF(Z>=3)&(Z<=5) E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
1040 IF E<0 E=0 ELSE IF E>3199 E=3100
1050 V=X:W=Y:X=E/100:Y=F/100
1060 'Main_End
1070 WAIT4:LRUN2
1400 '
1410 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1420 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1430 RTN
1500 '
1510 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1520 N=(A-320)/12
1530 RTN
1600 '
1610 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1620 PLAY"T120O5C16O4B16O5C16F8C16R64O4A8R64A16G#16A16O5C8O4A16R64F8A16G16F16G8R64G16R64G8A#16A16G16O5C8O4A16F4"
1630 WAIT300:COPY#A00,#940,32:COPY#920+B*64,#940,32
1640 RTN
2000 '2023/04/04
SAVE3
IchigoCake BASIC 用(Ver. 1.3.2以降)
<プログラム0>
NEW
10 'Circus-0
20 CLV
30 POKE#778,#18,#99,#7E,#18,#18,#24,#24,#66,#10,#21,#27,#7C,#7C,#24,#26,#42
50 POKE#788,#60,#23,#3E,#18,#98,#7E,#19,#00,#42,#64,#24,#3E,#3E,#E4,#84,#08
70 POKE#798,#00,#98,#7E,#19,#18,#7C,#C4,#06,#00,#19,#7E,#98,#18,#3E,#23,#60
90 POKE#7A8,#00,#99,#7E,#18,#18,#3C,#42,#C3,#00,#00,#18,#7E,#99,#3C,#24,#66
110 POKE#7B8,#00,#00,#00,#18,#7E,#99,#7E,#C3,#00,#00,#00,#00,#00,#C8,#2B,#FF
130 POKE #7E0,#00,#18,#18,#30,#3C,#10,#10,#18
140 POKE #7F0,#00,#18,#18,#0C,#3C,#08,#08,#18
150 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
160 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
170 POKE#8C8,19,19,19,19
180 LET[0],0,4,6,1
190 LET[4],-1,-1,-1,1,-1,1,1,1
200 LET[12],50,25,0,0,0,0,25,50
210 LET[24],100,50,20
220 LET[28],0,12,75,-200,31,12,-75,-200,0,17,100,-200,31,17,-100,-200
310 LET[44],252,251,252,251,254,253,254,253
320 LET[52],243,250,244,245,240,241,242,243
330 LET[60],239,239,239,239,239,246,247,248
400 '
410 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
420 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
430 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1700:GSB1800
440 COPY#900,#940,32:COPY#A00,#940,32:COPY#A40,#940,32:COPY#A80,#940,32
450 PLAY"T100O5F8R64F16R64F4R64F16G16F16G16A4"
460 WAIT180:H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0
500 '
510 COPY#BC0,#940,32:T=30:U=-350:M=-1
520 A=RND(4):X=[28+A*4]:Y=[29+A*4]:P=[30+A*4]:Q=[31+A*4]:IF X=0 Z=1 ELSE Z=2
530 E=X*100:F=Y*100:V=X:W=Y
600 '
610 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT
700 'Main_Start
720 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
730 IF(Z<3)|(Z>5) GOTO800
740 IF(X<4)|(X>27) GSB1200
750 IF X=0 P=T:Z=4 ELSE IF X=31 P=-T:Z=4
760 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB1300
770 IF Y>=22 Y=22:F=2200:Q=0:Z=6:G=0
800 '
810 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L
820 IF Z>0 LCV,W:?" ";
830 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B
840 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
900 '
920 G=(G+1)%4:IF(Y>17)&(Q>0) Z=5
930 IF Z=1 E=E+25:IF E=400 Z=3
940 IF Z=2 E=E-25:IF E=2800 Z=3
950 R=[40+Z*4+G]
960 IF(Z=6)&(G=3) Z=7:H=H-1
980 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
1000 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1600:GOTO600
1010 IF Z=7 BEEP30,20:WAIT30:GOTO1100
1020 M=N:IF [27]=1 GSB1400 ELSE IF [27]=2 GSB1500
1030 IF(Z>=3)&(Z<=5) E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
1040 IF E<0 E=0 ELSE IF E>3199 E=3100
1050 V=X:W=Y:X=E/100:Y=F/100
1060 'Main_End
1070 WAIT4:GOTO700
1100 '
1110 IF H=0 A=200:LC11,8:?"GAME OVER" ELSE A=150
1120 IF[20]<S [20]=S
1130 PLAY"T120O3B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1140 GSB1700:WAIT A:IF H=0 GOTO400
1150 GSB1800:COPY#A40,#940,32:GOTO500
1200 '
1210 A=0
1220 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
1230 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
1240 IF A=1 Z=4:T=75:IF X<4 P=T ELSE P=-T
1250 RTN
1300 '
1310 BEEP:Z=3:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
1320 IF T<200 T=T+[12+A]
1330 P=T*[4+A]:K=L:L=L^1
1340 RTN
1400 '
1410 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1420 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1430 RTN
1500 '
1510 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1520 N=(A-320)/12
1530 RTN
1600 '
1610 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1620 PLAY"T120O5C16O4B16O5C16F8C16R64O4A8R64A16G#16A16O5C8O4A16R64F8A16G16F16G8R64G16R64G8A#16A16G16O5C8O4A16F4"
1630 WAIT300:COPY#A00,#940,32:COPY#920+B*64,#940,32
1640 RTN
1700 '
1710 LC5,10:?"TODAYS HIGH SCORE ";[20]
1720 RTN
1800 '
1810 IF BTN(32) [27]=1 ELSE IF BTN() [27]=2 ELSE CONT
1820 RTN
2000 '2023/04/04
SAVE0
IchigoJam 用ゲームコントローラでの動作を確認
共立エレショップで販売している IchigoJam 用ゲームコントローラを去年12月に買いました。これは電子工作マガジン2021年冬号で紹介されていたもので、イチゴサーカスでの操作に対応しているパドルコントローラです。動作確認のためにこのキットを入手したのですが、電子工作の苦手な私はずっと手をつけずにいました。しかしこのたび、ようやく作って操作を確認しました。
このキットの作り方は、共立エレショップのブログで丁寧に紹介されていたので私でも迷わずに作ることができました。
完成したコントローラで操作している様子がこちらです。
無事に動作が確認できました。そしてこの操作しているイチゴサーカスはすでにキャラのアニメーションを追加しているバージョンです。キャラがちっちゃくて、わかりづらいですけど・・・。やはりちゃんとしたコントローラで遊ぶと快適です。ただ、このキットはボタンとつまみの位置が自分的には左右逆の方が良かったなあと思いました。
「サーカス」のアニメーション
風船割りゲーム「サーカス」の魅力の1つは人がバタバタ動くことです。コマ数が少なくて決してきれいとは言えない動きですが、よく言えば味のあるおもしろい動きです。しかも私の人生において人型の物体が画面に出てきてアニメーションするのを 1 番最初に見たのがこのゲームなので思い入れがとても強いのです。なので IchigoJam 用「イチゴサーカス」にも人のアニメパターンを追加したいです。

Youtube に上がっている動画で確認したところ、これだけの絵がありました。目で見ただけなので正確かわかりませんが、まあ大体こんなものでしょう。左右、上下のフリップ機能があればもっと減りますけど。ちなみに、これは私が見ながらドットを打ったものなので絵も違う所があるかもしれません。
動きの種類には以下のものがありました。
1. ジャンプ台を歩く
![]()
ゲームのスタート時、人が台の上を歩いてきてジャンプします。2 パターンですごくぎこちない動きです。
2. 空中でバタバタ
![]()
空中で飛んでいる時に、左からこのパターンの順でバタバタします。
3. 空中で回転
![]()
壁や台にぶつかった時や、風船に何回か当たっている時などに回転します。細かい条件はわかりません。シーソーで跳ね返した時にも人が横向きになる時があります。回転中は手足の形はこのままでバタバタ動いてはいません。
4. 着地
![]()
落下してきて着地直前になると、両手を上げて両足をそろえた状態になります。シーソーに乗ると、両手を腰にまっすぐ立った状態になります。
5. ミス
![]()
シーソーに乗れなかった時は地面の上で倒れます。全体的に粗い動きなのに、ここで 3 パターンも使っているのはちょっとこだわりを感じます。このシーンはすごく残酷な印象があったのですが、パターンが多くてゆっくり見せるからだということがわかりました。
以上の動きを「イチゴサーカス」に追加したいと思います。