使AI彼此走不同的路


16

我有一个自上而下的2d游戏,其中AI在地图的边缘生成,并向中心移动。

我正在使用A *和节点网格进行寻路。

现在,AI会在地图边缘的某个点生成,并且都采用相同的路径,这是到达中心的最短路径。

现在,我希望它们变得更加令人惊讶和有趣,并且彼此走不同的路。

我可以立即想到两个实现此目的的想法,但想知道人们是否经常使用其他方法或更好的方法?

  1. 当一个敌人生成并生成一条通往中心的路径时,暂时增加该路径上所有节点的成本,然后随着时间的推移逐渐降低它们的成本。然后,稍后产生的敌人AI将被迫走更宽的道路。

  2. 上面的方法将导致AI走上越来越宽的道路,而且仍然非常可预测。因此,我想我还将在地图周围引入许多中间目标节点。当AI产生时,他们会随机选择一个中间目标,并先到达那里,然后再前往地图中心。将此与上述增加成本的方法结合起来可能看起来不错?

人们发现哪种方法最能使AI改变他们所走的道路,令人信服和令人惊讶?

Answers:


7

您的第二个选择暗示了一种更基本的方法:确保敌人从不同的方向接近您的玩家。问题是,他们必须走多远才能“绕过”您的玩家?理想的选择是

  • 动态生成紧密围绕(即跟随)玩家位置的点;
  • Nevermind提出的关于或多或少地随机化到这些周围点的路径的建议。

通过这种方式,您可以确保AI不会不必要地花费较长的弯路,而只是为了在与玩家会合时获得逼真的路径变化。

协同扩散可以隐式地完成您想要作为算法一部分的工作。但是实现起来并非易事。


协作扩散只是具有一定权重的泛滥。实现起来很简单,也许比A *更容易。它只需要对您的世界有不同的看法-可能是不平凡的概念转变,但没有实现问题。

由于它在管理AI实体方面是一种非标准的观点,因此实施起来仍然是不平凡的:)
工程师

谢谢尼克。我认为在地图中心设置一些围绕玩家的航点将是主要的方法。不知道在这个阶段是否会动态生成它们,或者针​​对我的特定情况为每个级别涉及一些手工制作。再次感谢!
2011年

12

作为第一个想法,尝试在寻路时为每个节点的权重添加一个小的随机值。这样,每个代理都会在稍微不同的环境中寻找路径。我不确定这是否可以解决您的问题,但是尝试起来应该很容易。


敌人最终将像鸡一样奔跑,并且在细粒度的环境中,路径不会有太大不同。这是对其他解决方案的很好补充,但本身并不是解决方案
Coyote

@土狼这在很大程度上取决于导航网状结构以及节点权重,速度和随机分量之间的关系。这就是为什么我将答案框为尝试的建议,而不是确定的答案。
没关系,

的确:)我通常是熵迷。但是最终结果却很少。
郊狼

我实际上相信Nick Wiggill的答案比我的要好。但是不知何故它没有得到应有的支持。
没关系,

是的...但是您的是第一个且更简单的...我们可以尝试对其投反对票:P
郊狼

3

我喜欢Nevermind的回答,但是,鉴于注释中描述的限制,这是我会尝试的方法:

  1. 该算法以单个单位为中心,记录了总的行进距离。
  2. 为每个后续单元分配一个随机的距离,并比该距离更长。
  3. 在为每个单元进行A *运算时,会根据您的距离和行进距离来增加额外的重量。这大概是这样的(distanceToGoal) + Max(0, desiredDistance - distanceTravelled))

这将使部队尝试走得更远,这可能是一条不同的道路,这将导致他们可能走不同的道路。

您也可以将其添加到每个单元的开始状态,但是随机范围可能必须更大一些。


2

正如尼克·威吉尔(Nick Wiggill)指出的,最简单的方法是围绕物镜画一个圆。

  • 随机分配一个靠近该圆的点作为航路点。
  • 从初始路径中消除圆中的所有路径(或大幅增加这些点的值)
  • 然后从那个角度出发,达到目标。

重要的部分是消除原始航路点的圆圈中的所有路径,因为您可能最终会遇到敌人越过圆圈到达其初始航路点的情况。

由此,您可以通过玩多个值并在接近初始圆的圆中添加辅助航路点来获得任何变体。


如果您的地图支持,则在该圆周围找到“有趣”的位置(门口,掩盖,树木,岩石,建筑物;具有一定战术优势的任何节点),并让敌人首先前往这些位置(如果有),并且仅在如果需要,可以打开。这看起来比仅在圆圈边缘上击中一个随机点要聪明得多。
DampeS8N 2011年

谢谢Coyote,是的,我可能会选择Nicks解决方案,并且如DampeS8N所建议的那样,将一些重要的关键位置作为航路点。为了避免AI“越过圆圈”的问题,我将大大增加圆圈中节点的成本,因此A *应该希望绕过它:)
TerryB 2011年

2

您的问题本质上是A *是用于找到到达目标的最快路线的算法。如果这是您确定“良好”道路的主要标准,那么所有参与者都做出相同的决定就不足为奇了。

您需要做的是修改路径的质量标准,以使“最短就是最好”不是唯一的因素。随机性是其中的关键,但它并没有那么大,以至于损害了寻路情报(即,演员愚蠢地绕过通往目标的回旋路径)。

A *寻路本质上是天真的,因为它通常假定参与者在开始之前就已经对整条路线拥有完备的知识。这总是看起来不现实。该解决方案表明,选择的中间目标距离目标已经迈出了一步-人工智能正在试图接近目标,但一次只能尝试在小范围内导航(这类似于现实生活中您只能导航到尽可能远的地方)如您所见,以及遍历更多路径时,您可以看到更远的前方)。

我也许会推荐一种更简单的查看方式。当您进行寻路时,请不要仅仅维护迄今为止找到的一条最佳路径。相反,请收集一组最佳的5或10条路径。使用阈值可丢弃明显的异常值。例如,如果最佳路径经过20u到达目标,则下一条最佳路径经过21u,之后的下一路径经过50u。将阈值设置为比最佳路径大20%,并丢弃50u路径,因为它更长。现在您可以选择几种路径,并且通过从该组路径中随机选择,您的参与者将做出不同的决定。

但是,使用标准A *搜索不会获得此类信息,因此我认为您必须修改算法或使用其他方法来收集可能的路径集。


1

如果您有少量反复出现的敌人(或敌人类型),则可以尝试赋予他们影响他们行动的个性。它们不必是大事,而只是时不时出现的事。吃豆人的鬼魂就是一个很好的例子。将您的A *分解为几个中间目标。也许一个敌人真的很愚蠢,很容易迷失,每三个节点朝随机方向前进(而不是直接向后)。要有创造力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.