いよいよ最終回を迎えました。
ゲームの仕上げにかかります。
ミス判定、ゲームオーバー、スコア処理、残ボール処理などなど、
やることいっぱい、ゆめいっぱい。
…本当に今回で完成するのかな?
※作成したプログラムは、ページ最後のリンクからダウンロードすることができます。
ご自由にお使いくださいませ。
今までは、モノを動かすためのアルゴリズムを実装してきました。
この章ではゲームルールの一部である、ミス判定やゲームオーバー、といった処理を組み込んでいきます。
まずはミス判定を作成します。
現在は周りを壁で囲っているため、ミスが発生しません。
ですので床部分を描画しないようにします。
と同時に、「ボールがパドルと同じY座標になったらミスにする」というプログラムを追加します。
床を書いているのは1125行ですので、この行を消します。
行の消し方は覚えていますか?そうです、消したい行番号を入力するだけです。
床の描画を消したので、パドルの位置を1つ下げます。
PYが22だったのを23に変更しました。
ミス判定を行い、「MISS!!」と一定時間表示して、再度ボール発射から始まるようにします。
こちらは簡単に解説しましょう。
2230行は、ミス判定をしています。
パドルとボールのY座標が同じだったら、ミス表示のプログラムに飛んでいます。
2240行と2250行は、今後のためにコメント行としてリザーブしてあります。
2260行はループの先頭に戻っています。
2400行も今後のため、コメント行としてリザーブしてあります。
2410行は「MISS!!」の表示なのはわかりますよね。
2420行は、「何もしないことを1000回繰り返す」=「単純に時間つぶし」=「一定時間待つ」という処理です。
回数を減らせば待ち時間が減ります。もちろん増やせば待ち時間が延びます。
その後、2430行で「MISS!!」の文字を消しています。
2440行は800行のサブルーチンをコールしていますが、何をしているのでしょうか?
LIST 800-820のサブルーチンは、一括してパドルとボールの表示を消しつつ、当たり判定も抹消しています。
つまりパドルの当たりを消しておかないと、次のボール発射時に前のパドルの当たりが残ってしまいます。
そして2450行でボール発射の先頭に戻しています。
実際に実行してみてください。
きちんとミス判定ができていることが確認できるはずです。
さて、ミス処理は完成しました。
次はゲームオーバーの処理……なんですが、先に残ボール数設定をしないとなりませんね。
LIST 900-940は、残ボール数を表示するサブルーチンです。
ホールは5つまで表示可能です。それ以上は、表示はされませんが、内部ではストックされています。
ゲームが起動したら残ボール数を設定します。
1020行でZAN=3と設定しました。
1190行で、初期描画のため、残ボール数表示サブルーチンを呼んでいます。
今回残ボール数は、発射したら減らすようにしました。つまりボールを使った、という感じです。
LIST 1580-1590はその処理で、1580行で残ボール数を減らしているんですが、
値がマイナスになっても0にするようリミットチェックを付けています。
そして1590行で、減った後の残ボール数表示のサブルーチンもコールしています。
続けてゲームオーバーの処理も追加してしまいます。
2400行に残ボール数が無かったら、ゲームオーバー処理へ飛ぶ判定を入れました。
2500行からゲームオーバーの処理なんですが、2540行になにやら見慣れない命令があります。
ERASE 配列変数名
この命令はすでに定義された配列変数を消去します。
リトライする場合、プログラムの先頭から開始するようにしてありますので、1020行にある
DIM MP(39,24)が実行されますが、すでに定義されている配列変数を、再度定義しようとすると
エラーになるため、いったん消去しています。
ということでこの章では、ミス処理、残ボール処理、ゲームオーバー処理と、3つの処理を組み込みました。
次の章では面クリア処理と点数計算処理を組み込みます。
この章ではスコア処理と、面クリア処理を作成します。
この2つが入れば、ゲームはほぼ完成です!
では早速プログラムを組んでいこうと思います。
…が、実はすでにちょろっとだけ組み込んであるんですよね。
スコア処理に必要な得点計算は、1020行のSC=0で初期化して、ゲーム中ではブロック抹消処理サブルーチン内にある
630行のSC=SC+10という部分で、ブロックをひとつ壊すと10点が加算されるようになっています。
残りの必要な処理は、表示する処理を追加するだけです。
そして、面クリア処理に必要な登録ブロックの総数をカウントするプログラムも、1200行のBC=0で初期化をし、
ブロックを配置する処理内の、1220行にあるBC=BC+1でブロック総数をカウントアップしており、
ゲーム中ではブロック抹消処理サブルーチン内にある630行のBC=BC-1でブロック総数をカウントダウンしています。
残りの必要な処理は、全ブロック破壊の判定と、面クリア演出処理です。
ということで、両方に必要な残りの処理を組み込んでしまいます。
解説しましょう。
ブロック破壊サブルーチン内にある630行でスコアが加算されているので、
GOSUB 950を入れて、スコア表示に反映しています。
LIST 950-960はスコア表示で、サブルーチン化してあります。
1190行に初期描画としてスコア表示を追加しました。
2240行は、登録ブロックが0個、つまりすべてのブロックを破壊したら、面クリアの演出処理に飛んでます。
LIST 2300-2390は、主に面クリアの演出処理を行っているのですが、細かく見てみましょう。
まずLIST 2310-2350は「CLEAR!」と一定時間表示を行うプログラムなんですが、2330行に新しい命令が2つ使われています。
RND(1)
これは、0以上1未満のランダムな少数値を生成します。つまり「0~0.999999」の値を返します。
INT(少数値)
これは、少数値を整数化します。つまり「2.345678」を与えたら「2」を返します。
ということで、2330行にあるCOLOR INT(RND(1)*6)+1は、1から6までの整数値をCOLOR文に与えてることになり、
つまりピカピカと文字がランダムでカラー変化するわけですね。
ちなみに2320行はピカピカの時間間隔を長くするためのウエイトです。
LIST 2360-2380は、「CLEAR!」の文字、パドル、ボールを消しています。
2390行は、ボールをいったん回収する意味で残ボール数を増やして、スコアやボール表示、
ブロック登録など、面を最初から開始する処理へと飛んでいます。
ルールの組み込みも終わって、ゲームとして一通り遊べるようになりました!
…でも、もう少しだけ体裁を整えて、完成度を上げたいと思います。
もうちょっとだけ続くんじゃよ。
この章ではゲームとしての体裁を整えます。
初見だとボールを打ち出す方法がわからないので、メッセージを出してあげましょう。
もちろん、ゲームだったらハイスコアも付けたいですよね。
さらに、クリアした面数表示があるとうれしいですよね。
そして、面クリアしたらボーナス得点もあると良いですよね。
ということで、全部ひっくるめてプログラムを追加しちゃいます。
ちょっとだけ解説します。
今まで1010行にあったDEFINT A-Zですが、100行の先頭に移動しました。
なぜかというとDEFINT A-Zをすると、変数の値が初期化されてしまうんですよね。
なので、100行にあるハイスコアを記録するHIや、レベル数を記録するLVの前に持ってきました。
2386行で、ボーナス得点の加算と、レベル数のアップを行っています。
表示の更新は、今まで通りの流れで行われますので、ここでは計算だけをしています。
2532行は、ハイスコアの更新処理です。
いかがでしょうか?
この章はさっくりと終わりましたが、その割りにけっこう完成度が上がったと思いませんか?
たかだか10数行足すだけでずいぶんと変わるものですよね。
次の章では総括をします。
いや~、みなさまお疲れ様でした。
全5回、実質制作をしていたのは4回のみで、完成に至ることができました。
今までゲームを作ったことがなかった方や、すでに何本もゲームを作ったことがある方も
楽しんでいただけたでしょうか?
さてさて、どのくらいの命令を使ったんでしょうか?
一覧してみると、
LOCATE、PRINT、WIDTH、CONSOLE、COLOR、
DEFINT、FOR~NEXT、GOTO、IF~THEN~ELSE、REM、
DIM、GOSUB~RETURN、INP、INKEY$、ON~GOTO、
ERASE、INT、RND、LIST、RUN と、
なんと全部で20種類もの命令を駆使して完成させたことになります。
意外と使っているもんですねw
なお、今回の作り方やアルゴリズムはあくまでも一例です。
他にもいろいろなアプローチの仕方があります。
自分独自の制作方法を編み出して、ゲーム作りを楽しんでいただけたら、と思います。
(私も久々にBASICでゲームを作って楽しかったです)
それでは、ここまでお付き合いくださり、ありがとうございました。m(_ _)m
またどこかでお会いしましょう~。(^-^)/シ
おぉ!またお会いしましたね。
心残りがありまして、参上しました。
一応完成の日の目を見たわけなんですが、ゲーム的にまったりしすぎて緊張感が無いんですよね。
ですので、エリアの真ん中あたりにお邪魔キャラを出現させて、ボール移動を阻もうと思います。
さらに面が進むとブロックが全体的に下がってくるというのも追加します。
まずは、追加する仕様をまとめてみます。
1)エリア中央にLEVELの倍数個のお邪魔ブロックを配置する。
2)お邪魔ブロックは一定時間が経つと増えてくる。
3)お邪魔ブロックはボールが当たると消えるが、得点にはならない。
4)ブロック全体は1キャラ単位で下がってきて、4面を一周期として最初に戻る。
そうすると、追加仕様用のプログラムは以下のようになりました。
あえてブログラムの中身は説明しませんので、自分なりに解釈してくださいね。(^-^;
というわけで、今度こそ終わりです。
またね~。
今回入力したプログラム(おまけ付き)をcmtファイルとしてここに置きます。
BLOCK5.cmt
入力してもうまく動かなかった場合にお使いください。
使い方は、ファイルをダウンロードして、パソコンミニPC-8001のシステムが入っている
microSDの /boot/PCM の下にコピーしてください。
システムを起動して F9->MEDIA にて、 BLOCK5.cmt を SET し、BASIC上で
CLOAD “BLOCK5
で、ロードできます。
INTは少数値を整数値に変換すると説明しましたが、同じような命令でFIXというのがあります。
FIXは整数部分を取得するのに対して、INTは値を超えない最大の整数値を取得します。
何を言っているかわからないかもしれませんが、例をあげましょう。
FIX(12.34)とINT(12.34)は、どちらも12を返します。
FIX(-56.78)とINT(-56.78)は、FIXが-56なのにたいして、INTは-57を返します。
値を超えない最大の整数値とはこういう意味です。
カッコ内の1もそういうものとして捉えてしまいましょう。
INT(RND(1)*X)で、0~(X-1)のランダムな整数値を取得します。
RNDは少数値を返すので、Xに少数値を掛けるというのは、X値を縮小しているわけですね。
つまりRNDで0.5が返ってきたら、Xは半分の値になるということです。
なお最大で返ってくるのは0.999999なので、Xまでの値にはなりません。
2320行では+1を後ろに付けていたので、起点が変わって(0+1)~(6-1+1)になり、
つまり1~6のランダムな整数値を取得していた、となります。