2

我正在使用 run of the mill 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 =“攻击(玩家1,玩家2)”

4

1 回答 1

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 中基本上已经过时了)。这只是一个想法的快速草图,而不是任何接近完成的代码。

于 2013-08-25T05:15:40.487 回答