分配任务


在一个RTS里面,工人的任务是建造墙壁,工人们怎么决定建造哪个墙壁?

玩家决定在哪里建造墙壁,但是他们不把个体工人分配给个人的墙上广场。 在许多RTS游戏中,工作人员只是在做附近的任务,但在我的RTS中,我希望使用特定方块的显式任务的战略性做法作为主要策略,所以我不希望哑工人集中在某个地方,远离未完成。

我使用示例建筑墙; 它可能是采石,制造道路,收集木材或其他。 关键是用户select哪里,而不是谁。

工人只能在靠近方格的地方工作, 他们自己工作的广场可能是无法通过的,直到工作完成。

在这里输入图像描述

工人1和2被告知我的广场A,B,C和D.

他们每场可以移动一个方格,挖一个方格需要10个方格。

你如何决定哪个工人的地雷是哪个方形的?

这似乎是不言而喻的,1应该是我的A和2应该是我的C.

1与A相距4个方格,所以将会在14个蜱中完成挖掘。 下一步该去哪,为什么?

那么如果有另一个方块E被直接在B之上开采呢?

工人用什么逻辑来决定接下来的工作?

Solutions Collecting From Web of "分配任务"

将资源节点标记为繁忙,或者限制树可以被使用的工作人员的数量。 如果某个工作被分配到了某个地点,那么你真正告诉他们的是收获最近的可用树。

这两个主要途径:一个现实的方法是评估和标记资源noes到达之前。 为了防止奇怪的排队问题,给工人一个视觉范围来评估树木。 这允许工作人员在步行到补丁时接近特定的资源节点。 这给了有限的优化。

然而,许多RTS(SC和SC2)没有工人评估一个节点,直到他们到达。 这个领导工作人员四处走动,直到find一个资源节点。 这可以获得更多的技能/优化奖励,(经常看到真棒的工人分裂?)然而,大多数玩家只是打包所有,点击,并恼火,他们都先到相同的位置。

确切的实施将根据资源如何分组而有所不同。 在AoE中,树木和鱼类都是连续不断的扩张,所以采集者可能会在游戏进行的最后阶段结束。 但是在像SC和Red Alert这样的游戏中,资源位于离散的补丁中。 所以工作人员只能环视这个特定的补丁。

编辑之后编辑:不要过分强调工人的低效率。 我能想到的任何RTS都有工人的低效率。 像工人分裂这样的事情是由于玩家在管理工人方面胜过游戏而产生的。 我想你可能是在这个方面采取程序员的观点,而不是devise师。 单剔剩下的问题可以通过调整数字来解决,并且节点可以在不连续的旅程中进行收获。 工人的低效率让你眼花缭乱,因为你知道背后的系统。 但是,如果你的游戏testing人员没有注意到,那么不要停留太久。

解决scheme和思想:

解决scheme:点击时可以将聚集节点放置在队列中,然后当作业上升到队列顶部时,为工作人员find加权的任务队列值,然后find具有最佳加权任务队列值的最近邻居队列值)。

在你的例子中,你可以有最佳队列值为0(暗示没有当前的任务)。 为每个需要旅行的方格加上1(行程时间),每个任务加10(完成任务的时间)。 每经过一个时间单位(如果起始队列值是10,然后3个单位时间队列值将是7),从每个工人的队列值中删除1。 然后find最近的邻居(如果有多个工人有相同的队列值)find应该完成这个任务的工人。

因此,对于您的示例,假设收集节点按字母顺序(AD)从任务队列中popup,队列popup时不会移动:

(values in format [total] = [preexisting value] + [current task distance]) A Pops: queue value of 1: 4 = 0 + 4 queue value of 2: 19 = 0 + 19 Assigned to 1. B Pops: queue value of 1: 24 = 14 + 10 (distance to B from A) queue value of 2: 9 = 0 + 9 Assigned to 2. C Pops: queue value of 1: 25 = 14 + 11 queue value of 2: 20 = 19 + 1 Assigned to 2. D Pops: queue value of 1: 36 = 25 + 11 queue value of 2: 41 = 20 + 21 Assigned to 1. 

下面这样做:高度计算。


思想:

你的游戏如何处理资源阻塞? 即如果存在一个每个节点都是资源的4×4网格,那么工人能够得到内部4个节点吗? 如果不是,请确保工作人员不只是在那里试图去找他们,而是可以为他们分配一个不同的任务,并且一旦外部节点完成,将其中一个外部节点收集到内部节点的工作人员它在工人的任务队列中)。

尝试有一些重量系统,如果树正在收集,计算某种堆码罚款,还有某种距离奖金。 (需要多长时间才能从A点到B点用木头等等,然后你可以做一些algorithm来检查最近的木头,检查它的重量,然后比较它是否然后使用重量最轻的那个。

当然这需要一些微调。 但这个想法很简单。

每项工作应具有a)重要性b)任务状态(分配的工作人员人数)

然后,工人可以决定每次给他最多“奖励”的工作。 奖励的重要性除以被分配的工人数量除以他需要投资的时间(走路和做工)。 如果你的工人可以专门从事工作(如砍木头),他们实际上更喜欢他们可以有效地完成的任务。 如果能够在适当的时候继续工作(例如,必须提供必要的资源),工作当然只能被分配。

为了避免一些工作长时间没有工作(例如,因为它很远)。 重要性应该随着时间而增加。 在收获的情况下,重要性也应该取决于目前有多less种types的资源可用/需要(例如,生产单位除以在给定期间内所要求的单位)。

为了避免工人迅速改变工作,让他们只改变他们目前的工作,如果奖励显着改善(按给定的门槛)。 在计算每个时间值的奖励时,您也可以将最初步行的成本加倍加到工作上。 此外,你应该让一个接一个地重新计算工人的最佳工作,而不是同时进行。

另外,给计算的奖励添加一些随机性。 这将使工人更好地分配到不同的工作(这样他们不只是“全部”去做同样的工作)。 但是,通过连续重新计算下一个工人的最佳工作,并调整已分配的工人数量(同一工作岗位上的更多工人减less预期的工资),这种影响已经减less了。

如果您的工作只能分配给一名工作人员,那么该algorithm可能需要适应一点。 如果是这种情况,请执行以下操作:工作人员select每个时间奖励最高的工作(重要性除以所需的个人时间)。 如果另一个工人每次都能以更高的期望奖励做同样的工作,他就会踢掉当前分配的工人。 新的“失业”工人然后试图find另一份工作。 在你的例子中,这可能是这样的:

  • “C”具有非常高的重要性。 工人1将自己分配给“C”,即使他更加离开。
  • 工人2接下来被分配,并且对于“C”(较less行走)具有较高的每次奖励。 因此,它将工人1踢出工作岗位,并将其分配给“C”。 这没有花费时间,因为我们仍然在相同的模拟时间段内。 所以用户不会看到这个工作的重新分配。
  • 工人1正在寻找另一份工作。 工人1不会将工人2从“C”中踢出,因为他每次的奖励都不会更好。 所以他被分配到“A”或“B”(取决于重要性)。 同样,这仍然在相同的模拟时间片内。