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

SESSION 13 その13
モードの関数の枠とモードの切換処理を作る つづき
  変更:モード切替処理(モードフラグの変更)

えっと。

このままでも
いいんだけど
一箇所変更しよう。
えっ、
間違ってた?


どこどこ?
間違い
じゃないよ。
大丈夫?


ゆっくり
読んでね。

難しくないから。
ほら、この部分見てくれ。

モード別関数の中で
次のモードにフラグを
切り替えてるよな。


このままでもいいんだけど
今回はこれを呼び出し元の
メイン関数の方でやろう。
 
 

テキストアドベンチャーゲーム
モードの切換処理と各モードの関数の枠
KottonCastleEscapeのKCEMain.java)
 
 
現在のモード切換処理(モード別関数)
・・・    
121       /**
122        * 行動処理モード
123        */
124       private static void execModeAction() {
125    
126           System.out.println("テスト:行動モード関数開始"); //テスト用:表示確認
127           System.out.print(">"); //テスト用:表示確認
128    
129           //対象処理モード(2階層目)に切り替える
130           nowMode = MODE_GAME_2_TAR;
131       }
132  
133       /**
134        * 対象処理モード
135        */
136       private static void execModeTarget() {
137    
138           System.out.println("テスト:対象モード関数開始"); //テスト用:表示確認
139           System.out.print(">"); //テスト用:表示確認
140    
141           //結果処理モード(3階層目)に切り替える
142           nowMode = MODE_GAME_3_RES;
143       }
144  
145       /**
146        * 結果処理モード
147        */
148       private static void execModeResult() {
149    
150           System.out.println("テスト:結果モード関数開始"); //テスト用:表示確認
151           System.out.print(">"); //テスト用:表示確認
152    
153           //行動処理モード(1階層目)に戻す
154           nowMode = MODE_GAME_1_ACT;
155       }
・・・    
各モード別関数の中でモードを切り替えている
 
 
 
 
変更後のモード切換処理イメージ(メイン関数に処理を移動する)
・・・      
121       /**  
122        * 行動処理モード  
123        */  
124       private static void execModeAction() {  
125      
126           System.out.println("テスト:行動モード関数開始"); //テスト用:表示確認  
127           System.out.print(">"); //テスト用:表示確認  
128      
129      
130     切り取り1
131       }  
132    
133       /**  
134        * 対象処理モード  
135        */  
136       private static void execModeTarget() {  
137      
138           System.out.println("テスト:対象モード関数開始"); //テスト用:表示確認  
139           System.out.print(">"); //テスト用:表示確認  
140      
141      
142     切り取り2
143       }  
144    
145       /**  
146        * 結果処理モード  
147        */  
148       private static void execModeResult() {  
149      
150           System.out.println("テスト:結果モード関数開始"); //テスト用:表示確認  
151           System.out.print(">"); //テスト用:表示確認  
152      
153      
154     切り取り3
155       }  
・・・      
・・・      
            //********************************************  
            //                メイン処理  
            //********************************************  
            boolean loopFlg = true;//ループフラグ  
       
            while (loopFlg ) {  
     
                /////////////////////////////////////////////////////  
                //実行処理(選択されたコマンドによって表示)  
                switch (nowMode) {  
                    
                    //***************  
                    //行動処理モード  
                    case MODE_GAME_1_ACT:  
                       //行動処理モード関数呼び出し  
                       execModeAction();  
                         
                       //対象処理モード(2階層目)に切り替える  
                       nowMode = MODE_GAME_2_TAR; 貼り付け1
                          
                        break;  
                    //***************  
                    //対象処理モード  
                    case MODE_GAME_2_TAR:  
                       //対象処理モード関数呼び出し  
                       execModeTarget();  
                         
                       //結果処理モード(3階層目)に切り替える  
                       nowMode = MODE_GAME_3_RES; 貼り付け2
                         
                       break;  
                    //***************  
                    //結果処理モード  
                    case MODE_GAME_3_RES:  
                       //結果処理モード関数呼び出し  
                       execModeResult();  
                         
                       //行動処理モード(1階層目)に戻す  
                       nowMode = MODE_GAME_1_ACT; 貼り付け3
                         
                        break;  
                }  
     
                //キー入力処理  
                inputNum = scanInputData();  
     
                //表示開始の区切り  
                printSeparateMark();  
            }  
     
        }  
・・・      
メイン関数で、モードを切り替えるように変更
 
モードの切換処理を各モード別関数からメイン関数側に移動する。

関数が終わった後に、メイン関数側でモードを切り替えるようにする。
処理の内容は変わらない。
 
コードはまだ変更しないで下さい


モード切替処理の移動(関数側で切替)
 
 
モード切替処理の移動(メイン関数側で切替)
 
 
うーん。

関数の中の最後にするか、
関数が終わった後に
メイン関数側でするか。

書く場所を
ちょっとずらしただけで
処理の流れは同じだよね。

何が違うの?
  ちょっと後ろに
しただけだよね?
 
 


この方が、
プログラム全体の処理の流れが
掴みやすい。


メイン関数を見るだけで、
次にどのモードに移行するか
分かるだろ。


モード変更の管理は、
メイン関数の中でやるようにしよう。
本当だ!
これならメイン関数を
読むだけで流れが分かる!


関数の中で変更してると
次にどのモードになるのか
関数の中まで読まないと
分からないもんね。
関数が
増えてくると
こっちの方が
流れを追うのが
楽になるよ。
書き方で
変わるんだね。
 

テキストアドベンチャーゲーム
モードの切換処理と各モードの関数の枠
KottonCastleEscapeのKCEMain.java)
 
 
現在のメイン関数(モード切換処理部分)
・・・    
040               /////////////////////////////////////////////////////
041               //実行処理(選択されたコマンドによって表示)
042               switch (nowMode) {
043                 
044                   //***************
045                   //行動処理モード
046                   case MODE_GAME_1_ACT:
047                      //行動処理モード関数呼び出し
048                      execModeAction();
049                      
050                       break;
051                   //***************
052                   //対象処理モード
053                   case MODE_GAME_2_TAR:
054                      //対象処理モード関数呼び出し
055                      execModeTarget();
056                      
057                      break;
058                   //***************
059                   //結果処理モード
060                   case MODE_GAME_3_RES:
061                      //結果処理モード関数呼び出し
062                      execModeResult();
063                      
064                       break;
065               }
・・・    
メイン関数を読んだだけでは、次にどのモードが実行されるのか分からない
 
 
 
 
変更後のメイン関数イメージ(モード切換処理部分)
・・・    
                /////////////////////////////////////////////////////
                //実行処理(選択されたコマンドによって表示)
                switch (nowMode) {
                  
                    //***************
                    //行動処理モード
                    case MODE_GAME_1_ACT:
                       //行動処理モード関数呼び出し
                       execModeAction();
                       
                       //対象処理モード(2階層目)に切り替える
                       nowMode = MODE_GAME_2_TAR;
                        
                        break;
                    //***************
                    //対象処理モード
                    case MODE_GAME_2_TAR:
                       //対象処理モード関数呼び出し
                       execModeTarget();
                       
                       //結果処理モード(3階層目)に切り替える
                       nowMode = MODE_GAME_3_RES;
                       
                       break;
                    //***************
                    //結果処理モード
                    case MODE_GAME_3_RES:
                       //結果処理モード関数呼び出し
                       execModeResult();
                       
                       //行動処理モード(1階層目)に戻す
                       nowMode = MODE_GAME_1_ACT;
                       
                        break;
                }
   
・・・    
メイン関数を読むだけで、次にどのモードに変わるか把握できる
 


それに、モード切換処理は
関数を「管理」する処理。

今回は、管理する処理は
メイン関数に集めよう。


余分な処理を分離する
ことで、各関数の処理を
専門的にできるね。
そっか。
行動処理モード関数なら
行動に関係する処理
だけにするんだね。

行動の処理と切換の処理は
直接関係ないもんね。
なんとなくで
いいよ。
そんな風に
考えるんだ。
 
 
メイン関数でモード変更をする利点
 
モードの遷移が管理しやすくなる
各関数の処理が機能的、専門的になり、
役割が明確になる
 


こんな感じに、
関数に処理を書く時は
関数の役割を意識しながら
作るように心がけよう。
徐々に
慣れていこう。
関数の役割を
意識する・・・っと。
日頃から
意識するように
するんだね。
 
関数の役割を考える


じゃあ、
書き換えておこう。
はいっ。
書き換えたら
テストしてね。

実行結果は
変わらないけど。
分かりました!
 
コード3:モード切替処理改変
コードをリンク先から参照して下さい

     

大分慣れて
きたね。
さあ、これで下準備完了。
プログラムの外枠ができて
きたね。

さあ、次からは
ゲームの内容を作っていこう。


まずは行動処理モードだ。

ちょっと難しくなってくるよ。
 
そっか、
まだ下準備だったんだ。

ここからが本番なんだね。
よーし、がんばるぞ!
  難しいけど・・・

作るのって
ほんと楽しい!
 
 

課題一覧
テキストアドベンチャーゲーム作成の流れ
 
目的 課題
動くプログラムを作る
1、メインループと入出力処理を作る
2、各モードの関数の枠とモードの切換処理を作る
3、行動処理モードを作る
4、対象処理モードを作る(「移動」処理のみ)
5、結果処理モードを作る(「移動」処理のみ)
その他の処理を作る
6、「見る」処理を作る(対象処理モード、結果処理モード)
7、「使う」処理を作る(対象処理モード、結果処理モード)
8、オープニング、エンディングを作る
9、エラー処理を作る
10、シナリオを追加する
 
仕様書を元に課題を解いて下さい
各課題は、出題 ヒント 解答 の流れになります

 
 

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