我正在制作一个关于运行工厂的游戏(使用C#/ OpenTK)。用户设计房间,雇用工人和订单库存。其余的大多是自动化的。
我挣扎的是工人任务/工作系统的设计。
工厂的基本结构是:
-Factory持有客房清单
-Room拥有家具清单
-Furniture持有工作列表,ItemSlots列表和JobAreas列表
-ItemSlot持有项目
-Job,ItemSlot,Item和JobArea为"可用"
乔布斯的结构是:
-Job持有物品清单(完成工作需要收集的物品)
-Job持有ItemSlots列表(需要放置物品)
-Job持有JobAreas列表(工人在完成工作时使用的椅子等区域)
要使作业可以选择,需要以下内容
- 不是别人做的(job.Available == true)
- 对于每个需要的物品,该类型的物品存在且可用
- 对于所需的每个ItemSlot,该类型的ItemSlot存在且可用
- 对于每个需要的JobArea,该类型的JobArea存在且可用
想法是空闲工作人员会向工厂询问当前可用作业的列表,然后选择要执行的作业(如果没有作业,则默认为空闲)。
我需要帮助的是构建查询以获取可用作业列表的方法(如果在此过程中选择了该作业,我需要收集将使用哪些项目/工作区域的信息)。
那种蛮力"方法我现在想的是这样的事情:
public List<JobDetails> GetAvailableJobs()
{
var availableJobs = new List<JobDetails>();
foreach(Room r in factory.Rooms)
foreach(Job j in r.Jobs)
{
JobDetails details = IsJobAvailable(j);
if (details!=null) availableJobs.Add(details);
}
return details;
}
public JobDetails IsJobAvailable(Job j)
{
JobDetails details = new JobDetails();
//get available items
foreach (Item i in j.Items)
foreach (Room r in factory.Rooms)
foreach (Furniture f in r.Furnitures)
foreach (ItemSlot s in f.ItemSlots)
if (s.Item.Type == i.Type && i.Available) details.Items.Add(i);
//get available slots
foreach (ItemSlot itSl in j.ItemSlots)
foreach (Room r in factory.Rooms)
foreach (Furniture f in r.Furnitures)
foreach (Itemslot s in f.ItemSlots)
if (s.Type == itSl.Type && s.Available) details.ItemSlots.Add(s);
//get available JobAreas
foreach (JobArea jobA in j.JobAreas)
foreach (ItemSlot itSl in j.ItemSlots)
foreach (Room r in factory.Rooms)
foreach (Furniture f in r.Furnitures)
foreach (JobArea jA in f.JobAreas)
if (jA.Type == jobA.Type && jA.Avaialble) details.JobAreas.Add(jA);
//check if job conditions are met
if (details.Items.Count >= j.Items.Count && details.ItemSlots.Count >= j.ItemSlots.Count && details.JobAreas.Count >= j.JobAreas.Count) return details; else return null;
}
问题是,这是一个巨大的重复和长时间的查询。这并没有利用我所知道的关于数据的关系,例如特定的JobAreas只能在特定的房间中找到,或者某些项目只能在某些类型的家具中找到;目前我只是查看每个房间里的每一个物体来搜索每件物品。
我能做得更好吗? LINQ是简化查询的选项吗?有没有办法在工作中嵌入信息,提供线索在哪里查看(仅检查&#34; Oil Cannisters&#34;在类型&#34;机器&#34;和继承自&的房间? #34; MachineRooms&#34)
?要清楚,这是一个关于设计而不是实施的问题。我想要一些关于如何构造Jobs的指针以及有效查询Items,ItemSlots和JobAreas是否可用于给定作业的最佳方法,并将那些可用的东西的实例传回(因此它们可以被标记为Available =是假的,工人可以和他们一起做事。)
Haighstrom