3

所以,我的基本设置是这样的:我有项目,这些项目仅限于不同的类别。这些物品具有效果,也仅限于不同的类别。例如,我可能有一件只能由精灵使用的物品,而另一件物品可能是每个人都可以使用的,但会给精灵提供特定的奖励/效果。

这是一个限制类:

public class Restriction {
    private int _base_id = 0;
    private bool _qualify = true;
    public Restriction() { }
    // ... Base_ID and Qualify getters and setters here
    public virtual bool Check(int c) {
        if(_qualify) { return c == _base_id; }
        else { return c != _base_id; }
}

Restriction 类的子类可能是 RaceRestriction,它只覆盖构造函数:

public RaceRestriction(reference.races r, bool qual) {
    Base_ID = (int)r; Qualify = qual;
}

reference.races r 是参考文件中的枚举。这里的想法是我可以将这个“限制”语法扩展到我在参考文件中定义的任何类——所以我可以对种族、类、统计数据等任何我需要的东西进行限制。

所以,这一切都在稍后达到高潮,当我定义(例如)一个项目时,它对谁可以装备它有限制。

下面是 Equipment 类的一个片段,我在其中定义了一个设备供以后使用(希望它是可读的):

public Equipment() { 
    ...
    _master_equipment_list[1] = new Equipment {
        Name = "Sword",
        Description = "It's just a sword for demonstration",
        Stats = {
            new Attribute {
                Stat_Modifier = new KeyValuePair<reference.stats, int>(reference.stats.ATTACK, 5),
                Restrictions = {
                    new RaceRestriction(reference.races.TROLL, false)
                }
            }
        },
        Restrictions = {
            new ClassRestriction(reference.class.WARRIOR, true)
        }
    }

所以这背后的想法是,使用这个系统,我定义了一把只能由战士使用的剑(基础战士对物品的真正限制),它给予任何使用它的巨魔 5 攻击。

我让自己陷入困境的是,这仅适用于逻辑 AND 或逻辑 OR 的思想串。假设我的物品说“战士可以使用这个”,它说“精灵可以使用这个”。我的意思是“战士还是精灵”还是“战士精灵”?

我认为,这种区别将是必要的——所以我需要为每个限制附加一些逻辑,并从本质上说,我认为,将一组限制相互关联,将字符串与其他一组限制等联系起来.,但我觉得那会很快失控。

有没有更好的方法可以做到这一点?

4

1 回答 1

6

我不会定义特定的限制类,而是通过定义一个IRestrictable由类实现的接口来设计它Equipment。此接口将包含至少一个称为CheckEligibility(或类似)的方法,该方法将返回一个布尔值。然后,您的设备类可以根据您想要的任何输入以及该类当时可用的任何信息,自由使用它喜欢的任何逻辑表达式来得出答案。如果您需要检查不同情况下的限制,您可以在接口上使用多种方法。您可以自由地实现从Equipment具有复杂规则的特定类型设备派生的特定类。

于 2013-02-26T03:23:06.630 回答