有点脑筋急转弯:用c#类自定义逻辑字符串



所以,我的基本设置是这样的:我有项目,它们被限制在不同的类中。这些物品的效果也仅限于不同的职业。例如,我可能有一个道具只能由精灵使用,而另一个道具可能由所有人使用,但给予精灵特定的奖励/效果。

这是一个限制类:

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; }
}

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

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

参考。race是引用文件中的枚举。这里的想法是,我可以将这种"限制"语法扩展到我在引用文件中定义的任何类——所以我可以对种族、类、统计等任何我需要的东西进行限制。

所以,当我定义(例如)一个道具时,这一切都达到了高潮,它限制了谁可以装备它。

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

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点攻击。

我把自己逼入的是,这只适用于逻辑与或逻辑或思维的字符串。假设我的道具上写着"战士可以使用这个",上面写着"精灵可以使用这个"。我说的是"战士或精灵"还是"战士精灵"

我认为,这种区别是必要的——所以我需要给每个限制附加一些逻辑,并在本质上,我认为,相互绑定的限制集,字符串与其他限制集,等等,但我觉得这将很快失去控制。

有更好的方法吗?

与其定义特定的限制类,不如定义一个名为IRestrictable的接口,由Equipment类实现。此接口将包含至少一个名为CheckEligibility(或类似)的方法,该方法将返回bool值。然后你的装备类就可以自由地使用任何它喜欢的逻辑表达式来得出答案,基于你想要的任何输入,以及当时装备类所拥有的任何信息。如果需要检查不同情况下的限制,可以在接口上使用多个方法。您可以自由地为具有复杂规则的特定类型的设备实现从Equipment派生的特定类。

最新更新