◆◆ LAST UPDATE 2005.01.22

■ 第二十ニ夜 条件分岐について

[MXNovel INDEX] [戻る] [次へ]

■ 第二十ニ夜 条件分岐について

エムノベファンの皆様、こんばんは。 MTL研究室の桜花です。
今夜は「条件分岐」について、説明いたします♪

条件分岐とは、「ある条件を基に、処理分け」することをさします。

この講座でも、ちょこちょこ出てきているので、おおよそご理解いただいているとは思いますが、
今夜は、それを整理したいと思います。

参考ページ:
(■ 第二十夜 メニューについて  ■ 第二十一夜 変数について)

■ 単純分岐

  ある条件が成立した時に、指定ラベル位置に処理をジャンプするときに使います。

◆ 構文
if 変数 比較演算子 値 goto #ラベル名

比較演算子は、以下の記述が可能です。
■ 比較演算子
名称 演算子 意味
等価比較 == 変数==値 の場合 Aは、Bである
不等価比較 != 変数!=値 の場合 Aは、Bではない
以下比較 <= 変数<=値 の場合 Aは、B以下である
以上比較 >= 変数>=値 の場合 Aは、B以上である
小比較 変数<値 の場合 Aは、Bより小さい
大比較 変数>値 の場合 Aは、Bより大きい


※ 等価比較は「==」と2つの「=」を重ねます。(C言語ぽい)  
では、前夜のストーリーで考えてみます。

------------------------------------------------------------------------


dim KENJYU = 0  ;拳銃変数を未発見で定義。
dim SHIMON = 0  ;指紋変数を未発見で定義。

・
・
・
;
;捜査処理
;

#SOUSA

捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5

if KENJYU == 0 goto #SOUSA ; 拳銃は未発見であれば、#SOUSAに戻る。

#SHIMON

指紋検証処理1
指紋検証処理2
指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
指紋検証処理4
指紋検証処理5

if SHIMON == 0 goto #SHIMON ; 指紋が一致していなければ、#SHIMONに戻る。

逮捕処理1
逮捕処理2
逮捕処理3
逮捕処理4
逮捕処理5

・・・となります。
 
ある条件をクリアーしないと、ストーリーが進まない場合は、この単純分岐を使うことで対応できそうです。

■ if文に処理を閉じ込める単純分岐

単純分岐は、GOTO文を使った方法以外に、if文の中に処理を閉じ込めることもできます。
◆ 構文
if 変数 比較演算子 値 then

処理1
処理2
処理3
処理4
処理5

endif

↑の意味は、「変数と値を比較して成立したならば、処理1〜5を実行する。」です。
こちらも、前夜のストーリーで考えてみます。
------------------------------------------------------------------------



dim KENJYU = 0  ;拳銃変数を未発見で定義。
dim SHIMON = 0  ;指紋変数を未発見で定義。

・
・
・
;
;捜査処理
;

#SOUSA

捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5

if KENJYU == 1 then   ; 拳銃を発見した。

	指紋検証処理1
	指紋検証処理2
	指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
	指紋検証処理4
	指紋検証処理5

	if SHIMON == 1 then ; 指紋が一致した

		逮捕処理1
		逮捕処理2
		逮捕処理3
		逮捕処理4
		逮捕処理5
		end ; 逮捕して終了。エンディング

	endif

endif

goto #SOUSA

・・・となります。
GOTO文を使った、単純分岐と比較してみていかがですか?
GOTO文が少なくなったぶん、処理がわかりやなっていませんか?
 
※ 厳密にいうと、上の2つのスクリプトは、実行結果が異なります。(あくまで、一例として捕らえてください。)

■ 2分分岐

単純分岐だけでも、プログラムを作ることができますが、GOTO文を多用してしまう傾向があるため、どうしてもスクリプトが読みにくくなります。

2分分岐は、この欠点をほんの少し(気持ち分?)だけ、補ってくれます。

◆ 構文

if 変数 比較演算子 値 then

処理A1
処理A2
処理A3
処理A4
処理A5

else

処理B1
処理B2
処理B3
処理B4
処理B5

endif

↑の意味は、「変数と値を比較して成立したならば、処理A1〜A5を実行する。
不成立の場合は、処理B1〜B5を実行する。」です。

2分分岐の最大の利点は、成立しなかった場合の処理を指定することができることです。

こちらも、前夜のストーリーで考えてみます。
------------------------------------------------------------------------



dim KENJYU = 0  ;拳銃変数を未発見で定義。
dim SHIMON = 0  ;指紋変数を未発見で定義。

・
・
・
;
;捜査処理
;

#SOUSA

捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5

if KENJYU == 0 then   ; 拳銃を発見していない。

	goto #SOUSA

else
	指紋検証処理1
	指紋検証処理2
	指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
	指紋検証処理4
	指紋検証処理5

	if SHIMON == 1 then ; 指紋が一致した

		逮捕処理1
		逮捕処理2
		逮捕処理3
		逮捕処理4
		逮捕処理5
		end ; 逮捕して終了。エンディング
	endif

	goto #SOUSA

endif

前夜と今夜の講座は、プログラマぽい発想が多くなっていますが、ご理解いただけたでしょうか?
■ 2分分岐の入れ子について

エムノベ(Ver 0.05)では、最大で4階層まで、実装可能です。
if x == 1 then
   x == 1 の処理をする。
else 
	if x == 2 then 
		x == 2 の処理をする。
	else	
		if x == 3 then
			x == 3 の処理をする。
		else	
			if x == 4 then
				x == 4 の処理をする。
			else
				x == 1〜4ではない処理をする。
			endif
		endif
	endif
endif

このような記述もできますが、入れ子はプログラム構造を理解しづらくする場合があります。
場合によっては、単純分岐を使った方がよいこともあります。

プログラマの方なら、「switch case」文を使えばよいじゃないか?とご指摘がありそうですが、
エムノベ(Ver 0.05)では、「switch case」文はサポートしていません(笑)

ひょっとしたら・・・
サポートするかもしれませんが、今のところは考えていません。

■ 編集後記

今夜は、条件分岐について、説明いたしました。
ストーリーの分岐は、条件分岐を使うことで対応ができます。
さて、次夜ですが、スクリプトに関するエラーについて説明したいと思います。
では、今宵はこのあたりで・・・しーゆ♪



[MXNovel INDEX] [戻る] [次へ]
◆◆ LAST UPDATE 2005.01.22