(7)赤い円にぶつける

ゲーム性を加える

赤い円を3つぐらい乱数を使って位置を決めて描き、それに上手にぶつけるゲームに仕立てましょう。

赤い円の表示

毎回変化するように RANDOMIZE を最初に書きます。円を描くだけでなく、位置のデータを配列に保存しておきます。これはあとで衝突の判定に使います。

maru07.bas

SET WINDOW 0,500,0,500
RANDOMIZE
DIM px(3),py(3)
FOR i=1 TO 3
   LET  px(i)=RND*500
   LET  py(i)=RND*500    !位置をランダムに決める
   SET AREA COLOR 4      !色は赤
   DRAW disk WITH SCALE(10)*SHIFT(px(i),py(i))
NEXT I 

LET  x=50
LET  y=300
・・・・

このままでは青い円がぴったり合えば全部消えますが、近くを通るだけだと赤い円は欠けてゆきます。ぴったり合わせるのはかなり難しいのである程度近づいたら衝突とみなし、そうでないときは赤い円を描き直して、欠けないようにします。

衝突の判定

過去の青円を消したあとで、衝突の判定をし、衝突したら赤円を消し、しなかったら青円を消したことで欠けてしまったかもしれない赤円を描きなおします。3つありますから3回繰り返します。消した円は記憶しておいて次からは描かないというやり方の代わりにウインドウの外の座標を与えておいて見えないところに描くことにしています。判定に時間がかかるかもしれないということと、赤円を描かなくてもよくなることで青円の動きがだんだん速くなってしまうかもしれないと考えたからです。

maru07.bas

   SET DRAW MODE HIDDEN 
   SET AREA COLOR 0
   DRAW disk WITH SCALE(10)*SHIFT(ox,oy)            !過去の青円を消す
   FOR i=1 TO 3
      IF ABS(x-px(i))+ABS(y-py(i)) <5 THEN       !衝突したら
         SET AREA COLOR 0                            !色は白
         DRAW disk WITH SCALE(10)*SHIFT(px(i),py(i))  !赤円を消す
         LET  px(i)= -10                              !消した赤円の位置を
         LET  py(i)= -10                              ! ウインドウの外にする。
         LET  clct = clct + 1                         !消した数を記憶して
         IF clct=3 THEN EXIT DO                       !全部消えたらおしまい
      ELSE                                          !衝突しない場合は
         SET AREA COLOR 4                             !色を赤にして
         DRAW disk WITH SCALE(10)*SHIFT(px(i),py(i))  !円を書き直す。
      END IF
   NEXT I 

衝突判定はいろいろ考えられますが、今回は手抜きをしています。

スコア

いかに上手に消せたかということを評価しなければなりません。時間をはかる方法も考えられますが、ここはキーを押した回数を数えることにします。あるいは、壁に衝突させた回数も加えると難易度はまします。

LOOPを抜けたところにつぎのようにしておきます。

....
LOOP
SET AREA COLOR 3                      !色は緑で
DRAW disk WITH SCALE(10)*SHIFT(x,y)   !円を描き
PLOT TEXT ,AT x,y : str$(kyct)    !その横にキーを押した回数を書きます。
SET DRAW MODE EXPLICIT                !LOOPを抜けてすぐは SET DRAW MODE HIDDEN
                                      ! になっているので これが必要です。
END

もちろん適切な場所に、kyct を増やす命令が必要です。初期化(kyct=0)もあったほうがいいでしょう。ついでにclct=0も加えておきましょう。

どこに入れるかは考えてください。

maru07.bas

最初の方に
LET kyct=0
LET clct=0

キーを押した後に
LET kyct=kyct+1

ごほうび

達成感がでるような画面を加えたり高得点(この場合は数が少ないほうがいいのだが)を出したときに名前を入れられるようにすればさらに完成度があがりますが、今回はここまで。


聖愛高等学校
http://www.seiai.ed.jp/