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

SESSION 13 その70
エラー処理を作る つづき
  ヒント1:今回のエラー処理の作り方

うーん。でも、今回は
if文やswitch文の分岐が
たくさんあるから・・・。

どこの分岐に「その他」を
書いたらいいのかな?

全部かな?
そうだな。
いっしょに
エラー処理の作り方を
考えてみよう。
ひどーい。

あたしに
言われても
平気なくせにー。
・・・ううっ。

いぢわるって
言われちゃった。


まず、エラー処理を書く場所。

今回は外部から入ってくる値、
キー入力値に注目
して探そう。

つまり
変数 inputNum に注目しよう。
これにキー入力値が入るからね。
不正な値が入るってことだ。

この変数を使っている処理は
キー入力値の影響を受ける。
なるほど・・・

そうか!
inputNumを使ってる分岐に
エラー処理が必要なんだね。

inputNumに変な数が
入ってたら、if文やswitch文は、
処理の流れが変わっちゃう
もんね。

こんなとこが必要かな?
全てのコードで
考えてみよう。
流れを
見るのね。
 

ことのイメージ
 
・・・      
230      /**  
231       * 対象処理モード  
232       */  
233      private static void execModeTarget() {  
234         //***** 入力された行動コマンドから対象コマンドを表示する *****  
235      
236         //対象コマンドの一覧を表示  
237         System.out.println("---------------------------------------------");  
238      
239         //部屋ごとの処理  
240         //***************  
241         //もし入口なら  
242         if (nowRoomNum == TAR_ROOM_ENTRANCE) {  
243            //もし移動なら  
244            if (inputNum == ACT_MOVE) {  
245               selectMove();//対象モード 移動表示処理  
246      
247            //もし見るなら  
248            } else if (inputNum == ACT_LOOK) {  
249               //全部の部屋共通の表示  
250               System.out.println("何を見る?");  
251                 
252               //対象コマンド表示(ドア)  
253               System.out.println(TAR_LOOK_ENTRANCE_DOOR + ":ドア");  
254                 
255            //もし使うなら  
256            } else if (inputNum == ACT_USE) {  
257               selectUse();//対象モード 使う表示処理  
258            } ここにelse
「その他」を
追加する
・・・      
変数 inputNumを使っている処理に注目する


はいっ、
なぽちゃん質問!

inputNumの値は
keepActNumにも
コピーして使ってるよね?

この変数を使ってる処理も
注意した方がいいよね?
どうかな?

不正な値が
広がっちゃうよね?
いいところに
気付いたね。
おお、その通り。

値がどう伝わっているか
考える必要があるね。


そういう視点が重要だね。
 

テキストアドベンチャーゲーム
エンディングフラグ 戻り値使用
KottonCastleEscapeのKCEMain.java)12行目~
 
・・・    
097                   //***************
098                   //対象処理モード
099                   case MODE_GAME_2_TAR:
100                      //対象処理モード関数呼び出し
101                      execModeTarget();
102                      
103                      //入力された行動コマンドを保存する
104                      keepActNum = inputNum;
105                      //結果処理モード(3階層目)に切り替える
106                      nowMode = MODE_GAME_3_RES;
107                      
108                      break;
・・・    
変数 inputNumの値はKeepActNumにもコピーして使われている
値の伝わり方にも注目する
 

ことのイメージ
 
・・・      
308      /**  
309        * 結果処理モード  
310       */  
311      private static boolean execModeResult() {  
312         //***** 入力された対象コマンド別に実行処理と表示をする *****  
313      
314         boolean endingFlg = false;//エンディングフラグ  
315      
316         //部屋ごとの処理  
317         //***************  
318         //もし入口なら  
319         if (nowRoomNum == TAR_ROOM_ENTRANCE) {  
320            //行動コマンド選択別処理:保存しておいた値を使用  
321            //もし移動なら  
322            if (keepActNum == ACT_MOVE) {  
323               resultMove();//結果モード 移動表示処理  
324      
325            //もし見るなら  
326            } else if (keepActNum == ACT_LOOK) {  
327               //選択処理表示  
328               //ドア  
329               if (inputNum == TAR_LOOK_ENTRANCE_DOOR) {  
330                  System.out.println("L-01:扉です。");  
331               }  
332                    
333            //もし使うなら  
334            } else if (keepActNum == ACT_USE) {  
335               //アイテム処理  
336               //暗証番号  
337               if (inputNum == TAR_USE_ITEM_CODE_5963  
338                     || inputNum == TAR_USE_ITEM_CODE_3156  
339                     || inputNum == TAR_USE_ITEM_CODE_3150) {  
340                  System.out.println("U-01:使えません。");  
341      
342               //鍵  
343               } else if (inputNum == TAR_USE_ITEM_KEY) {  
344                       System.out.println("U-02:ドアの鍵穴には入らない。");  
345      
346               //爆弾  
347               } else if (inputNum == TAR_USE_ITEM_BOM) {  
348                       System.out.println("U-03:爆弾でドアを吹き飛ばしました。");  
349                       System.out.println("脱出しました。エンディングへ");  
350      
351                       endingFlg  = true;//エンディング処理モードへ移行する  
352               }  
353            } ここにelse
「その他」を
追加する
・・・      
変数 keepActNumを使っている処理にも注目する


ウヒヒ

これは良い
引っ掛け問題。
???


今回は
極端な値で
考えてみよう。

100とかね。
そして、この変数に
異常な値が入った場合
どんな影響が出るか
考えてみよう。

例えば、変数 inputNum に
本来入力される値より
ずっと大きい数値
ずっと小さい数値
入ってきた場合、その処理が
どう変わるか考えてみるんだ。
 
うーん・・・。

例えば、
ずっと大きい数が
入ってきたら・・・。


今回の処理は
定数ピッタリの値しか
受け付けないから。

分岐の処理は1つも
実行されなくなる
ね。

それで「その他」が
必要なんだね。
  なんか
こういう場所
いっぱい
ありそうだね。
 
 

本来入らない値を入れてみる
大きい値が入ってきたら?
小さい値が入ってきたら?
文字が入ってきたら?
・・・

どうなるか考えてみる
大きな値:100
小さな値:0
表示されていない
アイテムの値
・・・
 

値が入った場合の影響を考える
 
 
変数 inputNumに大きい値が入ってきたら?
(inputNumに100が入っていた場合)
・・・      
230      /**  
231       * 対象処理モード  
232       */  
233      private static void execModeTarget() {  
234         //***** 入力された行動コマンドから対象コマンドを表示する *****  
235      
236         //対象コマンドの一覧を表示  
237         System.out.println("---------------------------------------------");  
238      
239         //部屋ごとの処理  
240         //***************  
241         //もし入口なら  
242         if (nowRoomNum == TAR_ROOM_ENTRANCE) {  
243            //もし移動なら  
244            if (inputNum == ACT_MOVE) { ACT_MOVEの
値は1
245               selectMove();//対象モード 移動表示処理  
246      
247            //もし見るなら  
248            } else if (inputNum == ACT_LOOK) { ACT_LOOKの
値は2
249               //全部の部屋共通の表示  
250               System.out.println("何を見る?");  
251                 
252               //対象コマンド表示(ドア)  
253               System.out.println(TAR_LOOK_ENTRANCE_DOOR + ":ドア");  
254                 
255            //もし使うなら  
256            } else if (inputNum == ACT_USE) { ACT_USEの
値は3
257               selectUse();//対象モード 使う表示処理  
258            } 100は無いので
なにも実行されない

「その他」が必要
・・・      
ぴったりの値が無いので、何も実行されないまま次のモードへ行ってしまう。
つまり、対象リストが表示されない。


そして、
影響に対処する処理
「その他」のブロックに作ろう。
つまり、エラー対応ね。

今回必要な処理は
・エラーメッセージの表示
・最初のモードに戻す
(行動処理モード)

エラーが起こっても、ゲームが
止まらないようにしないとね。
そうだよね。

遊んでる途中に
止まったら
悲しいもんね。
 
 


じゃあ、今回の
エラー処理の作り方を
まとめておこう。


さあ、「その他」で
エラーを捕まえよう!
おー!

捕まえちゃおー

捕まえちゃえー
捕まえちゃうー
 
 
今回のエラー処理の方法
目的 外部から入力された値をチェックする。
(キーボードから入力された値)
対応
異常な値を、制御文の「その他」の分岐で受けて処理する。
 
必要な処理
・エラーメッセージの表示
・最初のモード(行動処理モード)に戻す
 
エラーメッセージ
ユーザーにエラーの内容を通知する
(エラーの原因、理由、対応方法など)

表示例:
"無効なコマンド番号です:" + inputNum
手順 1、制御文のエラー処理を作る必要がある場所を探す
2、制御文に「その他」を書いてエラーを捕まえる
3、「その他」のブロックに、エラー処理を作る
注目する変数 inputNum :キー入力値が入るため keepActNum :inputNumの値がコピーされるため
キー入力処理で、数値の0~5以外の値は入力できないように制限されている。
文字に対するエラー処理は不要。

 
 

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