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

时间:2013-08-25 05:10:21

标签: c++ python

我正在使用磨机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;

1 个答案:

答案 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中实际上已经过时)之外,你可以获得更复杂的功能。这只是作为一个想法的快速草图,而不是接近完成代码的任何东西。