while文による繰り返しの条件とは別に、特別な事情で繰り返しを途中で抜けたい場合にはbreak文が使える。例えば、6が出るまでに何回サイコロを振ったかを数えたいのだが、1が出たらその時点でゲームオーバーにしたい、といった場合がこれに当たる。
以下にプログラムの例を示そう。
var count: number = 0;
var d: number;
while ((d = dice()) != 6) { // (1)
if (d == 1) { // (2)
alert("NGな目が出ました");
break; // 1が出たらその時点でおしまい(3)
}
count++;
}
alert(count);
window.close();
function dice(): number {
return Math.floor(Math.random() * 6) + 1;
}
このプログラムでは、サイコロの目が1であるかどうかをwhile文の中で判定する必要があるので、(1)で変数dにdice関数の値を代入している。(2)は変数dが1かどうかを調べるためのif文で、条件を満たしたときにはalert文でメッセージを表示してbreak文で繰り返し処理を抜ける。
プログラムを実行して、6が出る前に1が出た場合は以下のような表示になる。この場合は、1以外の目が2回出て、1が出たことになる。
以下に、break文が書かれている場合のフローチャートを示しておこう。
break文のように繰り返しを完全に抜けてしまうのではなく、その時点で後ろの処理を実行せずに次の繰り返しに移るにはcontinue文を使う。例えば、6が出るまでに何回サイコロを振ったかを数えたいのだが、同じ目が連続して出た場合は1回と数える、といった場合にcontinue文を使うとよい。
プログラムを先に見ておこう。
var count: number = 0;
var d: number;
var prev: number = 0; // 最初はあり得ない値
var dup: number = 0; // 重複した回数
while ((d = dice()) != 6) {
if (prev == d) { // (1)
dup++; // (2)
continue; // 前回と同じなら数えない(3)
}
count++; // (4)
prev = d; // 今回の値を保持しておく(5)
}
alert(count + ":" + dup);
window.close();
function dice(): number {
return Math.floor(Math.random() * 6) + 1;
}
(1)では前回のサイコロの目と今回のサイコロの目が等しいかどうかを調べている。サイコロの目が等しいときは(2)で変数dupの値を増やしておく。この値は重複する目が出た数となる。そして、(3)のcontinue文を実行する。すると、(4)や(5)は実行されずに(サイコロを振った回数は増やされずに)、次の繰り返しに移る(次のサイコロを振る)。
前回の目と同じ目でない場合には(4)や(5)が実行されて、次の繰り返しに移る。(5)では、次回の目と比べられるように今回の値を変数prevに保持しておく。なお、変数prevには初期値として0が入れられている。これは最初にサイコロを振ったときにも(1)が実行されるからだ。0はサイコロの目としてはあり得ない値なので、最初は重複しない目が出たものと見なされる。
実行例は以下のようになる。この例では、6が出るまでになんと18回も他の目が出ている。4回は同じ目が連続しているので、実際にはサイコロは22回振られている。
処理が若干複雑なので、念のため図解しておこう。以下の例は、6が出るまでに4回サイコロを振って、同じ目が1回連続した場合の各変数の値の例である。
(1)で前回の目と今回の目を比較する。それらの値が異なれば変数countの値を増やし、(2)で今回の値を前回の値にしておく。基本的に(1)と(2)の繰り返しだが、前回の値と今回の値が同じだった場合、(3)のように変数dupの値を増やしてcontinue文を実行する(変数countの値は増えない)。
最後に、continue文が書かれている場合のフローチャートも示しておこう。
今回はTypeScriptの繰り返し処理のうち、while文、do ... while文を取り上げた。また、繰り返しを途中で抜けるbreak文や次の繰り返しに移るcontinue文についても見た。
次回は一定回数の繰り返し処理によく使われるfor文や、オブジェクトのプロパティの値を全て取り出すのに使われるfor ... in文について解説する。
Copyright© Digital Advantage Corp. All Rights Reserved.