[前へ] [目次へ] [次へ]

はいと言うまで進まないイベントを作ってみる

今回は「選択肢が出るが、はいと言うまで進まないイベント」を作ってみます。


●ループの処理
   ループはプログラム中の一部分を「条件が成立している限り」繰り返す処理です。
   ちなみにこの条件が「常に成立し続けて終わらない」ものが「無限ループ」です。
   
   単純な「ループ」は以下のように書きます。
<  1>
<  2>
<  3>
while(条件式){
   
//条件が満たされている限り、繰り返す処理
   この構文は { } で「条件が満たされている限り、繰り返す処理」の範囲を指定します。
   この { } のペアを「ブロック」と呼び、この対応は必ず一致させる必要があります。

   「条件分岐」の時とほぼ、同じです。
   というより、「条件が満たされてブロックの中を実行した後、条件式判定に戻る」ことと、
   「ループ制御命令が使える」ということ以外、何も違いません。
   なお、「条件式」が最初から成立していなければブロックの中は一切実行されません。
   また、「条件式」に何も書かない場合、「常に成立」として扱われ無限ループします。

   前述の通り、無限ループは簡単に作れるのですが、本当に無限ループするのは困ります。
   そこでループ処理の中ではループの動作を制御するための命令が使用できるようになっています。
   その命令には「脱出」「継続」「再試行」の3種類があるのですが、
   「継続」と「再試行」は単純なループでは同じ動作になるため今は「脱出」「再試行」のみ説明します。
   
   
●ループの「脱出」
   「脱出」とは、実行した時点でループの対象ブロックを離脱し、
   ループの終了時点から実行を再開する処理です。
   「脱出」した後のループの対象ブロック内の処理は実行されません。
   ループの「条件式」を空欄にした場合は、
   必ず「脱出」が実行されるようにしておかないと本当に無限ループに陥ります。
   
   ループの「脱出」を行うためには、 switch でも使用した break 文を実行します。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
while(){
   
   
//メッセージの表示(待機,消去する) (表示内容)
   
ECL::WaitLastMessage(
      
"やぁ。");
   
   
break;
   
   
//メッセージの表示(待機,消去する) (表示内容)
   
ECL::WaitLastMessage(
      
"これは表示されないよ。");
   
   このスクリプトでは「条件式」を空欄にしているため、無限ループになっています。
   しかし、途中に break があるため、実際には「やぁ。」とだけ表示して先に進みます。
   break が実行されると即座にループの終了地点に実行位置が移動するので、
   「これは表示されないよ。」というメッセージは表示されません。


●ループの「再試行」
   「再試行」とは、実行した時点でループの対象ブロックの処理を中止し、
   ループの「条件式」の時点から処理を再開します。
   この時、「条件式」が成立しなかった場合はループは終了します。
   また、処理を中止してもそれまでに実行した処理がなかったことになるわけではありません。
   
   ループの「再試行」を行うためには、 retry 文を実行します。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
Integer n=0;
while(n<5){
   
   n++;
   
   
//メッセージの表示(待機,消去する) (表示内容)
   
ECL::WaitLastMessage(
         
"やぁ。(@d回目)",n);
   
   
retry;
   
   
//メッセージの表示(待機,消去する) (表示内容)
   
ECL::WaitLastMessage(
         
"これは表示されないよ。");
   
   このスクリプトでは「条件式」は n<5 となっているので、
   n が5以上の時に「条件式」を判定するとループが終了されます。
   ループの中で n を増やしているので、ループする度に n が増加していきます。
   先ほどと同様に、 retry が実行されると即座にループの条件式判定に実行位置が移動するので、
   「これは表示されないよ。」というメッセージは表示されません。


●本題のイベントを作成する
   それでは「選択肢が出るが、はいと言うまで進まないイベント」です。
   ここまでで解説してきた内容だけでできるので、
   ここから先を読む前に一度自分で考えてみるとより身につきやすいかと思います。
   
   
   いかがでしょうか?
   それではサクッと答えに行きます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
Integer selectid;
while(){
   
   
//メッセージの表示(待機,消去しない) (表示内容)
   
ECL::WaitMessage(
      
"「はい」と言ってよ。");
   
   
//選択肢で選択させる (初期カーソル,選択肢0,選択肢1,...)
   
selectid=ECL::WaitSelect(0,
      
"はい",
      
"いいえ");
   
if(selectid==0){
      
break;
   }
   
   
//メッセージの表示(待機,消去しない) (表示内容)
   
ECL::WaitMessage(
      
"そんな答えは聞いてないよ?");
   
}

//メッセージの表示(待機,消去する) (表示内容)
ECL::WaitLastMessage(
   
"OK!"); 
   こんな感じになります。
   基本は無限ループとして構成しておき、「はい」と答えたら( selectid が0になったら)終わるようにしておきます。
   「はい」以外、つまり「いいえ」と「キャンセル」の場合は続く条件分岐が成立しないため、
   ループの脱出が行われず、「そんな答えは聞いてないよ?」が表示され、
   ループしてまた「「はい」と言ってよ。」が表示されます。




[前へ] [目次へ] [次へ]

最終更新 2017/07/11