« 2.6 繰り返し(ループ) | メイン | 3.1 配列の操作(1) »

2.7 条件分岐

■条件分岐
条件分岐にはif、switchに加えて?:演算子を利用できます。条件分岐とは「50点以上なら合格、50点未満は追試」のように、ある条件の評価結果によって処理を分岐する機能です。条件式は結果がtrueまたはfalseになる式を論理演算子を使って作ります。または、変数やプロパティの値がBooleanデータ型になるものをそのまま利用することもできます。

■if
if文は指定の条件が満たされた時だけに実行したいスクリプトを{}で囲んだブロックにします。条件が満たされない場合は{}の中のスクリプトを実行せずにif文に続くスクリプトへと進みます。

書式:もし〜ならばAを実行
if (条件式) {
// 条件式の結果がtrueのときに実行したいスクリプトA
}

fig02-07-01 if文の流れ。

次のif文では、変数aの値が10以上ならばaの値を2で割ります。

例:
if (a>=10) {
	a = a/2 ;
}

if文を入れ子(ネスティング)にすることもできます。次のif文では、変数aの値が10以上で、かつ変数bの値が20以下のときにmyMCをラベル"q3"のフレームに移動します。

例:
if (a >= 10) {
	if (b <= 20) {
		myMC.gotoAndPlay("q3");
	}
}

このスクリプトは論理積の演算子&&を使って次のように書くこともできます。2つの条件を両方とも満たしているときにif文の{}の中のスクリプトが実行されます。

例:
if ((a >= 10) && (b <= 20)) {
	myMC.gotoAndPlay("q3");
}


■if..else..
if..elseを使えば、if文の条件が満たされたとき、満たされないときのそれぞれのケースで実行したいスクリプトを指定できます。

書式:もし〜ならばAを実行、でなければBを実行
if (条件式){
// 条件式の結果がtrueのときに実行したいスクリプトA
} else {
// 条件式の結果がfalseのときに実行したいスクリプトB
}

fig02-07-02 if..elseの流れ。

次のif文では、変数aの値が正ならばインスタンスのx座標に1を加算します(インスタンスは右へ移動)。正でないならば、つまり、0か負ならばx座標から1を引きます(インスタンスは左へ移動)。

例:
if (a>0) {
  myMC.x += 1;
} else {
  myMC.x -= 1;
}

■if..else if..
else ifは、if文の条件1が満たされないときには、別の条件2を満たしていないかどうかを重ねて評価したいときに使います。else ifのブロックを連結していけば条件を連続して評価していくことができます。先頭から条件式を評価し、途中で条件を満たす式に出会ったならば残りのelse ifは評価せずにifステートメントを抜けます。
なお、最後をelseブロックにすればどの条件も満たさなかったときに実行するスクリプトを設定できます。最後までelse ifならば、どの条件も満たさなければ何も実行しないままifステートメントを終了します。

書式:「もし〜ならばAを実行。でなければもし〜ならばBを実行。でなければ・・・・」 if (条件式1){
// 条件式1の結果がtrueのときに実行したいスクリプトA
} else if(条件式2){
// 条件式2の結果がtrueのときに実行したいスクリプトB
} else if(条件式3){
// 条件式3の結果がtrueのときに実行したいスクリプトC
・・・
} else {
// すべての条件が満たされないときに実行するスクリプトZ
}

fig02-07-03 if..else if..の流れ。

次のif文は、インスタンスのx座標がマイナスならば200にセットし、x座標が200以上ならば0にセットします。

例:
if (myMC.x < 0){
    myMC.x = 200;// 水平座標がマイナスならば200に移動
} else if (myMC.x > 200){
    myMC.x = 0;// 水平座標が200より右ならば0に移動
}


■switch..case..
swith文は値に応じてスクリプトを分岐したい場合に便利な構造になっています。次の式の部分には変数やプロパティの参照式などが入ります。式の値が値1ならば、スクリプト1を実行し、値2ならばスクリプト2を実行します。用意した値1〜nではない値の場合にはdefaultの初期値スクリプトを実行します。

書式:式の値に応じたスクリプトを実行。該当する値がなければdefaultを実行
switch(式){
 case 値1:
   処理1;
   break;
 case 値2:
   処理2;
   break;
 case 値3:
   処理3;
   break;
 ...
 case 値n:
   処理n;
   break;
default:
   初期値スクリプト;
}

fig02-07-04 switchの流れ。

次のスクリプトでは、aの値が10ならばフレームq1へ移動、20ならフレームq2へ移動、それ以外の値ならばフレームq3へ移動します。

例:
switch (a) {
case 10 :
  myMC.gotoAndPlay("q1");
  break;
case 20 :
  myMC.gotoAndPlay("q2");
  break;
default :
  myMC.gotoAndPlay("q3");
}

用意したケースに当てはまらない場合にはdefaultで指定したステートメントを実行しますが、defaultの設定はなくても構いません。defaultを省略すると、用意したケースに当てはまらない場合には何も実行せずにswithブロックを抜けて次のステートメントへと移行します。

fig02-07-05 switchの流れ。defaultを設定しない場合。

ところで、各caseの最後でbreakを実行しないと、そのまま次のcaseの処理が続きます。このとき、値のチェックは行われずに処理部分だけが無条件で実行される点に注意が必要です。 これは本来ならば間違った処理となるわけですが、これをうまく利用すれば論理和の処理を行うことができます。たとえば、次のswitchでは変数aの値が5、7、9のいずれからならばアタリになります。

[:sample:] switch-1.fla

例:
var a:int = 7;
switch (a) {
	case 5 :
	case 7 :
	case 9 :
		trace("アタリ:5、7、9のどれかでした");
		break;
	default :
		trace("はずれです");
}

出力結果:
アタリ:5、7、9のどれかでした

途中のbreak後の処理がどうなっているのかを確認するには、次のスクリプトでテストできます。変数aの値が5のときは、「5です」、「5または7です」の2つが出力されます。

[:sample:] switch-2.fla

例:
var a:int = 5;
switch (a) {
	case 5 :
		trace("5です");
	case 7 :
		trace("5または7です");
		break;
	case 9 :
		trace("9です");
		break;
	default :
		trace("はずれです");
}

出力結果:
5です
5または7です

fig02-07-06 breakを実行しない場合には、続くケースの処理が無条件で実行されます。

また、caseで指定する値を式で書くことで複雑な条件設定も可能になります。次の場合は式の値がtrueになるケースが実行されます。つまり、変数aの値が7の場合は「5以上10未満」と出力されます。

[:sample:] switch-3.fla
例:
var a:int = 7;
switch (true) {
	case (a<5) :
		trace("5未満");
		break;
	case (a>=5 && a<=10) :
		trace("5以上10未満");
		break;
	case (a>10) :
		trace("10以上");
		break;
}

出力結果:
5以上10未満

■?:
?:は次のような書式をもった演算子で、条件式がtrueならば値1、条件式がfalseならば値2を返します。

書式:
条件式 ? 値1 : 値2;

たとえば、次の関数は変数usrの値がnullでなければusrの値を返し、nullの場合には"名無しさん"を返すスクリプトです。

例:
function getUsrName():String {
	var usrName:String = (usr != null) ? usr : "名無しさん";
	return usrName;
}

このスクリプトをif文を使って書くと次のようになります。

例:
function getUsrName():String {
	var usrName:String;
	if (usr != null) {
		usrName = usr;
	} else {
		usrName = "名無しさん";
	}
	return usrName;
}

?:を入れ子(ネスティング)で書くと複雑な条件分岐のスクリプトを作ることもできます。次の例は3個の?:が入れ子になっており、sizeによってXL、L、M、Sを選り分けています。ステートメント内での改行はスクリプトに影響しないので次のスクリプトのように書くと判読しやすくなります。

[:sample:] getLank-?.fla

例:
function getLank(size:int):String {
	var lank:String;
	lank =
	(size>90) ? "XL" :
	(size>70) ? "L" :
	(size>40) ? "M" :
	"S";
	return lank;
}
trace(getLank(35));
//出力:S
trace(getLank(54));
//出力:M
trace(getLank(78));
//出力:L
trace(getLank(95));
//出力:XL

このスクリプトをif..else ifを使って書くと次のようになります。

[:sample:] getLank-if.fla

例:
function getLank(size:int):String {
	var lank:String;
	if (size>90) {
		lank ="XL" ;
	} else if (size>70) {
		lank ="L";
	} else if (size>40) {
		lank ="M" ;
	} else {
		lank ="S";
	}
	return lank;
}

About

2007年5月28日 06:12に投稿されたエントリーのページです。

ひとつ前の投稿は「2.6 繰り返し(ループ)」です。

次の投稿は「3.1 配列の操作(1)」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。