−第三回「変数と条件分岐」−

 第三回は、変数と条件分岐について説明します。プログラムを知っている方であれば説明するまでもないのですが、変数というのは、数字や文字列が入る「箱」のようなもので、その箱の中に数字を入れたり、取り出したり、数字の比較などをしたりできます。
 まあ、言葉で解説するよりも見た方が早いと思うので、以下のスクリプトを見てください。


>見る
*IF F(0)=1 LOOK2         ←2
 とりあえず見てみました。
*F(0)=1                ←1
*END

*LABEL LOOK2          ←3
 あなたは二回見ましたね。
*GOTO LOOK2B          ←4
*END

*LABEL LOOK2B
 アドベンチャーゲームでは二回見るのは基本ですね。

 

  1. 変数への代入と演算
     F(0)という名前の変数に1を代入しています。 F(0)というのは「整数を入れることの出来る箱のゼロ番目(パソコンでは一般的に数字はゼロから数えます)」をあらわします。BLACK DIAMONDでは、この、整数を入れられる箱のことを「フラグ変数」と呼びます。たとえば「*F(18)=25」は「フラグ変数の18番に25という数字を入れる」という風に読めます。フラグ変数は512個(F(0)〜F(511)まで)あり、ゲームを作る人が自由に使うことが出来ます。
     この例では、一回「見る」と入力されたときに「とりあえず見てみました」と表示され、F(0)に1を代入(数字を入れること)しています。これは、「一回見た」という事をF(0)に1を入れることであらわしているわけです(別にこの例であれば、代入するのは1ではなく100でも256でもなんでもいいんですが……それについては二番目の項目で解説します)。

     また、このフラグ変数に対して、様々な演算を行うことが出来ます。たとえば、

    *F(0)+=5

     とすると、0番のフラグ変数に5を加算できます。同様に「*F(0)-=3」だと、3を減算します。加減算だけでなく、四則演算がすべて可能です。

    *F(0)=1
    *F(0)+=3
    *F(0)*=2
    *F(0)-=4

     これは、(1+3)*2-4をあらわし、*F(0)には4が入ります。また、四則演算の他に論理演算も出来るので、プログラムを知っている方はBLACK DIAMONDの制作マニュアルを参照してください。

     また、フラグ変数にフラグ変数を代入することも可能です。たとえば、

    *F(0)=10
    *F(1)=F(0)
    *F(1)+=4

     とすると、まずF(0)に10が代入され、そのあとにF(1)にF(0)の値(つまり10)が代入され、さらにF(1)に4を加算しているので、F(1)は最終的に14になります。F(0)は10のままです。

     フラグ変数の他に、文字列変数とアイテム変数がありますが、一気に説明すると混乱しそうですので、今回はフラグ変数の説明だけにとどめておきます。よく仕組みを理解しておいてください。
     
  2. 条件分岐
     さて、フラグ変数などというものに数字を格納して、どんないいことがあるんだ?と思われた方もいるのではないでしょうか。もちろん、フラグ変数の中の数字は使われなければ意味がありません。この項目では、その使い方を解説します。この項目2は、

    *IF F(0)=1 LOOK2

     という記述になっていますが、これは「もし」「F(0)に入っている数字が1だったら」「ラベルLOOK2に飛べ」と、読めます。ここで耳慣れない「ラベル」というものが現れました。ラベルとは、スクリプト内での位置を示すもので、スクリプト中の項目3「*LABEL LOOK2」が、「ラベルLOOK2」に相当します。
     要は、この例ではF(0)の中身が1だったら「*IF F(0)=1 LOOK2」の次以降の行の処理は無視して、「*LABEL LOOK2」以降の行に処理を移せ、ということになるわけです。そのため、F(0)が1の場合は「とりあえず見てみました。」とは表示されず、「*LABEL LOOK2」以降の「あなたは二回見ましたね。」が表示されます。当然、F(0)が1以外の場合は「とりあえず見てみました。」と表示され、その次の行の「*F(0)=1」(F(0)に1を入れる)が処理されてから「*END」でスクリプトの解釈が終了するため、次に「見る」としたときには、この「*IF F(0)=1 LOOK2」の条件が成り立ち、「あなたは二回見ましたね。」が表示されます(よくわからない場合は、上から一行ずつ解釈しながら何度かスクリプトを読んでみてください)。

     また、この例では項目1の部分を「*F(0)=150」とし、項目2の部分を「*IF F(0)=150 LOOK2」とすれば、結果的には同じ動きになります。つまり、変数の中身の数字の意味づけは制作者が自由に行うわけです(通常は、脈絡のない150などという数字よりは、「1回見た」ということを表すために1を入れておくべきでしょう)。

     このIF文では、数字の一致の他に、不一致や大きいとき、小さいときなどの条件判断が出来ます。たとえば

    *IF F(3)>10 OVER10

     の場合、F(3)の中の数字が10より大きければラベルOVER10に飛びます。また、数字の部分(「10」の部分)を変数にすることも出来ます(変数と変数の比較ですね)。このほかにどんな条件判断が出来るのかについては、BLACK DIAMONDの制作マニュアルを参照してください。

     ちなみに、条件分岐の部分(「F(3)>10」など)にはスペースなどを入れないようにしてください。マトモに判断しなくなります(手抜きです)。
     
  3. ラベル
    「*LABEL ラベル名」という書式で、ラベルを宣言できます。スクリプトの解釈中にこの文を見つけても、特に何もしません。条件分岐、または分岐によってこの行以降にスクリプトの処理を移すことが出来ます。

     また、以前紹介した「*SCENE シーン名」の「シーン名」も自動的にラベルとして登録されるため、分岐先のラベル名としてシーン名を書くことで、シーンへの分岐が可能です。
     
  4. 分岐
     「*GOTO ラベル名」とすると、強制的に「ラベル名」で示されたラベルに分岐します。つまりこの例ではF(0)が1の時に「あなたは二回見ましたね。」と出たあとに、このGOTO文によりラベル「LOOK2B」に処理が移り、続いて「アドベンチャーゲームでは二回見るのは基本ですね。」と、表示されるわけです。

     上記太文字で解説したように「*GOTO シーン名」でも分岐可能ですので、シーンを移るときなどに、この命令を多用することになるでしょう。

 以上、変数と条件分岐、そして普通の分岐について解説しました。この部分はBLACK DIAMONDで、もっともややこしい部分ですので、頑張って理解してください。この部分を乗り越えれば、あとは楽なもんです。
 このほか、文字列変数や、変数のアクロバティックな使用方法(IFを使わずに、GOTOと変数の代入だけで条件分岐する、など)については、講座の後半で解説します。

 ともあれ、これでほとんどのアドベンチャーゲームは作れるようになるはずです。最後に具体例を挙げておきましょう。


*SCENE SOTO
*IF F(14)=2 SOTO_KOUGEKI
*PICTURE mori
*END

*LABEL SOTO_KOUGEKI
*PICTURE morimoe
*SE kugeki
 すでに攻撃が始まったようです!
 

 フラグ変数14番は「森が燃えているかどうか」のフラグです。シーン「SOTO」が処理されたときにF(14)が2以外の場合は通常の森(mori)が表示され、F(14)が2の場合は、燃えている森(morimoe)が表示され、SEが鳴り「すでに攻撃が始まったようです!」というテキストが表示されます。
 このように、いくつもの変数を用意し、それぞれに制作者が意味を持たせて代入、演算、条件分岐で使用することで、複雑なゲームが作られているわけです。BLACK DIAMONDで制作したゲーム「宇宙」では、19個のフラグ変数によりゲームを処理しました。
 皆さんも変数と条件分岐を使いこなして、面白いゲームを作ってくださいね!

 bar10_white.gif

[前の講座][目次][次の講座]

Copyright 2001-2002 ONODA Production/Youjiro BLACK ONODA