サンプルプログラム7 (その2)

プログラマーからひとこと

前回は、キャラを動かす方法を重点的に学びました。
たぶん今のあなたなら、画面の中の主役キャラ(たとえそれが「г」とかだったとしても)を十字ボタンで上下左右に動かすのもカンタンなんじゃないでしょうか。
そう考えるとかなりレベルアップしたって気分になりませんか。

今回は、フラグの考えを中心に学んでいきます。
ゲーム用語で「フラグ」ということばを聞いたことはありませんか? あのフラグです。
これまたゲームプログラムらしいフンイキが出てきましたね。
これを読み終えたとき、あなたはまた一歩レベルアップすると言えるんじゃないでしょうか。
それを楽しみに読んでいきましょう。

弾を出してみよう

ワンパク
しかしプレイヤーキャラ1つ動かすだけでも、ケッコウ考えるコトが多いもんだぜ……。

神崎
ホントだね。でも、やり方がだいぶわかったから、次からは応用でうまくできるんじゃないかな?

インテリ
ちょうど応用になりそうなトコロがあるよ。画面タッチで出るショットのプログラムを作ってみようか。
0021#. @LOOP
0022#.  GOSUB @MYSHIP
0023#.  GOSUB @MYSHOT
0024#.  VSYNC(1)
0025#. GOTO @LOOP
これもサブルーチン@MYSHOT自弾マイ・ショット)として用意することにしたよ。

ワンパク
まずはフツウにサブルーチンをはじめるとして……
0040#. ’--- タマ
0041#. @MYSHOT
……オイちょっと待て、画面タッチってイガイとまだ考えたコトなかったぞ!

インテリ
それもそうだったね。
画面タッチにはシステム変数TCHSTを使うよ。
0042#. IF TCHST==TRUE THEN ???
TCHST==TRUEだとタッチされている、TCHST==FALSEだとタッチされてない、というイミさ。

神崎
TRUEは「アリ」、FALSEは「ナシ」だったね、そういえば。

博士
このシステム変数TCHSTという名前はタッチのジョウタイ、つまり「タッチ・ステータスTouch Status」のリャクじゃな。

ワンパク
どうもシステム変数ってヤツは、フツウの変数と見た目がイッショでワカりづらいぜェ……。

インテリ
たしかに一見、区別がないからねえ。システム変数の表を見てみると、全部でこれだけだから、丸暗記するのがイチバンなのかなあ。

博士
こればっかりは、しかたないかのう。システム変数はどれもなかなかベンリなモノなので、なれておくのもイイじゃろう。

神崎
話をもどすと、システム変数TCHSTでタッチされたかどうか調べるんだったよね。
0042#. IF TCHST==TRUE THEN VY=-1
あっ、これだとずっとタッチしていないとショットが動かなくなっちゃうか……。

ワンパク
プレイヤー機そのままのプログラムじゃダメってコトかよ……応用問題とか、オレのキライな話だぜ!

インテリ
プレイヤー機は「止まっている」「1文字ぶん動く」の2つだけでプログラムできたけど、ショットには3つのパターンが考えられるね。
A発射したタッチされてすぐプレイヤー機の上に出る
Bショット移動中発射されてから消えるまで1文字分ずつ上に上がる
C何もないショットが画面中にないスキップ

ワンパク
フーム……あいかわらずワカるような、ワカんねェような……。
とりあえず、一番カンタンなCの「何もない」だけ作るゼ!
0040#. ’--- タマ
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. ’---
0044#. @MSSKIP
0045#. RETURN
@MSSKIPってラベル名は、「ミサイルをスキップするMiSsile SKIP」ってコトだぜ。

神崎
ミサイルとかそういう英語はよく分かるんだね。それにしても、ホントにカンタンなトコだけ……。

博士
まあ分かるトコロはさっさとカタヅケるというのも、プログラム作りのテクニックのひとつじゃよ。
ツギにカンタンなのはAの「発射した」じゃが……

神崎
それって、こういうこと?
0040#. ’--- タマ
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MX=PX:MY=PY
0044#. MY=MY-1
0045#. LOCATE MX,MY:PRINT”・”
0046#. ’---
0047#. @MSSKIP
0048#. RETURN
とりあえずミサイルMissileの場所ってことで、43行目に変数MXMYを用意したよ!

インテリ
42行目のIF文で「タッチしていないとき」は@MSSKIPに行くことになってるから、43行目から先はかならず「タッチされているとき」になるね。
だから、ココから書いていくのはリクツに合ってるよ。

神崎
プレイヤー機の場所(PXPY)のすぐ上ってことは、ヨコ方向はMX=PXで、タテ方向はMY=PYにした後MY=MY-1でいいよね。

ワンパク
で、45行目でソコにショットの”・”を出してるワケだ。合ってるんじゃねェか?

神崎
うーん、でもコレだと何回でも撃てちゃうな。本当はショットが出てる間はもう撃てないはずなんだけど……。

博士
ウム、なにがマズいのかよくワカっておる。ダイジなことじゃぞい。
ショットは敵に当たって消えることもあるしのう。どうやって「A.発射した」と「B.ショット移動中」の区別をつけるかとカンガエると、ムズカシいのう?

インテリ
ここは、フラグを使いましょう。

ワンパク
ン? フラグ?


フラグを立ててみよう

博士
フラグというのははたのことじゃが、プログラム用語ではもっとトクシュなイミになるのじゃ。

神崎
ゲームでもときどき「フラグを立てる」って言い方をするよね。あれのこと?

インテリ
だいたい同じイミだよ。ジッサイに見てもらうのが早いかな。
まず変数をひとつ用意しておくね。ミサイル・ステータスMissile StatusMSTという名前にしておこう。
0043#. MST=1

ワンパク
スガスガしいほど、ナニをしたいのかワカらねえぜ!

インテリ
だと思ったから、ボクらにワカるルールを作っておこう。変数MSTのときは「ショットが画面上にある」、変数MSTのときは「ショットが画面から消えている」、ということにするよ。

ワンパク
自分ルールかよ。マスマスややこしいんじゃねェのか?

インテリ
これがフラグというものさ。もう少し進むと、わかってくるハズだよ。
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MST=1
0044#. MX=PX:MY=PY
0045#. MY=MY-1
0046#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0047#. LOCATE MX,MY:PRINT”・”
46行目にIF文を足して、ショットのタテ位置(変数MY)が3より小さくなったらMST=0にすることにしたよ。

神崎
画面の上の方まで行ったら、ショットが消えるからMST=0にするんだね。

ワンパク
ついでに@MSSKIPに行くのもナットクだぜ。画面の上までショットをPRINTしてもシカタねえもんな。

インテリ
ココから一気に書きたすよ。
0041#. @MYSHOT
0042#. IF MST==1 THEN @MSMOVE
0043#. IF TCHST==FALSE THEN @MSSKIP
0044#. MST=1
0045#. MX=PX:MY=PY
0046#. GOTO @MSMOVE2
0047#. ’---
0048#. @MSMOVE
0049#. LOCATE MX,MY:PRINT” ”
0050#. ’---
0051#. @MSMOVE2
0052#. MY=MY-1
0053#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0054#. LOCATE MX,MY:PRINT”・”
ラベルに使ったMOVEというのは「動く」というイミの「MOVEムーブ」だよ。

ワンパク
オイオイ、イキナリプログラムが増えすぎてついてけねェぞ!

インテリ
まずは、さっきの表をもういちど見てみよう。
A発射したタッチされてすぐプレイヤー機の上に出る
Bショット移動中発射されてから消えるまで1文字分ずつ上に上がる
C何もないショットが画面中にないスキップ
たとえば、フラグの変数MSTのときに、画面をタッチするとどうなるかな?

ワンパク
そりゃトウゼン「A.発射した」じゃねーか! ……ン? MSTのトキは、「B.ショット移動中」にはならねェな……そういえば。

インテリ
それがフラグのベンリなところだね。「変数MSTのときはショットが画面から消えている」というルールが決めてあるから、ぐっと区別がラクになっているんだ。

神崎
なるほどね。「A.発射した」のパターンだと、まず42行目と43行目のIF文でひっかからないから、そのままリストを下に進んで……ショットを発射するから、変数MSTにしてるんだ!

インテリ
そのあとプレイヤー機の上にショットを書いている方法は、もうわかるよね。あいだにGOTOをはさんでいるけど、やってるコトはほとんど今までと同じさ。

ワンパク
となるとモンダイは、「B.ショット移動中」のパターンか?

インテリ
それはフラグの変数MSTのとき、だよね。プログラムをなぞってごらん。

神崎
えぇと、42行目ですぐに@MSMOVEに飛んで、画面に書いてあるショットを” ”で消しちゃうのか。

ワンパク
そのままMY=MY-1して、PRINT”・”するから……ショットが上に上がるワケだな。ここはプレイヤー機を動かすヤリ方と似てるからワカる気がするぜ。

博士
だいたいフラグの使い方は見えてきたようじゃの。変数に入っている数字でジョウタイをチェックするのが、おおざっぱなフラグの考え方じゃ。
数字は自分ルールでかまわんが、イッパンテキにはだと「アリ」、だと「ナシ」で、フラグがになることを「フラグ(旗)が立つ」と言うのじゃな。

インテリ
遠くから土地を見て、旗が立っているかどうかでそこに何があるのかチェックする、というイメージなんだろうね。
ココを読んでるみんなはフラグについてワカったかな? 変数MSTのときとのときで、どう動きが変わるかチュウイして読み直してみるとわかりやすいよ!

ワンパク
ム……なんだかキョウイクテキすぎる言い方が気にいらねェが、ゲーム用語になってるくらいだし、ダイジなコトなのはタシカか……。

神崎
(その通りだけど、ゲーム用語かどうかがキジュンなのかなあ……)

インテリ
じゃあショットのプログラムができたことだし、ココまでのプログラムをまとめてセイリしておこうか。

プログラムリストを表示

メインループに入るより先に、13行目で変数を用意しておいたよ。

ワンパク
ン? じゃなくてFALSEなのか? 文字変数……ってワケじゃねェよな。

神崎
ホントだ。今までフラグに使っていた変数MSTにはゼンブじゃなくてTRUEFALSEが入っているよ。

インテリ
まとめるついでに、そこだけ変えてみたんだけど、わかるかな?
変数にFALSEと入れるとTRUEと入れるとのイミになるんだ。

神崎
……ん?

インテリ
たとえばMST=FALSEしたあとでPRINT MSTすると、ってなるんだけど……

ワンパク
オイ! それじゃハジメからMST=0って書けばいいじゃねェか!

博士
ふぉっふぉっふぉ。リクツで言えばそうかもしれんが、MST=FALSEと書いたほうがハッキリ「アリ」か「ナシ」かワカりやすいじゃろう?

ワンパク
また「アリTRUE」「ナシFALSE」のハナシかよ……。

博士
ビット演算のトキにも話したが、もともとコンピューターはON / OFFのアリ・ナシの組み合わせで作られたものじゃからな。このテのコトが多いのも、トウゼンなのじゃよ。

今回のまとめ

TCHST変数
システム変数TCHSTには、常に画面タッチされているかどうかの情報が入りつづけます。FALSE)ならタッチされていなく、TRUE)ならタッチされています。
A=TCHST
変数に画面タッチされたかどうかが数字で入ります。
IF TCHST==TRUE THEN (命令)
画面タッチされていれば、命令を実行します。
フラグを使うには
おおざっぱに言えば、自分ルールにしたがって決まった数を変数に入れるようにすれば、それがフラグです。
たとえばゲーム開始時に変数A=0として、「プレイヤーがカギを取ったら変数A=1にする」というルールを決めてプログラムしておけば、ドアの前でIF Aの結果によってドアを開くべきかどうかすぐにわかります。このとき変数になるのを「フラグが立つ」と言うこともあります。