创建所需项目的树

Err*_*rin 5 c#

当我正在开发我的小游戏时,我已经取得了很多进步但却对许多事情感到沮丧.最新的事情是,creating a list of required items并且让你明白,我将为你提供我创建的两个Explanation,Code但显然不起作用......

我 - 解释

为了让玩家建造一座建筑,他必须做一些必要的研究,每项研究都需要更多的研究才能研究......就像一棵研究树,玩家将通过探索游戏和做一些任务......

所以想象一下,你可以在这里查看我的小代码

II - 代码

    //Available Main Elements
    var carbon = new Element {Name = "Carbon"};
    var hydrogen = new Element {Name = "Hydrogen"};
    var oxygen = new Element {Name = "Oxygen"};
    var nitrogen = new Element {Name = "Nitrogen"};

        //Example Research
var steam = new Research(name : "Steam", requiredElements: null, requiredResearches: /*Fire*/ & /*Water*/ & /*Iron*/);
Run Code Online (Sandbox Code Playgroud)

所以从最后一段代码[只是为了解释]玩家想要研究Steam那个例如需要3个研究才能被研究...其中一个the Iron还需要另外1个研究来研究等等[也许更少或许更多或根本没有要求] ......

得出的结论是:我怎样才能创建这样的嵌套,以便当玩家尝试进行研究时,系统会快速查看他所做的研究以及他想做的研究[包括它的嵌套]和如果玩家做了不符合要求它只返回一棵树,他想要实现什么?

毕竟,我只想提前感谢你,我正在等待你非常宝贵的支持......

Bra*_*Rem 5

我会从研究对象本身中删除需求逻辑.简单来说就是这样:

public class Research
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,我会Dictonary在每个Research包含其他桶的地方保留一份需求列表Researches:

Dictionary<Research, List<Research>> requiredResearches = 
    new Dictionary<Research, List<Research>>();

// the list of Researches the player has completed
List<Research> playersResearched = new List<Research>;
Run Code Online (Sandbox Code Playgroud)

例如,"Steam"将包含"Fire","Water"和"Iron".也许"铁"包含"锡".

接下来,给定研究,我们可以查看所有需求,包括要求的要求:

// e.g. research is "Steam" and returns "Fire", "Water", "Iron", "Tin"
var chainOfRequirements = GetReq(requiredResearches, research);
Run Code Online (Sandbox Code Playgroud)

这会调用这样的递归函数:

public IList<Research> GetReq(Dictionary<Research, List<Research>> reqs, 
                              Research target)
{
    var chain = new List<Research>();
    if(reqs.ContainsKey(target))
    {
        foreach(var item in reqs[target])
        {
            chain.Add(item);
            chain.AddRange(GetReq(reqs, item));
        }
    }
    return chain;
}
Run Code Online (Sandbox Code Playgroud)

您返回的是一系列要求(包括要求要求).此时,针对玩家列表的一点查询Researches可以向您返回哪些缺失:

var missing = chainOfRequirements.Where (c => 
                  playerResearches.Where (r => r == c).Any () == false).Distinct();
Run Code Online (Sandbox Code Playgroud)

使用"NAME"启用比较字典

public sealed class NameEqualityComparer : IEqualityComparer<Research>
{
    public bool Equals(Research x, Research y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        if (x.GetType() != y.GetType()) return false;
        return string.Equals(x.Name, y.Name);
    }

    public int GetHashCode(Research obj)
    {
        return (obj.Name != null ? obj.Name.GetHashCode() : 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是概念证明.