在我的游戏中,我有很多不同类型的单位,它们都是有规律地被实例化/销毁的。它们具有某些值,如maxhp或level或defense,这些值需要在实例化时引用,并且可能根据某些因素而变化。例如,如果级别增加,maxhp可能会更高,但不是基于严格的公式,该公式随单位而变化。例如:
士兵一级气血上限:5
二级战士气血上限:6
士兵3级气血上限:8
法师等级1气血上限:3
法师2级气血上限:4
法师等级3气血上限:5
类名很容易引用,单元的级别将存储在其他地方,我需要知道我首先要查找哪个特征。因此,对我来说有意义的是将它们存储为键/值对。我可以通过编程检查(classname+lvlstring+traitname)之类的东西作为密钥,因此密钥最终将是mage2maxhp,值为4。
通常我在这方面的直觉很差,因为我从来没有学到很多关于数据结构的知识。所以,我想知道是否有更好的方法来实现这一点并组织这么多数据。例如,对于一本字典来说,这似乎是难以置信的大。也许把它分成几个字典(一个用于maxhp,一个用于防御,等等)会更容易管理,但我仍然觉得我忽略了一个更适合这个目的的数据结构。有什么建议吗?

最佳答案

下面将使用继承和字典来解决您的问题,以避免必须类名称字符串等。

public abstract class Unit
{
    // This approach would use one Dictionary per Trait
    protected abstract Dictionary<int, int> MaxHpByLevel { get; }

    public int Level { get; set; } = 1;

    public int MaxHp => this.MaxHpByLevel[this.Level];
}

public class Soldier : Unit
{
    protected override Dictionary<int, int> MaxHpByLevel => new Dictionary<int, int>
    {
        [1] = 5,
        [2] = 6,
        [3] = 8
    };
}

public class Mage : Unit
{
    protected override Dictionary<int, int> MaxHpByLevel => new Dictionary<int, int>
    {
        [1] = 3,
        [2] = 4,
        [3] = 5
    };
}

你可以这样使用它:
var soldier = new Soldier { Level = 2 };
Console.WriteLine(soldier.MaxHp); // 6

就像你一样,我也认为人们可以用不同的方式来解决这个问题。
我喜欢这种特殊的方法是它基于面向对象的原则,并且它减少了冗余的结构元素(例如,避免了特征类型的枚举等)。您可以访问一个单元的属性,而不是单元的属性。
这里使用的词典会比较小。
但是,当涉及到大小限制时,我同意来自评论/答案的人们的看法。无论你选择哪种方法,你都不可能使你的词典接近它的极限。

09-25 19:16