Lesson6 ラベル
ラベルはジャンプ命令で飛ばすアドレスのようなものである。
今までは行番号を直接指定していたが、シナリオを改良していくと行番号がずれて
しまうので後々困ることになる。
ラベルはシステムが自動的にアドレスを管理してくれるのでスクリプトを入力する
ときにはかなり楽になるだろう。
まずこのラベルの実装から始める。
ラベル定義は名称の次に半角のコロン(:)を付ける。
(例)
start:
end:
このラベルの行は表示をしない。
またシナリオを読み込んだ時点でラベルを行番号として登録する必要がある。
#include<string.h>
#define MAX_LABEL 10 //ラベルの最大数
int LabelNum[MAX_LABEL];//ラベルの行番号
char LabelName[MAX_LABEL][20];//ラベルの名前
void LabelSet()
{//ラベルの定義
int a,max=0;
char* p;
//初期化
for(a=0;a<MAX_LABEL;a++){
LabelName[a][0]=0;
LabelNum[a]=0;
}
//ラベル検索
for(a=0;a<MAX_SCRIPT_LINE;a++){
p=strstr(Data[a],":");
if(p!=NULL){
strcpy(LabelName[max],Data[a]);//ラベル名
LabelName[max][p-Data[a]]=0;//終端
LabelNum[max]=a;//アドレス
max++;
Data[a][0]=0;//元のラベルを消す
}
}
}
|
LabelNameにはラベルの名前が入る。
labelNumにはラベルのあった行番号が入る。
ラベル名から行番号に変換するには次の関数を使う。
int LabelGet(char* m)
{//ラベルの取得
int a;
for(a=0;a<MAX_LABEL;a++){
if(strcmp(LabelName[a],m)==0){
return LabelNum[a];
}
}
printf("そのラベルは見つかりませんでした。\n");
return 0;
}
|
mainでは次のように変更する。
int main()
{
int Adr=0;
int yes=0,no=0;//フラグ
int ch;
ScriptRead();//ここでファイルから読み出し
LabelSet();//ラベル設定
printf("スクリプト開始します。\n");
while(Data[Adr][0]!='0'){//先頭のコードを見る
if(Data[Adr][0]==0){
Adr++;continue;//何もなければスキップ
}
switch(Data[Adr][0]){
default://命令でないものはメッセージとして表示
printf("%s\n",Data[Adr]);
getch();//入力待ち
break;
case '1'://メッセージ
MessageTask(Data[Adr]+1);
getch();//入力待ち
break;
case '2'://ジャンプ
Adr=LabelGet(Data[Adr]+1);
continue;
break;
|
同じように選択肢もラベル対応にするとよい。
case '4'://YES選択
if(yes==1){
Adr=LabelGet(Data[Adr]+1);
continue;
}
break;
case '5'://NO選択
if(no==1){
Adr=LabelGet(Data[Adr]+1);
continue;
}
break;
|
sample.txtを次のようにして正しく実行できるか確認しよう。
START:
1光香 今日の議題は学園祭をどうするべきかです
1学美 あたしに考えがあるよ
1芽生 私もあるわ
3どっちに聞く?(Y=学美,N=芽生)
4MANABI
5MEI
MANABI:
1学美 わくわくきらきらだよ
1光香 まなびちゃん・・
2END
MEI:
1芽生 有料会員制で儲けるわよ
1光香 めぇちゃん・・
END:
1桃葉 マジですか・・・
2START
0
|