我正在使用磨机C ++的运行,并且我正在构建一个小型的" Zork-esc"游戏作为一个宠物项目来锻炼我新学到的C ++技能。下面的代码工作得很好,但是对于每个命令/参数组合都必须这样做是很痛苦的,所以如果有人在那里可以省去一些麻烦那么请做:D ...
因为它有这个功能负责在运行时处理命令...
void execute()
{
//###### Command builder ######
cout << ">>>";
char input[100];
cin.getline(input, sizeof(input));
cout << input << endl;
string newin = input;
//###### Execution Phase ######
if(newin=="derp"){
// normally functions go here
cout << "You did it :D" << endl;
}else if(newin=="attack player1 player2"){
// normally functions go here
cout << "player1 attacks player2" << endl;
}else{
// quriky error message for the user
cout << "dafuq?" << endl;
}
execute();
}
它接受你的输入并将它与所有可能的字符串组合进行比较,当它找到匹配时,它假设运行放置在IF staments中的相应函数
像我说的那样有效,但我觉得还有很大的改进空间......我基本上移植了我用python制作的程序,用这种语言花了三行10分钟让我搞清楚。
我使用了eval()函数和一些字符串,所以我可以使用标准&#34; name(arg)&#34;输入函数名称。格式。它基本上只是评估了我的字符串并运行了这个函数,就像这样......
def execute(arg):
try:
eval(arg)
except TypeError:
print('=====## Alert ##=========================================================')
print('You must provide the arguments in the parentheses')
print('=========================================================================')
except SyntaxError:
print('=====## Alert ##=========================================================')
print('I didn\'t understand that D:')
print('=========================================================================')
所以,如果我有一个名为attack()的函数,它接受了两个参数&#34; player1&#34;和&#34;播放器2&#34; 我可以输入提示&#34;攻击(player1,player2)&#34;并且它会运行,就像我已经在代码的主体中输入那个确切的东西来运行它。那么有没有办法让c ++评估一个字符串就好像它是代码一样?喜欢......
string derp =&#34; attack(player1,player2)&#34;
答案 0 :(得分:3)
您可以考虑使用地图(可能是std::unordered_map
)来...从输入映射到相应的操作:
std::unordered_map<std::string, std::unary_function *> actions;
class attack : public std::unary_function /*... */
class flee : public std::unary_function /* ... */
action["attack"] = attack;
action["flee"] = flee;
// ...
当然,除了使用unary_function
(在C ++ 11中实际上已经过时)之外,你可以获得更复杂的功能。这只是作为一个想法的快速草图,而不是接近完成代码的任何东西。