多个代表分配和C#卡游戏动作调用

时间:2016-07-01 20:51:48

标签: c# methods architecture delegates

我正在使用C#进行卡片游戏开发,我不知道如何执行以下操作:

我有我的卡类,其中包含一张卡片可以执行攻击的操作列表。

这些攻击是一个名为Act的自定义类(在示例中我称之为Rules)。

当我加载我的卡片时,我调用了我创建的Inicialize方法,该方法将卡片列表以及每张卡片的攻击列表理论化。

我希望能够将我的攻击表达为带有参数的多方法调用,只有在我将该执行调用为执行时才会调用这些参数。

例如,类似

ActionList = new List<CardRule>();
        ActionList.Add(new CardRule()
        {
            Description = "Cause 20 damage, then causes burn status.",
            Rules = Damage(20).CauseStatus(Status.Burn);
        });

我想将动作(我称之为规则)定义为多方法调用,传递参数

并调用Rules.Execute()来执行所有方法调用等。

我知道它与委托有关,但我不知道如何使用预定义参数调用多个方法。

提前谢谢你,抱歉英语不好,我也是Stack Overflow的新人..

此致

1 个答案:

答案 0 :(得分:1)

你所寻找的实际上并不是一个代表,而是一个跟踪需要做什么的课程。这是一种常用于流畅API的模式,但为您的示例创建一些内容相对简单。

对于您的示例,您可能具有IActionConfiguration接口,例如:

public interface IActionConfiguration
{
    void PerformAction(MyTarget target);
}

现在,您需要一些不同的实现。例如,代表损害的一个:

class DamageActionConfiguration : IActionConfiguration
{
    private int m_damageStrength;

    public DamageActionConfiguration(int strength)
    {
        m_damageStrength = strength;
    }

    public void PerformAction(MyTarget target)
    {
        target.Health -= strength;
    }
}

另一个代表状态效应:

class CauseStatusActionConfiguration : IActionConfiguration
{
    private Status m_status;

    public CauseStatusActionConfiguration(Status status)
    {
        m_status = status;
    }

    public void PerformAction(MyTarget target)
    {
        target.StatusEffects.Add(m_status);
    }
}

现在,您还将实现一个代表多个操作的实现。

class CompositeActionConfiguration : IActionConfiguration
{
    private IActionConfiguration m_firstWrappedConfiguration;
    private IActionConfiguration m_secondWrappedConfiguration;

    public CompositeActionConfiguration(IActionConfiguration first, IActionConfiguration second)
    {
        m_firstWrappedConfiguration = first;
        m_secondWrappedConfiguration = second;
    }

    public void PerformAction(MyTarget target)
    {
        m_firstWrappedConfiguration.PerformAction();
        m_secondWrappedConfiguration.PerformAction();
    }
}

这非常简化,但对我们的例子来说已经足够了。现在你有了一个可以代表多个动作的类(CompositeActionConfiguration) - 你需要的只是让你轻松地将它们链接在一起的魔力。

public static class ActionRules
{

    //First, you want a few static methods which can start a chain:
    public static IActionConfiguration Damage(int strength)
    {
        return new DamageActionConfiguration(strength);
    }

    public static IActionConfiguration Status(Status status)
    {
        return new CauseStatusActionConfiguration(status);
    }

    // Next, some extension methods which allow you to chain things together
    // This is really the glue that makes this whole solution easy to use
    public static IActionConfiguration WithDamage(this IActionConfiguration source, int strength)
    {
        return new CompositeActionConfiguration(source, Damage(strength));
    }

    public static IActionConfiguration WithStatus(this IActionConfiguration source, Status status)
    {
        return new CompositeActionConfiguration(source, Status(status));
    }
}

就是这样。这为您提供了一个或多或少可以满足您需求的解决方案。您可以将Rules属性定义为IActionConfiguration,然后可以像下面这样使用它:

var card = new CardRule()
{
    Description = "Cause 20 damage, then causes burn status.",
    Rules = ActionRules.Damage(20).WithStatus(Status.Burn);
};

card.PerformAction(target);