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

SESSION 13 その26
結果処理モードを作る(移動処理のみ) つづき
  ヒント1:キー入力値の保存

このモードの作り方は
基本的に対象処理モード
と同じ。


関数の中に分岐を作って
結果のメッセージ表示処理や
実行したい処理を書けばいい。

メッセージ出力の分岐は
こんな感じだね。
えっと、
一番右側の列だから・・・

メッセージが多くなるねー。
 
 
 
プログラムの構造(詳細):出力処理
開始 - -
初期化 - -
行動処理モード 詳細 対象処理モード 詳細 結果処理モード 詳細
- - 行動する(行動内容を処理)
[出力] 部屋の状況と行動リストの表示
「現在の部屋」>「状況メッセージ」と「行動リスト」を表示
現在の部屋 表示メッセージ
(行動リスト)
入口 ドアがある部屋です

どうする?
1:移動 2:見る 3:使う
廊下 廊下です。

どうする?
1:移動 2:見る 3:使う
寝室 寝室です。
ベッドがあります。

どうする?
1:移動 2:見る 3:使う
[出力] 対象リストの表示
「現在の部屋」>「選ばれた行動コマンド」>「対象リスト」を表示
現在の部屋 行動 表示メッセージ
(対象リスト)
入口 移動 どこに?

1:入口 2:廊下 3:寝室
見る どこを?

1:ドア
使う なにを?

1:暗証番号1
2:暗証番号2
3:暗証番号3
4:金庫の鍵(所持の場合)
5:爆弾(所持の場合)
廊下 移動 どこに?

1:入口 2:廊下 3:寝室
見る どこを?

1:窓 2:絵画
使う なにを?

1:暗証番号1
2:暗証番号2
3:暗証番号3
4:金庫の鍵(所持の場合)
5:爆弾(所持の場合)
寝室 移動 どこに?

1:入口 2:廊下 3:寝室
見る どこを?

1:ベッド 2:テーブル 3:金庫
使う なにを?

1:暗証番号1
2:暗証番号2
3:暗証番号3
4:金庫の鍵(所持の場合)
5:爆弾(所持の場合)
[出力] 行動の結果を表示
「現在の部屋」>「選ばれた行動コマンド」>
「選ばれた対象コマンド」>「結果メッセージ」を表示
現在の部屋 行動 対象 表示メッセージ(結果) 処理
入口 移動 全ての場所 移動します。 移動
処理
見る ドア ドアです。  
使う 暗証番号1 使えません。  
暗証番号2 使えません。  
暗証番号3 使えません。  
金庫の鍵
(所持の場合)
使えません。  
爆弾(所持の場合) ドアを破壊しました。 終了
処理
廊下 移動 全ての場所 移動します。 移動
処理
見る 窓です。  
絵画 絵です。  
使う 暗証番号1 使えません。  
暗証番号2 使えません。  
暗証番号3 使えません。  
金庫の鍵
(所持の場合)
使えません。  
爆弾(所持の場合) 使えません。  
寝室 移動 全ての場所 移動します。 移動
処理
見る ベッド ベッドです。  
テーブル1回目 テーブルです。  
テーブル2回目 テーブルです。  
テーブル3回目 鍵を見つけました。 取得
処理
金庫 金庫です。  
使う 暗証番号1 開きません。  
暗証番号2 金庫が開きました。 取得
処理
暗証番号3 開きません。  
暗証番号(鍵なし) 開きません。  
金庫の鍵
(所持の場合)
使いました。  
爆弾(所持の場合) 使えません。  
[入力] 行動を選ぶ
(行動コマンド入力)
[入力] 対象を選ぶ
(対象コマンド入力)
[入力] 待機する
- - 脱出できたら(終了だったら)
- - 終了


3段階なの。
大きく違うのは
部屋、行動コマンド、
対象コマンドの
3つの値で分岐する点だ。

対象処理モードの分岐は
部屋と行動コマンドの
2つだったからね。
 
今回は
対象コマンドの分岐が
増えた
んだね。
  なるほど。
 
 
 
出力の詳細(結果処理モード)
 
[出力] 行動の結果を表示
「現在の部屋」>「選ばれた行動コマンド」>「選ばれた対象コマンド」>「結果メッセージ」を表示
現在の部屋
<分岐1>
行動
<分岐2>
対象
<分岐3>
表示メッセージ(結果) 処理
入口
<1>
移動
<2>
全部屋共通
<3>
移動します。
<結果>
移動
処理
見る ドア ドアです。  
使う 暗証番号1 使えません。  
暗証番号2 使えません。  
暗証番号3 使えません。  
金庫の鍵
(所持の場合)
使えません。  
爆弾(所持の場合) ドアを破壊しました。 終了
処理
・・・ ・・・ ・・・ ・・・ ・・・
 
3つの分岐でメッセージを選んで表示する


「移動」の場合は、
分岐は2つで
済んじゃうんだけどね。

全部屋共通だから。

独り言。。。
???


注意する点は
キー入力された値だ。

説明した通り、
結果処理モードでは
結果を出すために

・行動コマンド(移動)
・対象コマンド(部屋)


2つのコマンドの値が
必要
になる。
両方
必要なの。
結果
出せるね。
なるほど。

でも、結果処理モードに
来る前に、2つとも
キー入力してもらってる
から大丈夫だね。


ところが、
今は保存する変数は
inputNum 1つしかないから
1つしか保存できていない。


後から入力された値で、
前の値は上書きされるからね。

つまり、
2つの値を保存するには
2つの変数が必要ってことだ。

そして、上書きされる前に
値を写さないとね。
そっか、
変数が2つ必要なんだ。

2種類の入力があるんだから
当たり前だね!
あのね。

本当に
分かってる?
当たり前ー!
 

変数 inputNumに入る値の流れ
 
 
行動処理モード実行中
・・・      
050               /////////////////////////////////////////////////////  
051               //実行処理(選択されたコマンドによって表示)  
052               switch (nowMode) {  
053                   
054                   //***************  
055                   //行動処理モード  
056                   case MODE_GAME_1_ACT: 行動処理モード実行
057                      //行動処理モード関数呼び出し  
058 1                    execModeAction(); この時、inputNumには
初期値が入っている。
059                        
060                      //対象処理モード(2階層目)に切り替える  
061                      nowMode = MODE_GAME_2_TAR;  
062                         
063                       break;  
064                   //***************  
065                   //対象処理モード  
066                   case MODE_GAME_2_TAR:  
067                      //対象処理モード関数呼び出し  
068                      execModeTarget();  
069                        
070                      //結果処理モード(3階層目)に切り替える  
071                      nowMode = MODE_GAME_3_RES;  
072                        
073                      break;  
074                   //***************  
075                   //結果処理モード  
076                   case MODE_GAME_3_RES:  
077                      //結果処理モード関数呼び出し  
078                      execModeResult();  
079                        
080                      //行動処理モード(1階層目)に戻す  
081                      nowMode = MODE_GAME_1_ACT;  
082                        
083                       break;  
084               }  
085  
086               //キー入力処理  
087 2             inputNum = scanInputData(); inputNumに
行動コマンドが入る。
次の対象処理モードへ
・・・      
行動処理モード実行中の時、inputNumに入っているのは初期値(0)。
 
 
 
対象処理モード実行中
・・・      
050               /////////////////////////////////////////////////////  
051               //実行処理(選択されたコマンドによって表示)  
052               switch (nowMode) {  
053                   
054                   //***************  
055                   //行動処理モード  
056                   case MODE_GAME_1_ACT:  
057                      //行動処理モード関数呼び出し  
058                      execModeAction();  
059                        
060                      //対象処理モード(2階層目)に切り替える  
061                      nowMode = MODE_GAME_2_TAR;  
062                         
063                       break;  
064                   //***************  
065                   //対象処理モード  
066                   case MODE_GAME_2_TAR: 対象処理モード実行
067                      //対象処理モード関数呼び出し  
068 3                    execModeTarget(); この時、inputNumには
行動コマンドが入って
いる。
069                        
070                      //結果処理モード(3階層目)に切り替える  
071                      nowMode = MODE_GAME_3_RES;  
072                        
073                      break;  
074                   //***************  
075                   //結果処理モード  
076                   case MODE_GAME_3_RES:  
077                      //結果処理モード関数呼び出し  
078                      execModeResult();  
079                        
080                      //行動処理モード(1階層目)に戻す  
081                      nowMode = MODE_GAME_1_ACT;  
082                        
083                       break;  
084               }  
085  
086               //キー入力処理  
087 4             inputNum = scanInputData(); inputNumに
対象コマンドが入る。
行動コマンドを上書き。
次の結果処理モードへ
・・・      
対象処理モード実行中の時、inputNumに入っているのは行動コマンド。
モードの最後に対象コマンドの入力で上書きされた。
 
 
 
結果処理モード実行中
・・・      
050               /////////////////////////////////////////////////////  
051               //実行処理(選択されたコマンドによって表示)  
052               switch (nowMode) {  
053                   
054                   //***************  
055                   //行動処理モード  
056                   case MODE_GAME_1_ACT:  
057                      //行動処理モード関数呼び出し  
058                      execModeAction();  
059                        
060                      //対象処理モード(2階層目)に切り替える  
061                      nowMode = MODE_GAME_2_TAR;  
062                         
063                       break;  
064                   //***************  
065                   //対象処理モード  
066                   case MODE_GAME_2_TAR:  
067                      //対象処理モード関数呼び出し  
068                      execModeTarget();  
069                        
070                      //結果処理モード(3階層目)に切り替える  
071                      nowMode = MODE_GAME_3_RES;  
072                        
073                      break;  
074                   //***************  
075                   //結果処理モード  
076                   case MODE_GAME_3_RES: 結果処理モード実行
077                      //結果処理モード関数呼び出し  
078 5                    execModeResult(); この時、inputNumには
対象コマンドが入って
いる。
079                        
080                      //行動処理モード(1階層目)に戻す  
081                      nowMode = MODE_GAME_1_ACT;  
082                        
083                       break;  
084               }  
085  
086               //キー入力処理  
087               inputNum = scanInputData();  
・・・      
結果処理モード実行中の時、inputNumに入っているのは対象コマンド。
 
変数が1つしかないので、行動コマンドが残せない。
inputNumの行動コマンドが上書きされる前に、別の変数に保存する必要がある。


ここはちょっと難しい
かな。

でも、じっくり考えれば
大丈夫。
ゆっくりやってみてくれ。
そうなんだ。

分かった!
やってみるね!
・・・不安だけど。
おっけー。


大丈夫!
大丈夫!

のってるから
まかせて!
そのノリ・・・

ほんとに
分かってるう~?

 
 

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