ゲームを組んでみた

  • 投稿日:
  • by
  • カテゴリ:

せっかく、遊べる環境が手に入ったのだから、自作のゲームでも組んでみようじゃないですか。何年振りかわかりませんが。

ゲーム電卓へのオマージュw(パクリともいう)、足し算インベーダーゲームです。

ゲーム電卓のは、右から迫ってくる数字を撃って、数字の合計が10の倍数になるとUFO(n)が出現するっていうルールだったのですが、まあ、画面がそれなりにあるのだから、画面を広く使いましょう。

28個のインベーダー(1~9までの乱数で選ばれた数字)が上から一定間隔で迫ってきます。画面下の自機を左右のカーソルキーで移動して、スペースキーでミサイルを発射してインベーダを撃ってください。数値がそのまま点数になります。撃ち落とした値の合計%10=0の時にUFOが発生します。UFOは画面の上の方を左から右へ移動していきますので、狙って撃ち落としてください。最初のうちは、画面の左右の両端だけが狙撃可能ポイントですので、右端で狙うのがいいでしょう。

なお、UFO出現中にもう一回合計%10=0になると、イチゴUFOが出現します。イチゴUFOはUFOより一段高いところを右から左へUFOの二倍の速度で移動していきます。UFOは50点、イチゴUFOは100点なので高得点のチャンスです。

なお、インベーダが最下段(自分のいるところ)まで到達したらゲームオーバーです。インベーダをすべて撃ち落とすと、降下速度が少しだけ早くなって、次の28個の数字が表れます。降下速度は、約2秒に一回で始まり、最大で約1秒に一回まで高速化します。

と、いうアレなので、高得点目指して頑張ってください。足して10になる計算が得意になるかもしれませんw

1 CLS:CLV:X=5:Y=20:T=120
2 CLT:FORC=0TO27:A=C/4+3:LC1+(C%4)*2+A%2,A:?RND(8)+1:NEXT:C=C+1 3 K=INKEY():D=(K=29)-(K=28)
4 LCV,2:?CHR$(0):LCQ,1:?CHR$(0):LCM,N:?CHR$(0)
5 IFK=32&&!NN=Y:M=X:BEEP
6 LCX,Y:?CHR$(0):X=X+D:IFX<0X=0ELSEIFX>9X=9
7 IFTICK()>TCLT:SCROLL2:IFSCR(1,Y)+SCR(2,Y)+SCR(3,Y)+SCR(4,Y)+SCR(5,Y)+SCR(6,Y)+SCR(7,Y)+SCR(8,Y)LC0,23:?"SCR:";S;LC1,10:?"GAME OVER":LC0,0:PLAY">AAA8AA8<C>B8BA8A+G8A":END
8 IFUU=U+1-8*(U=8):V=V+(U=8):U=U*(V<10):IFULCV,2:?CHR$(#F1)
9 IFWW=W+1-4*(W=4):Q=Q-(W=4):W=W*(Q>=0):IFWLCQ,1:?CHR$(#FF)
10 IFNN=N-1:F=SCR(M,N):IFF>48&&F<58BEEP:S=S+F-48:LCM,N:?CHR$(0):N=0:C=C-1:IF!CT=T-5*(T>60):GOTO2ELSEIFS%10=0IFUQ=!W*9+!!W*Q:W=!W+!!W*WELSEU=1:V=0
11 IFF=#F1ORF=#FFS=S+50+50*(F=#FF):LCM,N:?CHR$(0):U=U*(F=#FF):W=W*(F=#F1):N=0:PLAY"L32EDC"
12 F=0:LCX,Y:?CHR$(#F0):IFNLCM,N:?CHR$(#F2)
13 LC0,23:?"SCR:";S;:WAIT1:GOTO3

変数

  • A 面生成用
  • C カウンター(インベーダの数を保持)
  • D 自機変位量[-1,1]
  • F ミサイル衝突判定用
  • K キー入力
  • M ミサイルX座標
  • N ミサイルY座標(0でミサイルは未発射)
  • Q イチゴUFOX座標
  • S スコア
  • T 降下タイミング
  • U UFO出現フラグ兼移動タイミングカウンタ
  • V UFOX座標
  • W イチゴUFO出現フラグ兼移動タイミングカウンタ
  • X 自機X座標
  • Y 自機Y座標

配列は使ってません。当初は、個々のインベーダの位置を管理してもっと複雑な動きをさせようと考えていたのですが、インベーダを16くらいまで増やしたら、遅くてゲームにならなくなってしまったので断念。

移動はもう降りてくるだけにして、インベーダも生成したら管理はしないで、画面をそのままワークエリアにして、衝突や、占領の判定をしています。9行目が占領の判定なのですが、SCR(2,Y)~SCR(8,Y)のどれかが0でなければ占領されたと判定します。この判定期間は自機は表示していないので。また、自機やインベーダ、ミサイルを消すのは空白(CHR$(32))ではなくCHR$(0)を使っています。CLSするとこの値でVRAMは埋まりますし、SCR(x,Y)の判定がやりやすくなりますので。その分消す操作が?" "と比べて?CHR$(0)と4文字くらい長くなってしまっていますが。

インベーダの移動や衝突判定は、自機、ミサイル、UFOを消している間に、SCROLL2を発呼して行っています。スコア表示が最下行にあるのは、この時、自動的に画面外へ押しやられるので、消去の処理をさぼれるからです。その分、GAME OVERの時に再表示していたりするのですが。

移動をSCROLL2だけではなく、左右に動かして、から下げる、いわゆるインベーダー風に変えることもできるんじゃないかと思います。気が向いたらそういう改造をするかもしれません。

当初、UFO出現時には、敵がミサイルを撃ってくるということも考えていたのですが、とりあえず、今は実装していません。意外と現状でもゲーム性は高かった感があるので。

自機の移動は、一回一回キーを押す必要があります。この方がインベーダを狙いやすく、足し算をさせるというゲームの内容とも合致しているかと思いました。一度押し下げたら移動しっぱなしが好みの方は、3行目を

3 K=INKEY():IFKD=(K=29)-(K=28)

のように、キーの押し下げチェックIFKを追加するといいと思います。ただ、これやったら全然ゲームにならなかったので、考えモノですが。

他にもいろいろいじるところはあると思いますので、いじってみたい方はどうぞ。

※追記:記事書いてから、あちこち修正したので、1/30 13:40以前にご覧になった方はコードをもう一回確認してくだされ。特にMMLの<C>の部分が、HTMLのタグと誤認されてすっぽり表示から消えていた悲劇もあるので。GAME OVERの素敵wな音楽のためにも、MML注意でw

超重要(ミサイルの発射処理)が抜けてました。移しそこなってた。あからさまに抜けていた7行目がそれです。これも追記しました。