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     

[戻る][次へ]

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル