初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

文系でもわかるBASIC入門

18.落下ゲームを作ってみよう その2

 

[ 落下ゲームを作ってみよう ] の続きです。

前回は、谷間の壁をテキストで表現する方法を学びました。
次は、プレイヤーが操作する落下物を作ってみましょう。

 

 

LOCATE命令を使おう

LOCATE命令は、テキスト画面のカーソルを任意の位置へ移動します。

次のプログラムを入力しましょう。(前回のプログラムは使いません)

locateを使ったプログラム

実行してみます。

locateで表示位置を指定している

LOCATEを使うことで、指定した位置にメッセージを表示しています。
PRINT命令に限らず、INPUT命令でも有効です。

ちなみに、画面左上の角が座標 0,0 です。

 

 

落下物を作ろう

次のサンプルを入力しましょう。

locateで画面をスクロールさせる

実行してみます。

locateで画面をスクロールさせる

このプログラムを止めるには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.時々、壁の中に「宝物」などの文字を埋め込む

他にも自分で課題を作ってチャレンジしてみましょう。