前回の続きで、選択肢を処理するプログラムを作ります。
選択肢は↓のように定義しました。
<スクリプトの取決め>
#2 選択肢が表示され、選択した方のファイルを開く 例) #2 23 18 選択肢1 選択肢2 選択肢1を選ぶと23番、選択肢2を選ぶと18番ファイルを開く |
今回使っているデータは↓です。
「scenario2.txt」
2つ目のファイルです。 ここでは選択肢が出ます。 泉「あなたが落としたのはどっち?」 #2 03 04 1.金の斧 2.鉄の斧 |
命令である「#」の行を読み込んだ時に「選択肢の処理」を行う必要があります。
次の行にある「1.金の斧」を読み込んでしまうと、次に開くファイル番号が分からなくなります。
そこで、「#」の行を読み込んだ時点で、2つあるファイル番号を確保しておき、その後2つの選択肢を表示するようにします。
2つのファイル番号を格納するためにselect1、select2という変数を用意します。
2桁の文字から数値を作成する方法は前回書きました。
選択肢を表示するところまで書いてみます。
※無限ループのままなので、実行はまだしないでください。
<sample program 120-01>
#include <stdio.h> #define SENTENCE_MAX 50 #define FILE_MAX 50 int main(void) { char sentence[SENTENCE_MAX]; char filename[FILE_MAX]; int select1, select2; int fileNo = 1; FILE* fp; for (;;) { sprintf(filename, "Scenario\\Scenario%d.txt", fileNo); fp = fopen(filename, "r"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } for (;;) { fgets(sentence, SENTENCE_MAX, fp); if (feof(fp)) { break; } if (sentence[0] == '#') { /* 別ファイルへ */ if (sentence[1] == '1') { fileNo = (sentence[3] - '0') * 10 + (sentence[4] - '0'); break; } /* 選択肢 */ if (sentence[1] == '2') { select1 = (sentence[3] - '0') * 10 + (sentence[4] - '0'); select2 = (sentence[6] - '0') * 10 + (sentence[7] - '0'); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); } } else { printf("%s", sentence); } getchar(); } fclose(fp); } return 0; } |
選択肢を選ぶために1か2を入力させるように作ります。
入力用変数としてinputを用意します。
1か2以外が入らないよう範囲チェックを行いつつ、選択した方のファイル番号をfileNoに入れます。
<sample program 120-02>
#include <stdio.h> #define SENTENCE_MAX 50 #define FILE_MAX 50 int main(void) { char sentence[SENTENCE_MAX]; char filename[FILE_MAX]; int select1, select2; int input; int fileNo = 1; FILE* fp; for (;;) { sprintf(filename, "Scenario\\Scenario%d.txt", fileNo); fp = fopen(filename, "r"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } for (;;) { fgets(sentence, SENTENCE_MAX, fp); if (feof(fp)) { break; } if (sentence[0] == '#') { /* 別ファイルへ */ if (sentence[1] == '1') { fileNo = (sentence[3] - '0') * 10 + (sentence[4] - '0'); break; } /* 選択肢 */ if (sentence[1] == '2') { select1 = (sentence[3] - '0') * 10 + (sentence[4] - '0'); select2 = (sentence[6] - '0') * 10 + (sentence[7] - '0'); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); do{ scanf("%d", &input); } while (input < 1 || input > 2); if (input == 1) { fileNo = select1; } else { fileNo = select2; } } } else { printf("%s", sentence); } getchar(); } fclose(fp); } return 0; } |
まだまともに終われませんが、実行してみます。
<実行結果 VC++ 選択肢で1を選んだ場合>
シナリオの冒頭です。
セリフやナレーションが表示されます。
主人公「あ、斧落としてしもうた・・・」
泉「・・・・・・」
次で別のファイルに映ります。
2つ目のファイルです。
ここでは選択肢が出ます。
泉「あなたが落としたのはどっち?」
1.金の斧
2.鉄の斧
1
1を選択したのでこちらへ来ました。
泉「嘘つけ!」
もう一回最初から・・・
シナリオの冒頭です。
・
・
・
永久に続くので、×ボタンで終了させてください。
<実行結果 VC++ 選択肢で2を選んだ場合>
シナリオの冒頭です。
セリフやナレーションが表示されます。
主人公「あ、斧落としてしもうた・・・」
泉「・・・・・・」
次で別のファイルに映ります。
2つ目のファイルです。
ここでは選択肢が出ます。
泉「あなたが落としたのはどっち?」
1.金の斧
2.鉄の斧
2
2を選択したのでこちらに来ました。
泉「正直じゃん!」
シナリオを終了します。
2を選択したのでこちらに来ました。
・
・
・
永久に続くので、×ボタンで終了させてください。
どちらにしても終わることが出来ません。
選択肢1はスクリプト的に繰り返すようになっていますので問題ありませんが、選択肢2は終了の命令「#3」の処理が出来ていません。
終了の命令が読み込まれたら、終了フラグを使ってプログラム全体を終わらせるよう改良してみましょう。
<sample program 120-03>
#include <stdio.h> #define SENTENCE_MAX 50 #define FILE_MAX 50 int main(void) { char sentence[SENTENCE_MAX]; char filename[FILE_MAX]; int fileNo = 1; int endFlag = 0; int select1, select2; int input; FILE* fp; while (endFlag == 0){ sprintf(filename, "Scenario\\Scenario%d.txt", fileNo); fp = fopen(filename, "r"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } while (endFlag == 0){ fgets(sentence, SENTENCE_MAX, fp); if (feof(fp)) { break; } if (sentence[0] == '#') { /* 別ファイルへ */ if (sentence[1] == '1') { fileNo = (sentence[3] - '0') * 10 + (sentence[4] - '0'); break; } /* 選択肢 */ if (sentence[1] == '2') { select1 = (sentence[3] - '0') * 10 + (sentence[4] - '0'); select2 = (sentence[6] - '0') * 10 + (sentence[7] - '0'); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); fgets(sentence, SENTENCE_MAX, fp); printf("%s\n", sentence); do{ scanf("%d", &input); } while (input < 1 || input > 2); if (input == 1) { fileNo = select1; } else { fileNo = select2; } } /* シナリオ終了 */ if (sentence[1] == '3') { endFlag = 1; break; } } else { printf("%s", sentence); } getchar(); } fclose(fp); } return 0; } |
終了フラグとしてendFlagを用意し、終了命令が読み込まれたら1に変更しています。
endFlagの初期値は0に設定してあるので、これまで無限ループだったfor文をやめてwhile文に変えました。
それでは実行してみます。
<実行結果 VC++ 選択肢で2を選んだ場合>
シナリオの冒頭です。 セリフやナレーションが表示されます。 主人公「あ、斧落としてしもうた・・・」 泉「・・・・・・」 次で別のファイルに映ります。 2つ目のファイルです。 ここでは選択肢が出ます。 泉「あなたが落としたのはどっち?」 1.金の斧 2.鉄の斧 2 2を選択したのでこちらに来ました。 泉「正直じゃん!」 シナリオを終了します。 続行するには何かキーを押してください・・・
ちゃんと終わることが出来ました。
もっと命令を追加することによって、複雑な処理を行うことも出来ますが、そこは皆さんにお任せします。