繁体   English   中英

在C ++中编写命令行界面的更好方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM