« 配列を走査する(for~in) | メイン | 繰り返し(ループ) »

条件分岐

条件分岐や繰り返し処理など、複数行で1つのまとまった処理を行う構造をもったスクリプトがあります。スクリプトは基本的には上の行から順に実行されますが、条件に応じて実行する処理を選択することができます。

■if
if文は指定の条件が満たされた時だけに実行したいスクリプトを{}で囲んだブロックにします。条件式は、結果がtrue(正しい)かfalse(間違い)のどちらかの値になる式です。

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

図3-6-1 ifの流れ。

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

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

if文を入れ子にすることもできます。次のif文では、変数bの値が10~20のときにラベル"q3"のフレームに移動します。

if (b >= 10) {
if (b<=20) {
this.gotoAndPlay("q3");
}
}

このスクリプトは論理演算を使って次のように書くこともできます。

if ((b >= 10) && (b <= 20)) {
this.gotoAndPlay("q3");
}

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

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

図3-6-2 if~elseの流れ。

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

if (a>0) {
this._x += 1;
} else {
this._x -= 1;
}

■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
}

図3-6-3 if~else ifの流れ。

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

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

note:
条件演算子?:でもif~else ifと同じように条件によって処理する式を切り分けることができます。(?:→p.??)

■switch
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:
   初期値スクリプト;
}

図3-6-4 switchの流れ。

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

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

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

図3-6-5 switchの流れ。defaultを設定しない場合。

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

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

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

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

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


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

例:
a = 7;
switch (true) {
case (a<5) :
  trace("5未満");
  break;
case (a>=5 && a<=10) :
  trace("5以上10未満");
  break;
case (a>10) :
  trace("10以上");
  break;
}

投稿者 oshige : 2005年2月17日 11:28