[英]Whats a better way to code a command line interface in c++?
我使用的是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语句内的相应功能
就像我说的那样,但是我觉得还有很多改进的余地...
我基本上是在移植我用python制作的程序,用这种语言我花了三行十分钟的时间才弄清楚。
我使用eval()函数和一些字符串,因此我可以使用标准的“ name(arg)”格式直接键入函数名称。 它基本上只是评估我的字符串并运行函数,就像这样...
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()的函数,它带有两个参数“ player1”和“ player2”,则可以在提示符“ attack(player1,player2)”中键入它,并且就像我键入了确切的一样在该代码的主体中运行它。 那么,有没有办法让c ++像对待代码一样评估字符串呢? 喜欢...
字符串derp =“ attack(player1,player2)”
您可能会考虑使用映射(可能是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中实际上已经过时了)变得更加复杂。 这只是作为一个想法的速写,而没有任何东西接近完成的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.