当我正在开发我的小游戏时,我已经取得了很多进步但却对许多事情感到沮丧.最新的事情是,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个研究来研究等等[也许更少或许更多或根本没有要求] ......
得出的结论是:我怎样才能创建这样的嵌套,以便当玩家尝试进行研究时,系统会快速查看他所做的研究以及他想做的研究[包括它的嵌套]和如果玩家做了不符合要求它只返回一棵树,他想要实现什么?
毕竟,我只想提前感谢你,我正在等待你非常宝贵的支持......
我会从研究对象本身中删除需求逻辑.简单来说就是这样:
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)
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)