パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

BASIC超基本(10語でシューティングゲームを作る) (一般/互換/QB)

最近は、いわゆる手つづき型BASICについての書籍も少なくなってきましたが、BASIC
の命令、関数については、それらの書籍を一読していただくとして、ここではたった10語で
シューティングゲームの基本骨格を作成してみたいとおもいます。
サンプルプログラムは潮田氏による N88互換BASIC for Win用ですが、QBasic他にも
容易にコンヴァートできます。もし、分からない点があれば、リンク集にBASIC入門のサイトも
いくつか掲載しましたので参照して下さい。

Sample Programは基本的にはLOCATE, PRINT, FOR .....NEXT, IF THEN, RND,
INKEY$, GOSUB, RETURN, GOTO, INPUT(ここではINPUT$) しか使っており
ません。とりあえず、この10語あればなんとかなります。いずれも、基本中の基本の命令、
関数ですね。

シューティングゲームの基本構造として、次のような構造をとっています。

         初期設定
           |
   |−> キー入力−−>自機移動、ミサイル発射処理
   |      |
   |   ミサイル移動(発射中の時)−−>当たり判定
   |       |
   |    敵移動−−>当たり判定
   |      |
   |−−−−−      


ゲーム自体は下のような単純なシューティングゲームです。

Sample Program(N88互換BASIC用)
プログラムリストの赤字の行は、下に解説をつけました。

10 width 80,20                         '10〜96行まで初期設定
20 cls:beep
30 print "KEY操作 1 左 2 右 3 ミサイル発射"
40 print "自機 <T> を操り 敵 = を撃つゲーム"
50 for i=0 to 40
60 locate i,5:print "-"
70 next
80 locate 19,5:print "-<T>-"
90 x=19: m=0:mx=0:my=0              'x、y 自機の座標  mx、my ミサイル座標
95 randomize(val(right$(time$,2)))         'ex,ey 敵座標 
96 ey=int(rnd(1)*10)+6:ex=5
100 gosub 200
                    '100〜130 メインルーチン
110 if m=1 then gosub 300  'm=0 ミサイル未発射。この時は300行(ミサイル移動ルーチン
                    'にはいかない m=1 ミサイル発射中は300行へ  
120 gosub 400
130 goto 100
200 b$=""                       '自機の移動、ミサイル発射
202 a$=inkey$
205 if a$<>"" then b$=a$:goto 202
210 if b$="1" and x>1 then x=x-1
215 if b$="2" and x<37 then x=x+1

220 if b$="3" and m=0 then mx=x+2:my=5:m=1:beep
230 locate x,5 :print"-<T>-"
240 return
300 locate mx,my:print " "              'ミサイル移動ルーチン
310 my=my+1
320 if mx=ex and my=ey then gosub 600: end   '当たり判定 
330 if my>15 then mx=0:my=0:m=0:return     '下までいったらミサイル終了。m=0に戻す
340 locate mx,my:print "V":return
400 locate ex,ey:print " "               '敵移動ルーチン          
410 ex=ex+1
420 if ex=mx and ey=my then gosub 600 :end   '当たり判定
430 if ex>39 then ex=0: ey=int(rnd(1)*10)+6    '端までいったら新座標
440 locate ex,ey:print"="
450 return
600 beep                          '当たりの時の処理
610 locate mx,my:color 4:print "*"
620 print "大当たり THE END": color 7
630 print "HIT ANY KEY"
640 a$=input$(1):return

 

95 randomize(val(right$(time$,2)))

RNDは乱数(1未満)を発生させますが、毎回同じ系列の乱数を発生させます。
乱数の系列をかえるには、RANDOMIZE(数値) を使う必要があります。
そこで、ここでは TIME$(時間の文字列関数) の右2文字(すなわち秒です)を取って、
VALで文字列を数値に変換してRANDOMIZEに渡しています。これで、0〜59まで
をRANDOMIZEに渡すことができます。ゲームを開始するタイミングで違った乱数の
系列を得ることができます。
RNDが毎回、同じ乱数系列を発生させることは、以下のプログラムを繰り返して確認して
みて下さい。毎回同じ乱数のパターンが表示されるはずです。
10 FOR I= TO 20
20 PRINT RND(1)
30 NEXT


96 ey=int(rnd(1)*10)+6:ex=5
RNDは1未満の乱数を発生させますので、RND*10は、0から10未満の実数になります。
これをINTで整数に直すと(INTは少数点切り捨てで整数にします)、INT(RND*10)で
0から9までの整数をランダムにつくることができます。敵の出現位置をランダムに決める時
などによく使う方法です。
ちなみに、サイコロ(1〜6のランダム)は、INT(RND*6)+1とすればよいわけです。

乱数(RND)に乱数についての解説がありますので、ここの説明では不足と思う方は参照して
下さい。

100 gosub 200
キー入力(自機移動)、敵移動、ミサイル移動などのそれぞれの処理はサブルーチン化して
メインルーチンからGOSUBで呼び出すのが、普通のやり方


200 b$=""                      
202 a$=inkey$
205 if a$<>"" then b$=a$:goto 202
押されたキーはキーバッファにためられていきます。キーを押しっぱなしにしていると、
キーのオートリピートが働いて、同じキーがどんどんバッファに溜まっていきます。
プログラムの処理がキーのオートリピートより遅いと、キーから手を放してもバッファに
キーが溜まったままなので、バッファのキーをINKEY$で拾って、いつまでも予期せぬ
動きをすることになります。
そこで、毎回キーバッファを空にして、その最後のキーだけを有効にさせるための工夫が
必要になります。それが、ここの部分です。バッファが空になるまで202行に戻して、からに
なったら、最後のキーだけを拾っていきます。

210 if b$="1" and x>1 then x=x-1
215 if b$="2" and x<37 then x=x+1

キー  1 が押された時、自機は左に移動するが、X>1 という条件をつけることにより、移動できるX座標の限界を 1 までにしている。
同じく、X<37という条件をつけることにより、移動できる右の範囲を37までに制限している。
分かりやすく書くなら
210 if b$="1" then x=x-1
220 if b$="2" then x=x+1
222 if x<1 then x=1
224 if x>37 then x=37
と言う風にしても同じ。

非常にシンプルなシューティングゲームの基本骨格となるプログラムです。後は、
ミサイル、敵の数を増やしたり、敵の動きのパターンを複雑にしたり、グラフィックに
凝ったりすれば、そこそこのものができるでしょう。
敵の数を増やしや動きに少し変化をもたせたプログラム例として、FM8KAME.BAS
(N88互換Basic for WIN用)などがおじさんの自作プログラムとしてあります。きたないコーディングですが、参考にしてみて下さい。
自作BASICプログラムのページへ

TOP PAGE >Basic活用研究目次