Lesson7 命令翻訳
今まで命令をコードという数字に置き換えていた。
このままではコードが増えると分かりにくくなるので分かりやすい名前に変更する。
例)
メッセージ・・・#名前 セリフ
ジャンプ・・・・&goto ラベル
選択肢・・・・・&jump(選択肢1,ラベル1,選択肢2,ラベル2)
いままで1としてきたコードを#に変えるのは簡単である。
case '1'://メッセージ
を
case '#'://メッセージ
にするだけである。
2は&gotoに変化する。
3と4と5は大幅変更になるが1つの命令として&jumpに置き換える。
この翻訳作業のために新しい関数を作る。
char MesParam[10][30];//分割された命令の引数(最大10)
char code[32];//コード
enum CODE_LIST{
C_GOTO=2,
C_JUMP=3
};
int Decode(char* mes)
{//翻訳
if(mes[0]!='&'){
return 0;//命令ではなかった
}
int adr=0;
char* p=mes+1;
int num=0;
for(num=0;num<10;num++){
adr=0;
while(*p!='(' && *p!=')' && *p!=',' && *p!=' '){
if(*p==0)
break;
MesParam[num][adr++]=*p++;
}
MesParam[num][adr]=0;//終端
if(*p==0)
break;
p++;
}
if(strcmp(MesParam[0],"GOTO")==0){
return C_GOTO;
}
if(strcmp(MesParam[0],"JUMP")==0){
return C_JUMP;
}
return -1;
}
|
mainは次のように書き換える。
int main()
{
int Adr=0;
int ch;
ScriptRead();//ここでファイルから読み出し
LabelSet();//ラベル設定
printf("スクリプト開始します。\n");
while(Data[Adr][0]!='0'){//先頭のコードを見る
if(Data[Adr][0]==0){
Adr++;continue;//何もなければスキップ
}
int code=Decode(Data[Adr]);
switch(code){
case C_GOTO://ジャンプ
Adr=LabelGet(MesParam[1]);
continue;
break;
case C_JUMP://選択肢表示
printf("Y=%s\n",MesParam[1]);
printf("N=%s\n",MesParam[3]);
while(1){
ch=getch();//入力
if(ch=='Y' || ch=='y'){
Adr=LabelGet(MesParam[2]);
break;
}else if(ch=='N' || ch=='n'){
Adr=LabelGet(MesParam[4]);
break;
}
}
continue;
break;
default://メッセージ表示
if(Data[Adr][0]=='#'){
MessageTask(Data[Adr]+1);//セリフ
}else{
printf("%s\n",Data[Adr]);//文章
}
getch();//入力待ち
break;
}
Adr++;
}
printf("\nスクリプト終了します。\n");
getch();//入力待ち
return 0;
}
|
sample.txtは次のようにしてテストしてみよう。
START: #光香 今日の議題は学園祭をどうするべきかです #学美 あたしに考えがあるよ #芽生 私もあるわ どっちに聞く? &JUMP(学美,MANABI,芽生,MEI) MANABI: #学美 わくわくきらきらだよ #光香 まなびちゃん・・ &GOTO END MEI: #芽生 有料会員制で儲けるわよ #光香 めぇちゃん・・ END: #桃葉 マジですか・・・ &GOTO START &END |