広告
  サイト内検索:
<Let's create a game!> Introduction of programming for absolute beginners English
 

SESSION 13 その76
エラー処理を作る つづき
  エラー処理:アイテム

アイテムの
エラーチェックもしてるね。


鍵と爆弾を
アイテムフラグを使って
チェック
したんだな。

これで表示されて無い
アイテム番号を入力されても
大丈夫だな。
あーあ、
隠しアイテム
使えなく
なっちゃった。
うーん、残念。
アイテムを持ってなければ
対象リストに表示されて
ないはずでしょ。

なのに、
入力してくるってことは
おかしいもんね。
 

テキストアドベンチャーゲーム エラー処理
KottonCastleEscapeのKCEMain.java)331行目~
 
・・・      
331      /**  
332       * 結果処理モード  
333       */  
334      private static boolean execModeResult() {  
335         //***** 入力された対象コマンド別に実行処理と表示をする *****  
336      
337           boolean endingFlg = false;//エンディングフラグ  
338      
339         //部屋ごとの処理  
340         //***************  
341         //もし入口なら  
342         if (nowRoomNum == TAR_ROOM_ENTRANCE) {  
343            //行動コマンド選択別処理:保存しておいた値を使用  
344            //もし移動なら  
345            if (keepActNum == ACT_MOVE) {  
     
348            //もし見るなら  
349            } else if (keepActNum == ACT_LOOK) {  
                   
360            //もし使うなら  
361            } else if (keepActNum == ACT_USE) {  
362               //アイテム処理  
363               //暗証番号  
364               if (inputNum == TAR_USE_ITEM_CODE_5963  
365                     || inputNum == TAR_USE_ITEM_CODE_3156  
366                     || inputNum == TAR_USE_ITEM_CODE_3150) {  
367                  System.out.println("U-01:使えません。");  
368      
369               //鍵  
370               } else if (inputNum == TAR_USE_ITEM_KEY) {  
371                   if (itemKeyFlg) { 持ってる
場合、正常
372                       System.out.println("U-02:ドアの鍵穴には入らない。");  
373      
374                   } else { 持ってない
場合、異常
375                       System.out.println("無効なコマンド番号です:" + inputNum);  
376                   }  
377      
378               //爆弾  
379               } else if (inputNum == TAR_USE_ITEM_BOM) {  
380                   if (itemBomFlg ) { 持ってる
場合、正常
381                       System.out.println("U-03:爆弾でドアを吹き飛ばしました。");  
382                       System.out.println("脱出しました。エンディングへ");  
383      
384                       endingFlg  = true;//エンディング処理モードへ移行する  
385      
386                   } else { 持ってない
場合、異常
387                       System.out.println("無効なコマンド番号です:" + inputNum);  
388                   }  
389      
390               //それ以外なら  
391               } else {  
392                   System.out.println("無効なコマンド番号です:" + inputNum);  
393               }  
394            }  
395      
396         //***************  
397         //もし廊下なら  
398         } else if (nowRoomNum == TAR_ROOM_PASSAGE) {  
399            //行動コマンド選択別処理:保存しておいた値を使用  
400            //もし移動なら  
401            if (keepActNum == ACT_MOVE) {  
     
404            //もし見るなら  
405            } else if (keepActNum == ACT_LOOK) {  
     
420            //もし使うなら  
421            } else if (keepActNum == ACT_USE) {  
422               //行動コマンド選択別処理:保存しておいた値を使用  
423               //アイテム処理  
424               //暗証番号  
425               if (inputNum == TAR_USE_ITEM_CODE_5963  
426                     || inputNum == TAR_USE_ITEM_CODE_3156  
427                     || inputNum == TAR_USE_ITEM_CODE_3150) {  
428                  System.out.println("U-01:使えません。");  
429      
430               //鍵  
431               } else if (inputNum == TAR_USE_ITEM_KEY) {  
432                   if (itemKeyFlg) { 持ってる
場合、正常
433                       System.out.println("U-04:ここには鍵を使うものが無い。");  
434      
435                   } else { 持ってない
場合、異常
436                       System.out.println("無効なコマンド番号です:" + inputNum);  
437                   }  
438      
439               //爆弾  
440               } else if (inputNum == TAR_USE_ITEM_BOM) {  
441                   if (itemBomFlg ) { 持ってる
場合、正常
442                       System.out.println("U-05:爆発させても意味が無い。");  
443      
444                   } else { 持ってない
場合、異常
445                       System.out.println("無効なコマンド番号です:" + inputNum);  
446                   }  
447      
448               //それ以外なら  
449               } else {  
450                       System.out.println("無効なコマンド番号です:" + inputNum);  
451               }  
452            }  
453      
454         //***************  
455         //もし寝室なら  
456         } else if (nowRoomNum == TAR_ROOM_BED) {  
457            //行動コマンド選択別処理:保存しておいた値を使用  
458            //もし移動なら  
459            if (keepActNum == ACT_MOVE) {  
     
462            //もし見るなら  
463            } else if (keepActNum == ACT_LOOK) {         
     
500            //もし使うなら  
501            } else if (keepActNum == ACT_USE) {  
502                //アイテム処理  
503               //暗証番号(5963)  
504                if (inputNum == TAR_USE_ITEM_CODE_5963) {  
505                  //暗証番号:鍵を持っている場合のみ入力可能  
506                   if (itemKeyFlg) {  
507                     System.out.println("U-06:この番号じゃない。");  
508      
509                  } else {  
510                     System.out.println("U-09:鍵を持っていないと入力しても意味がありません。");  
511                  }  
512      
513               //暗証番号(3156)  
514               } else if (inputNum == TAR_USE_ITEM_CODE_3156) {  
515                  //暗証番号:鍵を持っている場合のみ入力可能  
516                  if (itemKeyFlg) {  
517                     System.out.println("U-07:<アイテム>:爆弾を手に入れました");  
518      
519                      itemBomFlg = true;//爆弾アイテムフラグを立てる  
520      
521                  } else {  
522                     System.out.println("U-09:鍵を持っていないと入力しても意味がありません。");  
523                  }  
524      
525               //暗証番号(3150)  
526               } else if (inputNum == TAR_USE_ITEM_CODE_3150) {  
527                  //暗証番号:鍵を持っている場合のみ入力可能  
528                  if (itemKeyFlg) {  
529                     System.out.println("U-08:この番号じゃない。");  
530      
531                  } else {  
532                     System.out.println("U-09:鍵を持っていないと入力しても意味がありません。");  
533                  }  
534      
535               //鍵  
536               } else if (inputNum == TAR_USE_ITEM_KEY) {  
537                  if (itemKeyFlg) { 持ってる
場合、正常
538                     System.out.println("U-10:金庫の鍵はこれでOKです。");  
539      
540                  } else { 持ってない
場合、異常
541                     System.out.println("無効なコマンド番号です:" + inputNum);  
542                  }  
543      
544               //爆弾  
545               } else if (inputNum == TAR_USE_ITEM_BOM) {  
546                  if (itemBomFlg ) { 持ってる
場合、正常
547                     System.out.println("U-11:ベッドを壊さないで下さい。");  
548      
549                  } else { 持ってない
場合、異常
550                     System.out.println("無効なコマンド番号です:" + inputNum);  
551                  }  
552      
553               //それ以外なら  
554               } else {  
555                  System.out.println("無効なコマンド番号です:" + inputNum);  
556               }  
557            }  
558         }  
559      
560           //共通の処理  
561           printWait();//待機表示処理  
562      
563           return endingFlg;//モード変更フラグを戻す  
564      }  
565      
・・・      
持ってないアイテムは対象処理モードで対象リストには表示されない。

表示されていないのに入力されるのは不正。エラー。


残念
じゃない
でしょ!
そうだった。。。

     

ここまでは
よくできました。

だが、残念だが、
1つひっかかったな。
えっ!?

あたし、何か
間違えてた??

どこどこ?
おほん
えー

どこだろう。



ほら、変数 keepActNumを
使ってる制御文に
エラー処理を付ける
って
言ってただろ。

でも実は、
今回は作らなくていいんだ。


まあ、初心者には難しい・・・

あれ?
初心者は
普通つけるよね。
えっと・・・
あたし
作ってないんだけど?

 

テキストアドベンチャーゲーム エラー処理
KottonCastleEscapeのKCEMain.java)201行目~
 
・・・        
201      
331      /**    
332       * 結果処理モード    
333       */    
334      private static boolean execModeResult() {    
335         //***** 入力された対象コマンド別に実行処理と表示をする *****    
336        
337           boolean endingFlg = false;//エンディングフラグ    
338        
339         //部屋ごとの処理    
340         //***************    
341         //もし入口なら    
342         if (nowRoomNum == TAR_ROOM_ENTRANCE) {    
343            //行動コマンド選択別処理:保存しておいた値を使用    
344            //もし移動なら    
345            if (keepActNum == ACT_MOVE) {    
       
348            //もし見るなら    
349            } else if (keepActNum == ACT_LOOK) {    
                     
360            //もし使うなら    
361            } else if (keepActNum == ACT_USE) {    
       
394            } その他が無い  
395        
396         //***************    
397         //もし廊下なら    
398         } else if (nowRoomNum == TAR_ROOM_PASSAGE) {    
399            //行動コマンド選択別処理:保存しておいた値を使用    
400            //もし移動なら    
401            if (keepActNum == ACT_MOVE) {    
       
404            //もし見るなら    
405            } else if (keepActNum == ACT_LOOK) {    
       
420            //もし使うなら    
421            } else if (keepActNum == ACT_USE) {    
       
452            } その他が無い  
453        
454         //***************    
455         //もし寝室なら    
456         } else if (nowRoomNum == TAR_ROOM_BED) {    
457            //行動コマンド選択別処理:保存しておいた値を使用    
458            //もし移動なら    
459            if (keepActNum == ACT_MOVE) {    
       
462            //もし見るなら    
463            } else if (keepActNum == ACT_LOOK) {           
       
500            //もし使うなら    
501            } else if (keepActNum == ACT_USE) {    
       
557            } その他が無い  
558         }    
559        
560           //共通の処理    
561           printWait();//待機表示処理    
562        
563           return endingFlg;//モード変更フラグを戻す    
564      }    
・・・        
変数 keepActNumはinputNumの値をコピーしてるので
「その他」を作って、エラー処理を付ける予定だった。

なのに、ことがエラー処理を作らなかったのはなぜ?


なんで?
なんで?

作り忘れ
ちゃったの
かな?
違うー。
作らなかったの!

もおー


ほら、よく考えてみると
inputNumの値はチェックを
してから、keepActNumに
コピーしてる
でしょ。

もしinputNumがエラーだったら
コピーしないで、前の行動処理
モードに戻しちゃってる。

つまり、
keepActNumには
正常な値しか入らない
って
ことだよね?

だから、
チェックは無くてもいい
んじゃ
ないかなって。

違うかな?
これでいいか
聞こうと
思ってたの。

やっぱり
処理の順番って
重要だね。
真っ白な解答
してたくせに。

さっぱりワカラン。
俺の考えと同じだし!

えーと、確かに
今回の場合はそれで大丈夫。
処理を作っても問題ないけど。

でも、なんで???

こんな事、普通初心者考えない
でしょ?全部作っちゃうでしょ?

俺だったら作っちゃってたよ?
 

テキストアドベンチャーゲーム エラー処理
KottonCastleEscapeのKCEMain.java)98行目~
 
・・・      
098                   //***************  
099                   //対象処理モード  
100                   case MODE_GAME_2_TAR:  
101                      //対象処理モード関数呼び出し  
102                      if(execModeTarget()){ 関数の中でinputNumの
チェックをしている
103                           //入力された行動コマンドを保存する  
104                           keepActNum = inputNum; 正常な場合
inputNumの値をコピー
105                           //結果処理モード(3階層目)に切り替える  
106                           nowMode = MODE_GAME_3_RES;  
107                       }else{  
108                           //エラーの場合、行動モード(1階層目)に戻す  
109                           nowMode = MODE_GAME_1_ACT; 異常な場合
コピーされない
110                       }  
111                        
112                      break;  
・・・      
対象処理モード関数でinputNumの処理が正常に終わった場合のみ
keepActNumに値のコピーをしている。
そのため、keepActNumに入る値は必ず正常な値になる。

つまり、keepActNumの値はチェックは不要。
(エラー処理を作っても使われないだけなので問題はない。)


えーと、
あなたは
利口ですか?
アホですか?
えーと、
褒めてますか?
けなしてますか?

なにこれ。



そ、そうね。おみごと。

でも、今回は違ったけど、
エラー処理は、
値がコピーされる部分に
注目するのも重要
だよ。

覚えておいてね。
処理の流れを
見よう。
やった、
褒められた!

最初の失敗、
ちょっと
挽回できたカナ?
はいっ!

値の流れを見るように
するんだね。


 
 

広告
home もくじ 前のページを読む 次のページを読む
  サイト内検索:
広告
お勧めの姉妹サイト
leafdays - リーフデイズ 超初心者のための園芸入門 - 楽しい趣味のガーデニング -
広告