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

コード11:クイズゲーム完成 メンバ変数未使用
コード(KotoQuizのKQMain.java)
クイズゲーム完成 メンバ変数未使用
(KotoQuizのKQMain.java)12行目~
 
・・・
012   public class KQMain {  
013      
014     /**
015       * @param args the command line arguments  
016       */  
017     public static void main(String[] args) {
018       // TODO code application logic here  
019    
020          //********************************************  
021          // 定数  
022          //********************************************  
023          //入力・表示処理モード  
024          int EXEC_MODE_QUIZ = 1;//問題処理モード  
025          int EXEC_MODE_CHECK = 2;//解答処理モード  
026          int QUIZ_MAX = 4;//問題数  
027      
028          //********************************************  
029          // 変数  
030          //********************************************  
031          boolean loopFlg = true;//ループフラグ  
032          int inputNum = 0;//入力番号  
033          int execMode = EXEC_MODE_QUIZ;//処理モード(問題処理モードで開始)  
034      
035          int nowQuizNum = 0;//現在出題番号  
036          int correctTotal = 0;//正解数  
037      
038           //********************************************  
039           // メイン処理  
040         //********************************************
041           while (loopFlg) {  
042      
043               /////////////////////////////////////////////////////  
044               //実行と描画処理  
045      
046               //問題処理モード  
047             if(execMode == EXEC_MODE_QUIZ){
048      
049                   //問題処理モード関数呼び出し  
050                    execModeQuiz(nowQuizNum,correctTotal);  
051      
052                    //解答チェックモードへ変更  
053                    execMode = EXEC_MODE_CHECK;  
054      
055               //解答処理モード  
056               }else if(execMode == EXEC_MODE_CHECK){  
057      
058                   //解答処理モード関数呼び出し  
059                    correctTotal = execModeCheck(inputNum,nowQuizNum,correctTotal);  
060      
061                    //問題を進める  
062                    nowQuizNum += 1;  
063      
064                    //最大数以上なら  
065                    if(nowQuizNum >= QUIZ_MAX){  
066                         loopFlg = false;//ゲームを終了する  
067                    }  
068      
069                    //問題処理モードへ変更  
070                    execMode = EXEC_MODE_QUIZ;  
071               }  
072      
073               //入力番号を受け取る  
074               inputNum = scanInputData();  
075      
076               //表示終了の区切り  
077             printSeparateMark();  
078           }  
079      
080           //結果表示処理関数呼び出し  
081           printResult(correctTotal);  
082      
083       }  
084      
085      /**  
086        * 解答チェック処理  
087        * @param seikaiBangou 正解の番号  
088        * @param kaitouBangou 入力番号  
089        * @param seikaiGoukei 正解数  
090        * @return seikaiGoukei 正解数  
091       */  
092       private static int checkAnswerData(int seikaiBangou,int kaitouBangou,int seikaiGoukei){  
093      
094           //解答チェック  
095           if(kaitouBangou == seikaiBangou){  
096               System.out.println("やったね!正解");  
097               seikaiGoukei += 1;//正解数加算  
098           }else{  
099               System.out.println("残念!不正解");  
100           }  
101      
102           //結果を返す  
103           return seikaiGoukei;  
104       }  
105      
106        /**  
107        * キー入力処理  
108        */  
109       private static int scanInputData(){  
110      
111           /////////////////////////////////////////////////////  
112           //キー入力処理 そのまま書き写してください ここから  
113           int tmpInputNum = 0;//入力番号初期化  
114           try {  
115               //初期化処理  
116               final int IMPUT_MAX = 3;//最大入力値  
117               //キー入力読込処理(int型)  
118               java.util.Scanner sc = new java.util.Scanner(System.in);  
119               int inputInt = sc.nextInt();  
120               //入力値チェックと入力番号への代入  
121               if (inputInt > 0 && inputInt <= IMPUT_MAX) {  
122                   tmpInputNum = inputInt;  
123               } else {  
124                   System.out.println("※ コマンドは" + IMPUT_MAX + "以下で入力して下さい ※ ");  
125               }  
126           } catch (Exception e) {  
127               System.out.println("※ 数字以外は入力しないで下さい ※ ");  
128           }  
129           //キー入力処理 そのまま書き写してください ここまで  
130           /////////////////////////////////////////////////////  
131      
132           //入力番号を返す  
133           return tmpInputNum;  
134       }  
135      
136       /**  
137       * 問題処理モード処理  
138       */  
139       private static void execModeQuiz(int nowQuizNum ,int correctTotal){  
140      
141           //見出し:現在の状況を表示する  
142           System.out.println("***************** ことくいず *****************");  
143           System.out.println("         現在、"+ (nowQuizNum + 1) +"問目です。");  
144           System.out.println("        現在の正解数は"+ correctTotal +"です。");  
145           System.out.println("***********************************************");  
146           System.out.println("");  
147           System.out.println("< 問題です >");  
148      
149           //問題を表示する  
150           switch(nowQuizNum){  
151               case 0:  
152                   System.out.println("変数の型でint型の最大値はいくつ?");  
153                   System.out.println("");  
154                   System.out.println("-----------------------------------------------");  
155                   System.out.println("1:256 2:98776342 3:2147483647");  
156      
157                   break;  
158               case 1:  
159                   System.out.println("変数の型を変換するのに使う方法はどれ?");  
160                   System.out.println("");  
161                   System.out.println("-----------------------------------------------");  
162                   System.out.println("1:キャスト 2:スコープ 3:インクリメント");  
163      
164                   break;  
165               case 2:  
166                   System.out.println("変数aが「4以上でかつ10以下」か「40未満」");  
167                   System.out.println("正しい条件式はどれ?");  
168                   System.out.println("");  
169                   System.out.println("-----------------------------------------------");  
170                   System.out.println("1:(a >= 4 || a < 10) && a < 40");  
171                   System.out.println("2:(a >= 4 || a <= 10) || a < 40");  
172                   System.out.println("3:(a >= 4 && a <= 10) || a < 40");  
173      
174                   break;  
175               case 3:  
176                   System.out.println("ことが一番好きな場所はどこ?");  
177                   System.out.println("");  
178                   System.out.println("-----------------------------------------------");  
179                   System.out.println("1:動物園 2:水族館 3:遊園地");  
180      
181                   break;  
182           }  
183           System.out.print("答え>");  
184      
185       }  
186      
187        /**  
188        * 解答処理モード処理  
189        */  
190       private static int execModeCheck(int inputNum,int nowQuizNum,int correctTotal){  
191      
192           //解答をチェックする  
193           switch(nowQuizNum){  
194               case 0:  
195                   //正解番号チェック  
196                   correctTotal = checkAnswerData(3,inputNum,correctTotal);  
197      
198                   break;  
199               case 1:  
200                   //正解番号チェック  
201                   correctTotal = checkAnswerData(1,inputNum,correctTotal);  
202      
203                   break;  
204               case 2:  
205                   //正解番号チェック  
206                   correctTotal = checkAnswerData(3,inputNum,correctTotal);  
207      
208                   break;  
209               case 3:  
210                   //正解番号チェック  
211                   correctTotal = checkAnswerData(2,inputNum,correctTotal);  
212      
213                   break;  
214            }  
215           System.out.println("");  
216           System.out.println("-----------------------------------------------");  
217           System.out.print("< 1を入力してEnterキーを押してください >");  
218      
219           return correctTotal;  
220       }  
221      
222        /**  
223        * 区切り処理  
224        */  
225       private static void printSeparateMark(){  
226               //表示終了の区切り  
227               System.out.println("");  
228               System.out.println("######################################################");  
229               System.out.println("");  
230       }  
231      
232        /**  
233        * 結果表示処理  
234        */  
235       private static void printResult(int correctTotal){  
236           //結果表示  
237           System.out.println("");  
238           System.out.println("***************** ことくいず *****************");  
239           System.out.println("");  
240           System.out.println("      あなたの正解数は "+ correctTotal +" でした。");  
241           System.out.println("");  
242           System.out.println("***********************************************");  
243           System.out.println("");  
244           System.out.println("おしまい");  
245       }  
246      
247   }  
・・・    
 
 
コードの解説
まずコードを一通り読んで、処理の内容を理解して下さい。
そして、なぽの最終コードとどこが違うか考えてみて下さい。
このコードと、なぽの最終コードとの大きな違いは46行目~71行目です。
「モード切替」と「終了処理」はメイン関数で行います。
モード別関数には含めません。
こうすることで、メイン関数を読むだけで全体の流れが掴みやすくなります。

このコードでは、メイン関数を読むだけでモードの切換がどのような流れで行われるのか分かりますが、なぽが作ったコードでは、モード別関数の中まで全部読まないと、次にどのモードに切り替わるのか分かりません。
また、同時に関数の機能を明確にすることができます。
問題処理モード関数は「問題処理のみ」、解答処理モード関数は「解答処理のみ」にした方が、関数の機能が明確になります。

なぽのコードでは、問題処理モード関数や解答処理モード関数に「モード切替」「終了処理」が入っているため、機能が少しごっちゃになっています。
「モード切替」や「終了処理」は「問題」や「解答」とは直接関係無い処理ですよね。
 
そして、上記の変更によって・・・・
コードが大きく変わりました。

「メンバ変数を使う必要がなくなった」んです。

1つの戻り値だけで対応できています。
 
うーん。伝えたいことがちょっと分かりづらいですよね?

今、分かっていただきたいのは、
関数の分け方1つで、コードがかなり変わってしまうということです。
このコードの実行結果は、なぽのコードとまったく同じです。

でもコードは大分違います。

なぽのコードが間違っているという訳ではなく、目的ややり方によって組み方が違うということです。
なぽはセッションのためにあの作りにしたようですが。。。
 
解説は以上です。
コードの違いがよく分からなくても全く気にしないで下さい。今は理解する必要はありません。

暫くセッションを進めた後、またこのコードを読んでみて違いを考えてみてください。
多分、意図した部分が分かっていただけると思います。

楽しんで行きましょうね。
 
home

広告
  サイト内検索: