JavaScriptは、ユーザーの入力があるまで待つことが出来ない。具体的に言うと、
please_dice();
document.write("サイコロの目は、<b>"+dice+"</b>だ。");
function please_dice() {
if (クリックまだ) {
setTimeout("please_dice()", 100);
サイコロの乱数取得;
サイコロの表示
} else {
dice = クリックで止めたサイコロの目;
}
実現して欲しい動作は、最初のplease_dice()を実行して、ユーザがサイコロをクリックで止めると次の処理に移る、というもの。 ところが、setTimeoutは、次行に処理を進めてから、第2引数のミリ秒後に第1引数の関数を実行する。つまり、setTimeoutでは止まってくれない。
setTimeoutの後の処理は、次に何をするかプログラム上でメモしておいてから、で解決か?
please_dice();
status = using_herb;
function please_dice() {
if (クリックまだ) {
setTimeout("please_dice()", 100);
サイコロの乱数取得;
サイコロの表示
} else {
dice = クリックで止めたサイコロの目;
document.write("サイコロの目は、<b>"+dice+"</b>だ。");
do_next(status);
}
function do_next(status) {
switch (status) {
case using_herb:
HP += dice;
document.write("体力が、<b>"+dice+"</b>回復した。");
break;
}
}
これなら、statusで次に何をするか覚えさせておいて、サイコロの目は何に使うのか分かる。この例では薬草を使うことしか書いてないけど、自分の武器攻撃や敵の攻撃とかにももちろんサイコロを使う。どの場合にもplease_dice()関数を使うので、その後の処理を明示しなくてはならない、ということかな。