プチコン3号入門講座

IF〜THEN〜による条件判断


ゲームは条件判断無しでは作れない



 どんなゲームであってもそこには大量の条件判断が行われています。  「プログラムが作れるようになるためには」ではプログラムの流れを書きましたが、ごく簡単な戦闘シーンであっても「プレイヤーの攻撃が敵に当たるかどうかを判断」「敵のHPが残っているかを判断」「敵の攻撃がプレイヤーに当たるかどうかを判断」「プレイヤーのHPが残っているかを判断」ということが必要になってきます。

 このような判断を行うのがIF命令です。つまりIF命令はゲーム作りの要といっても過言ではないでしょう。

 では、プレイヤーのHPが0の場合は「あなたはしにました」と表示するにはどうしたらよいでしょうか。
 ここでプレイヤーのHPが変数HPに入っているとした場合には次のようになります。

 IF HP==0 THEN PRINT "あなたはしにました"

 IF 条件式 THEN 処理と記述することで、IFの次に記述されている条件が成立しているときにTHEN以下を実行するのです。
 さて、ここで見慣れないのが「==」という記号です。これは「HPと0が等しい」というのを意味しています。「=」が単体だと代入だったのでそれと区別しているのです。
 では、等しくない場合はどのように記述するかというと「!=」になります。

 IF HP!=0 THEN PRINT "あなたはいきのこっている"

 ただし、RPGにおいてHPから単純にダメージ量を差し引いたら負数になることがあるのでHPが0と等しいかどうかで判断すると「HP-5で生き残っている」なんていうこともあり得ます。
 そういうことのないようにHPやダメージ量が整数で表されているならば次のようにすると良いでしょう。

 IF HP<1 THEN PRINT "あなたはしにました"

 この場合はHPが1より小さければ「あなたはしにました」となるわけですが、1より小さい整数というと0か負数なのでちゃんと死んでいますね。
 ダメージやHPは小数で表しHPが0.0000001でも残っていれば生きていることにしたければ次のようになります。

 IF HP<=0 THEN PRINT "あなたはしにました"

 これならば、0もしくは負数のみ「あなたはしにました」となるためHPが0.0000001でも死んでいません(笑)
 THENの後にHP=0を入れておけば負数になった場合には「HP-5」みたいなHPが負数表示にならず、「HP0」と表示することもできます。

 これでIF命令における条件式の書き方「==」「!=」「>」「<」「>=」「<=」は分かったと思います。(「>=」を「=>」と書くことはできません)

 上記のようにIF命令は条件式が成立している時にTHEN以下を実行するのですが、プレイヤーが死亡したときの処理をラベル@DIE以下に記述している場合に次のようにすることができます。

 IF HP<1 THEN GOTO @DIE

 このようにTHENの後にGOTOのみが記述されている場合にはTHENGOTOのどちらかを省略することができます。

 IF HP<1 THEN @DIE 省略OK
 IF HP<1 GOTO @DIE 省略OK
 IF HP<1 @DIE 両方省略はNG

 実は、IF命令において「条件が成立している」か否かというのはすごく単純な仕組みで判断しているのですが、それはここでは省略するので詳しくは後述の「論理式で深まる条件判断」を読んでください。

 「プログラムを入力してみよう」で出てきた数当てゲームに使われているIF命令もここまで書いたことでその内容が理解できるようになっているでしょう。



IF NUM==COM THEN 〜
 NUM(プレイヤーが入力した数字)とCOM(コンピュータが考えた数字)が等しいならばTHEN以下を実行する
IF NUM!=COM THEN 〜
 NUM(プレイヤーが入力した数字)とCOM(コンピュータが考えた数字)が等しくないならばTHEN以下を実行する

 このプログラムを入力した最初は分からなかったかもしれませんが、今ならばバッチリ分かりますよね!
 こうやって、分かることを1つずつ増やしていけば良いのです。IF命令はゲーム等を作る場合に非常に多く使われますが、制作者側の判断ミスによるプログラムの誤動作も起きやすいため注意が必要となります。


条件が成立しないときはELSE以下を実行する



 さて、条件判断を行う際には条件が成立した場合の処理だけではなく成立しなかった時の処理も記述したい場合があります。
 HP<=0が成立していれば「あなたはしにました」と表示して成立してなければ「あなたはいきのこっている」と表示させたい場合は次のようにできます。

 IF HP<=0 THEN PRINT "あなたはしにました"
 IF HP>0 THEN PRINT "あなたはいきのこっている"

 HP<=0が成立していない時の処理を行うためにわざわざもう1つIF命令を使うのはあまり効率的とは言えませんね。
 そこで用意されているのがELSEです。
 IF 条件式 THEN 処理1 ELSE 処理2と記述することで条件式が成立時は処理1を実行して不成立時は処理2を実行可能なのです。

 IF HP<=0 THEN PRINT "あなたはしにました" ELSE PRINT "あなたはいきのこっている"

 これで少しすっきりしましたね。
 上記の数当てゲームも同じようにIF命令の部分はELSEを使って1行にまとめられそうですね。

 さて、できたでしょうか?(解答はこちら

 IFTHENELSEを使えばあらゆる条件判断が可能になります。
 例えば数当てゲームにおいてはプレイヤーが入力した数がCOMが考えた数よりも大きい場合は「おおきすぎます」、小さい場合は「ちいさすぎます」とヒントを与えるようにしたり、入力した回数をカウントしていって10回以内に正解できない場合はゲームオーバーにするという処理も可能になります。

 《 「大きすぎ」を判断 》
 IF NUM>COM THEN PRINT "おおきすぎます"
 《 「小さすぎ」を判断 》
 IF NUM<COM THEN PRINT "ちいさすぎます"

 自分が作りたいゲームのルールに沿って自由に判断をしても良いのでこの数当てゲームを自由に改造できるようになったら他のゲームを改造していっても良いかもしれません。
 ただし、どこに記述するかを考えないと記述したけどその行が実行されないという可能性があります。上記の「大きすぎ」「小さすぎ」の表示を行う際も7行目の「ざんねん」を表示の後に記述したら7行目のラストでGOTO @LOOPがあり7行目以降に記述した場合には実行されません。そのため7行目より前に記述するか、7行目のGOTO @LOOPを削除して「大きすぎ」「小さすぎ」の最後にGOTO @LOOPを追加するか、7行目ラストのGOTO @LOOPENDの前に持ってきて「せいかい」と表示される6行目のラストにENDを追加するなどの様々な方法によって条件を記述した行が実行されるように変更する必要があります。


条件が複数ある場合の記述方法



 IF命令を使った条件式の記述は非常に多用されるのですが、条件式というのは1つであるとは限りません。
 HP、MPのどちらかが0以下の場合に「あなたはしにました」と表示したければ下記のようになります。

 IF HP<=0 THEN PRINT "あなたはしにました"
 IF MP<=0 THEN PRINT "あなたはしにました"

 これも効率的とは言えないのですが、複数の条件式があってどれかが成立した場合にTHEN以下を実行させるようにするためにはORを使うと良いです。
 IF 条件式1 OR 条件式2 THEN 処理で条件式1、条件式2のどちらかが成立していれば片方が不成立であってもTHEN以下の処理を実行できるようになります。

 IF HP<=0 OR MP<=0 THEN PRINT "あなたはしにました"

 これで、少しすっきりしましたね。

 では、HPとMPの両方が0より大きい時に「あなたはいきのこっている」と表示したい場合はどうしたら良いでしょうか。複数の条件式があって条件式がすべて成立している場合にTHEN以下を実行させるようにするためにはANDを使うと良いです。
 IF 条件式1 AND 条件式2 THEN 処理で条件式1、条件式2の両方が成立しているときのみTHEN以下の処理を実行できるようになります。

 IF HP>0 AND MP>0 THEN PRINT "あなたはいきのこっている"

 これでHP>0MP>0の両方が成立したときにTHEN以下を実行できるようになりました。

 ゲームを作っていて変数の値が一定の範囲の時だけ処理を実行するという場面も少なくありません。例えば「変数Xの値が80以上、100未満の時のみ発生するイベント」がある場合はIF 80<=X<100 THEN 〜と書きたくなるかもしれませんがこれは正しい書き方ではなくエラーとなります。IF命令を使って一定の範囲内かどうかの判定を行いたい場合はIF X>=80 AND X<100 THEN 〜のようにANDを使って2つの条件を記述すれば良いです。X>=80X<100の両方を満たしているという条件は80≦X<100と同じになっているからです。

 実はANDORは後述のようにビット演算を行っているわけですが、少し難しくなるのでこのページではそれは省略します。(簡単な説明については後述の「IF命令におけるANDとORの使用上の注意」を参照)
 また、複数の条件を記述する場合には IF 条件式1 AND 条件式2 THEN 〜 ではなく IF 条件式1 && 条件式2 THEN 〜 と記述、 IF 条件式1 OR 条件式2 THEN 〜 ではなく IF 条件式1 || 条件式2 THEN 〜 と記述することができます。「AND&&の違い」「OR||の違い」は後述の「論理演算子 ||と&&で正しく条件判断」で詳しく説明しています。似たようなものが複数あるのでどちらを使ったら良いのか迷うという場合は自分が分かりやすい方を使えば良いだけです。


ENDIFを使った複数行での条件記述



 さて、上記の数当てゲームにおいて条件が成立した時と不成立の時をELSEを使って1行にまとめたら次のようになったと思います。

IF NUM==COM THEN PRINT "せいかい♥":BEEP 72 ELSE PRINT "ざんねん":BEEP 6:GOTO @LOOP

 これでも問題はないのですが、条件式や処理が複雑になるにつれて1行がどんどん長くなるため見た目で分かりやすいとは言い難くなってきます。
 そのため1つのIFを複数行に渡って記述することが可能です。

IF NUM==COM THEN  ENDIFを使った複数行記述を行う場合はTHENで改行を行う
    PRINT "せいかい♥":BEEP 72
  ELSE
    PRINT "ざんねん":BEEP 6:GOTO @LOOP
ENDIF


 このように複数行に渡ってインデントを行って記述すれば条件が成立した時の処理と不成立の処理が一目で分かるようになります。そして、IFの中にさらにIFがあるような複雑な条件判断も容易に記述が可能になります。
 ただし、このように複数行記述をする場合には最後にENDIFが必要になるため忘れないようにしましょう。


 ver.3.2.0からは新たにELSEIFという命令が加わりました。この命令を使えば複数行で記述したIFにおいてELSEの後にさらに複数行に記述したIFが続く場合にそのIFの終了時にENDIFを記述しなくても済み見た目がすっきりできるというメリットがあります。


 実はIFTHEN〜 にはさらに隠されたヒミツがあるのですがそれは後述の「論理式で深まる条件判断」で書いています。


RETURN (プチコン3号講座のページにもどる) RETURN *MAIN (トップページにもどる)

inserted by FC2 system