プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第14章 サンプルプログラム7 (その2)

パンくずリスト

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

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

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

弾を出してみよう

ワンパクくん

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

神崎

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

インテリくん

ちょうど応用になりそうなトコロがあるよ。Aボタンを押すと出るショットのプログラムを作ってみようか。

  1. @LOOP
  2.  GOSUB @MYSHIP
  3.  GOSUB @MYSHOT
  4.  VSYNC 1
  5. GOTO @LOOP

これもサブルーチン@MYSHOT(自弾)として用意することにしたよ。

神崎

まずはフツウにサブルーチンをはじめるとして……
Aボタンを押したときはBUTTON()命令が16になるんだったね。

  1. ’−−− たま
  2. @MYSHOT
  3. B=BUTTON()
  4. IF B AND 16 THEN VY=−1

あっ、これだとずっとボタンを押していないとショットが動かなくなっちゃうか……。

ワンパクくん

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

インテリくん

プレイヤー機は「止まっている」「1文字ぶん動く」の2つだけでプログラムできたけど、ショットには3つのパターンが考えられるね。

A発射したボタンが押されてされてすぐプレイヤー機の上に出る
Bショット移動中発射されてから消えるまで1文字分ずつ上に上がる
C何もないショットが画面中にないスキップ
ワンパクくん

フーム……あいかわらずワカるような、ワカんねェような……。
まずカンタンそうなCから作るとして……「Aボタンが押されていない」ときにスキップすればいいのか? でも、イマ書いたIFの条件は「Aボタンが押されている」とき、だったよな? どう書きかえればギャクにできるのかわかんねェ!

インテリくん

ビット演算のしくみを思い出して、よく考えてごらん。BUTTON()命令の数値をAND 16したケッカで「Aボタンが押されているか」の判定をしているけど、これを逆に「Aボタンが押されていないとき」はどうするかな?

神崎

Aボタンが押されていると、数字を2進数になおしたとき、「」どうしになる位(くらい)があるけど、

210101上(1)と左(4)とA(16)を押している
AND 160000A(16)を押しているか?
= 160000= 押していた

ボタンが押されていないときは、「」どうしになる位がひとつもないんだよね。

50101上(1)と左(4)が押している
AND 160000A(16)が押しているか?
= 00000= 押していなかった

この場合、ビット演算した答えはになるんだったっけ。

インテリくん

そのとおり! だから、このプログラムの場合、「B AND 16」がのときは「Aボタンが押されていない」、と判断すればいいんだね。

ワンパクくん

そうか、じゃあこうすりゃいいんだナ! カンタンなもんだぜ!

  1. IF B AND 16==0 THEN ???
インテリくん

それでいけるように見えるよね。 でもワナがあって、これではダメなんだ。
ワンパク君にしてはがんばったけどおしい!

ワンパクくん

なん……だと……?

インテリくん

そう書いてしまうと、プチコンは16==0の部分から見てしまって、正しく計算されないんだよ。
この場合は、(B AND 16)==0のように、カッコでかこってあげるとうまく動くよ。

ワンパクくん

なんだと! マッタクイミがわかんねェぜ!
そもそも「ワンパク君にしては」って、おもいっきり上からメセンじゃねーか!

ハカセ

たとえは、「3+4×2」という式を計算する場合、かけ算である「4×2」からまず計算するし、そうではなく「3+4」を「×2」したいなら「(3+4)×2」とするじゃろう。
おなじように、プチコンのAND==にも、どちらが先かという順番が決まっておるのじゃ。この2つどうしでは、==のほうが先じゃから、16==0から先に読んでしまうんじゃのう。この場合は、算数や数学と同じように、順番を先にしたい部分をカッコでかこえばよいのじゃ。

神崎

でも==って、数字どうしをくらべるけど、計算するための記号じゃないですよね……?

ハカセ

ジツは、==などの比較する記号も、比較したケッカはの数字になるのじゃ。これを使ってIFを使わないで自機を動かしたりもできるのじゃが……ショクンらにおしえるのはまだ早いかのう。

ワンパクくん

ウォー! そんなこと、言われないとワカンネェよ! ひでェハナシだぜ!
しかたねェ、じゃあこうすりゃいいんだナ!

  1. IF (B AND 16)==0 THEN ???

よし、とりあえず、一番カンタンなCの「何もない」だけ作るゼ!

  1. ’−−− たま
  2. @MYSHOT
  3. B=BUTTON()
  4. IF (B AND 16)==0 THEN @MSSKIP
  5. ’−−−
  6. @MSSKIP
  7. RETURN

@MSSKIPってラベル名は、「ミサイルをスキップする」ってコトだぜ。

神崎

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

ハカセ

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

神崎

それって、こういうこと?

  1. ’−−− たま
  2. @MYSHOT
  3. B=BUTTON()
  4. IF (B AND 16)==0 THEN @MSSKIP
  5. MX=PX:MY=PY
  6. MY=MY−1
  7. LOCATE MX,MY:PRINT ”│”
  8. ’−−−
  9. @MSSKIP
  10. RETURN

とりあえずミサイルの場所ってことで、42行目に変数MXMYを用意したよ!

インテリくん

41行目のIF文で「Aボタンを押していないとき」は@MSSKIPに行くことになってるから、42行目から先はかならず「Aボタンが押されているとき」になるね。
だから、ココから書いていくのはリクツに合ってるよ。

神崎

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

ワンパクくん

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

神崎

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

ハカセ

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

インテリくん

ここは、フラグを使いましょう。

ワンパクくん

ン? フラグ?

フラグを立ててみよう

ハカセ

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

神崎

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

インテリくん

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

  1. MST=1
ワンパクくん

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

インテリくん

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

ワンパクくん

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

インテリくん

これがフラグというものさ。もう少し進むと、わかってくるハズだよ。

  1. ’−−− たま
  2. @MYSHOT
  3. B=BUTTON()
  4. IF (B AND 16)==0 THEN @MSSKIP
  5. MST=1
  6. MX=PX:MY=PY
  7. MY=MY−1
  8. IF MY<3 THEN MST=0:GOTO @MSSKIP
  9. LOCATE MX,MY:PRINT ”│”

45行目にIF文を足して、ショットのタテ位置(変数MY)がより小さくなったらMST=0にすることにしたよ。

神崎

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

ワンパクくん

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

インテリくん

ココから一気に書きたすよ。

  1. ’−−− たま
  2. @MYSHOT
  3. B=BUTTON()
  4. IF MST==1 THEN @MSMOVE
  5. IF (B AND 16)==0 THEN @MSSKIP
  6. MST=1
  7. MX=PX:MY=PY
  8. GOTO @MSMOVE2
  9. ’−−−
  10. @MSMOVE
  11. LOCATE MX,MY:PRINT ” ”
  12. ’−−−
  13. @MSMOVE2
  14. MY=MY−1
  15. IF MY<3 THEN MST=0:GOTO @MSSKIP
  16. LOCATE MX,MY:PRINT ”│”

ラベルに使ったMOVEというのは「動く」というイミの「MOVE (ムーブ)」だよ。

ワンパクくん

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

インテリくん

まずは、さっきの表をもういちど見てみよう。

A発射したボタンが押されてされてすぐプレイヤー機の上に出る
Bショット移動中発射されてから消えるまで1文字分ずつ上に上がる
C何もないショットが画面中にないスキップ

たとえば、フラグの変数MSTのとき(自分ルールで「ショットが画面から消えている」)に、Aボタンを押すとどうなるかな?

ワンパクくん

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

インテリくん

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

神崎

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

インテリくん

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

ワンパクくん

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

インテリくん

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

神崎

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

ワンパクくん

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

ハカセ

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

インテリくん

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

ワンパクくん

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

神崎

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

インテリくん

じゃあショットのプログラムができたことだし、ココまでのプログラムをまとめてセイリしておこうか。
メインループに入るより先に、13行目で変数を用意しておいたよ。

+  プログラムリストを表示
ワンパクくん

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

神崎

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

インテリくん

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

神崎

……ん?

インテリくん

たとえばMST=FALSEと書いたあとにPRINT MSTすると、って出るんだけど……

ワンパクくん

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

ハカセ

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

ワンパクくん

また「アリ」「ナシ」のハナシかよ……。

ハカセ

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

今回のまとめ

演算子の計算順
算数でかけ算やわり算を先に計算するのとおなじように、プチコンの計算も順番が決まっています。ANDなどのビット演算や、==といった比較記号にも順番があります。先に計算させたい場合、算数とおなじように、その部分をカッコでかこいます。
ボタンが押されていないときの判定
  1. IF (BUTTON() AND 16)==0 THEN (命令)
ボタンが押されていないときの判定は、上記のようにおこないます。計算順のつごうで、カッコが必要なことに注意です。
フラグを使うとは
おおざっぱに言えば、自分ルールにしたがって決まった数を変数に入れるようにすれば、それがフラグです。
たとえばゲーム開始時に変数A=0として、「プレイヤーがカギを取ったら変数A=1にする」というルールを決めてプログラムしておけば、ドアの前でIF Aで調べるとドアを開くべきかどうかすぐにわかるようになります。このとき変数になるのを「フラグが立つ」と言うこともあります。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 1 人がこのサイトを見ています
  • このページはこれまでに 3898 回、本日は 1 回、昨日は 0 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.298 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:04 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30