确定稍后执行的函数调用

时间:2017-11-19 14:09:02

标签: c#

所以我试图编制一个战斗系统,非常像神奇宝贝,用户可以选择一个移动,生成一个敌人移动,然后两个都按照他们的速度统计数据确定的顺序执行。 我希望玩家执行的移动类型可能会有所不同,例如由具有3个参数的函数定义的攻击或者使用仅具有2个参数的函数定义的另一个玩家切换。所以我需要做的是确定一个具有不同函数和参数的函数调用,这些函数和参数将编程一些动作,然后以某种方式存储它,以便我可以在以后轮到它时调用它。 我正在努力弄清楚如何实现这一目标。我能想到的唯一方法是将函数调用作为字符串编写,然后再执行它,但这并不优雅,特别是因为C#没有方便的执行字符串的方法。 如果有人对如何实现这一点有任何建议,我将不胜感激:)

编辑:这是我的代码

manager.attack (10, currentPlayer, enemy);
checkIfPlayerWon ();
manager.attack (10, enemy, currentPlayer);
checkIfPlayerLost ();

所以这是manager.attack部分,我想用任何动作替换。所以它可能是manager.attack(),也可能是带有2个参数的manager.switchPlayers()。

1 个答案:

答案 0 :(得分:0)

我认为Jon Skeet建议的是创建一个具有特定数量参数(甚至0)的委托,包装该动作。然后你可以传递它并在适当的时候调用它。

粗略的例子:

private Action GetPlayerAction(manager, player, enemy, actionType, param1, param2, param3)
{
    switch(actionType) {
        case actionType1:
            return () => { manager.attack(param1, player, enemy); checkIfPlayerWon(); }
        case actionType2:
            return () => manager.heal(param2, player);
        // ....
    }
}


// to use
var playerAction = GetPlayerAction(manager, player, enemy, param1, param2);

// do some things ...

playerAction();