文系でもわかるBASIC入門
18.落下ゲームを作ってみよう その2
[ 落下ゲームを作ってみよう ] の続きです。
前回は、谷間の壁をテキストで表現する方法を学びました。
次は、プレイヤーが操作する落下物を作ってみましょう。
LOCATE命令を使おう
LOCATE命令は、テキスト画面のカーソルを任意の位置へ移動します。
次のプログラムを入力しましょう。(前回のプログラムは使いません)
実行してみます。
LOCATEを使うことで、指定した位置にメッセージを表示しています。
PRINT命令に限らず、INPUT命令でも有効です。
ちなみに、画面左上の角が座標 0,0 です。
落下物を作ろう
次のサンプルを入力しましょう。
実行してみます。
このプログラムを止めるにはESCキーを押します。
プログラムと実行画面を見て、何が起きているのか分かりますか?
ちょっと分かりにくいですね。
行番号130 では、座標 0,23 の位置に何も表示しないPRINT命令を書いてます。
でも表示していない訳ではなく、空白行を表示してます。
これまでの学習で経験していると思いますが、PRINT表示を続けていると画面がスクロールします。
新しいメッセージは画面の最下部に表示され、古いメッセージは上から消えていきます。
つまり、この行番号130 では、画面最下部(Y座標23)に空白行を表示することで
強制的に画面をスクロールさせているのです。
先ほどのプログラムを一度保存して、次のように変更してください。
実行すると、◆マークが左右に動くので
画面が強制スクロールしていることが分かると思います。
落下物を操作しよう
先ほど保存したプログラムを読み込み、次のように変更しましょう。
行番号150 以降が変更されてます。
実行してみます。
左右のカーソルキーで◆マークを動かせるようになりました。
左右のカーソルキーを何度が押してみましょう。
押したことに反応して◆マークは動きます。
次は、左右のカーソルキーのどちらかを押しっぱなしにしてみましょう。
一瞬、動きが止まることを確認できましたか?
INKEY$関数は、キーボードバッファの情報を読み取ります。
キーを押しっぱなしにした場合、押した瞬間と 0.5 秒後ぐらいにキーリピート機能が働いて押しているキーが連続してバッファに入ります。
つまり、キーを押しっぱなしにした時、一瞬動きが止まる現象が発生します。
このINKEY$関数の性能はゲームには向いてません。
アクション性が高いゲームであれば、一瞬動作が止まってしまうのは致命的です。
しかしこの講座では、他の適切な入力方法では難易度が高いため、
あえてこの方法で行います。
ASC関数でキャラクターコードを取得しよう
ASC関数について説明します。
ASC関数は、文字のキャラクターコードを取得できます。
キャラクターコードとは、コンピュータが認識できるコードのことで
1つの文字に対して1つのコードが割り当てられてます。
次のサンプルを入力しましょう。
実行したら何かキーを1つずつ押してみましょう。
y や左右のカーソルキーも押してみましょう。
INKEY$関数で文字を識別したいとき、行番号50 のように
任意の文字をそのまま指定すれば識別できます。
(これまで使ってきた方法です)
しかし、カーソルキーのように特殊なキーの場合、ASC関数を使って
キャラクターコードで識別する方法がいいでしょう。(行番号60、70)
プレイヤーと壁の処理
落下していくプレイヤー(◆マーク)と壁の処理を作ります。
注)行番号230 のループでスクロールの速さを調整してください。
実行します。
分かりにくいですが、下から上へスクロールしています。
行番号210 の LOCATE 0,23 は、先ほど説明した通り強制スクロールさせるためにあります。
変数Xは、プレイヤーのX座標位置の管理用
変数WXは、壁の空白部分の管理用
として使っています。
行番号220 で谷間の壁を作っています。
分からないときは [ 落下ゲームを作ってみよう ] を確認しましょう。
壁をランダムに変化させよう
谷間の壁がまっすぐだと、スクロールしているか分からないですね。
そもそもゲームになりません。
ランダム性を入れてみます。
行番号 210 から 230 までの3行を追加します。
そのほかの行番号に注意してプログラムを変更しましょう。
行番号210 のRND関数は、0以上1未満の数を発生します。
0.5が中間になるので、それより小さい時は変数PXに-1を、大きい時は+1を代入してます。
実行してみます。
壁がジグザグになりました。
少し壁っぽくなってスクロールも分かりますね。
壁にひと工夫いれよう
ランダム性を入れることで、見た目が壁らしくなりました。
しかしゲームとして遊んでみると簡単すぎます。
理由は左右の振り幅が狭いためです。
そこでひと工夫いれたいと思います。
行数を少なくするため、変数の初期化は行番号110にまとめました。
変更されている所は、行番号200 から 240 までの間です。
ここでは毎回発生させていた乱数を
5回に1回だけ発生させるようにしました。
実行してみます。
プレイしてみると「少し難しい」と感じますね。
連続して動く壁に対し、それに対応しなければならないからです。
乱数を使うとき(敵の動きなど)、少し制約を付けた方が良い場合がある
ということを覚えておいてください。
この続きは次回に行います。
なお、サンプルは改造することをオススメします。
(改造前にプログラムの保存をしましょう)
改造することで、プログラムに対する理解が深まります。
改造例
1.プレイヤーの移動を1回の入力で、もっと大きく動かす
2.左の壁と右の壁の空間を狭めたり、広げたりしてみる
3.時々、壁の中に「宝物」などの文字を埋め込む
他にも自分で課題を作ってチャレンジしてみましょう。