如何在射击游戏中实施聪明的敌人?


13

想象一下一个非常简单的射击游戏,众所周知:

射击游戏1

您是玩家(绿色)。您的运动仅限于X轴。我们的一个或多个敌人位于屏幕的顶部,他的移动也仅限于X轴心。玩家向敌人发射子弹(黄色)。

我想为敌人实施一种AI,该AI应该真正擅长避免玩家的子弹。我的第一个想法是将屏幕分成多个独立的部分,并为其分配权重:

加权射击

有两种重量:“子弹重量”(灰色)是子弹施加的危险。子弹离敌人越近,“子弹重量”(0..1,其中1是最高危险)越高。没有子弹的车道的权重为0。第二权重是“距离权重”(灰绿色)。对于每条车道,我都会增加0.2移动成本(此值现在是任意的,可以调整)。

然后,我简单地添加权重(白色)并转到权重最低的通道(红色)。但是这种方法有一个明显的缺陷,因为它很容易错过局部最小值,因为最佳的去处只是两个传入的子弹之间(如白色箭头所示)。

所以这就是我要寻找的:

射击游戏完全破坏

  • 即使在没有没有施加子弹威胁的地方的情况下,也应该找到解决方法。
  • 敌人可以通过选择最佳(或几乎最佳)解决方案来可靠地躲避子弹。
  • 算法应该能够考虑子弹的移动速度(因为它们可能以不同的速度移动)。
  • 调整算法的方法,以便可以应用不同级别的难度(对超级智能敌人是愚蠢的)。
  • 算法应该允许不同的目标,因为敌人不仅想躲避子弹,还应该能够射击玩家。这意味着在躲避子弹时,应该优先选择敌人可以向玩家射击的位置。

那么您将如何解决呢?与这种类型的其他游戏相反,我只希望有几个但非常“熟练”的敌人,而不是愚蠢的敌人。


2
您是否考虑过使用诸如转向行为之类的东西?还有一个避开障碍物具体是: red3d.com/cwr/steer/Obstacle.html
四联

@Tetrad我考虑过转向行为..也因为可以很好地切换它们,例如“尝试射击玩家”,并且当危险提前时切换到“逃避”。我担心一维(我基本上正在使用的)逃避版本会太笨而无法做出正确的决定。我可能是错的。
bummzack 2011年

Answers:


8

我认为您的基本想法是正确的,但不是模拟的。您需要在屏幕上运行的模拟值字段。因此,一维扩散梯度可从中即时得出该线上精确点的值。扩散梯度很便宜,并且可以由多个敌人同时使用,因为它们描述了环境,而不是实体的视野(有点像光能传递照明)-可能是为什么您选择了问题中的方法。该渐变应该相对平滑,以引起敌人的有机移动,并且显然会随着您的游戏状态而更新。也许移动平均线

渐变应结合:

  • 接近
  • 速度
  • 子弹宽度
  • (可选)目标位置(玩家)

为了躲避,我们必须能够在解决方案存在时准确地找到解决方案。每当有足够小的缝隙让敌人躲避时就属于这种情况。也就是说,我只能说,您只能做自己能做的事,因此梯度方法在这种意义上不会比任何其他方法都差。

扩散梯度应将敌人推向局部最优点(即图中的峰值),而移动的必要性越小,我们越接近局部最小值,因此对躲避的收益效应将减小。这为敌人何时开火提供了更明智的决策门。

如果射击的需求大于移动的需求,则应这样做;您的代码还可以通过区别多少来确定这一点。您可以将其作为基础图的一部分来实现,在这种情况下,玩家的位置会降低图中的周围值(假设敌人被吸引到最低点),从而将所有决策合并为一张图,或者您可以保留“ “希望解雇”图与主要的“希望躲避”图分开,这将为您提供更直接的控制。

IRL,在我知道以我的最高躲避速度开始变得难以避免的距离之内之前,我不会去躲避它。作为小伙子扔石头的第一手经验。以速度y行进x距离的子弹与以2y行进2x距离的子弹具有相同的危险等级。因此,需要正确考虑这一点。

调整敌人难度算法的方法包括

  • 在图形更新上引入延迟(Born Too Slow)
  • 在图中引入随机的局部误差
  • 由于纯粹的AI惰性,在一系列更新(例如1到10帧)中,根本没有让敌人服从图形告诉他们的内容。

同样,您可以将所有因素实施到一个图中(控制较少,对多个敌人有用的程度较小),也可以将它们组合在一起查看以获取结果的几个图中(模块化程度更高,可能对多个敌人更有效)。很难具体说明,因为您可以采用多种方法进行指导。


1
亲爱的尼克。我在Flash中对该行为进行了一个小型测试版本,结果感到非常满意(子弹是随机生成的)。我目前正在使用3种渐变,一种用于威胁,移动成本,另一种用于边缘(因此屏幕的边缘不太理想)。它们在Flash应用程序中可视化。我觉得通过一些调整,我可以获得很好的效果,并且还可以考虑其他重量,例如射击位置。非常感谢队友。
bummzack 2011年

1
嘿,@ bummzack,是个快乐的同伴,这是一个很棒的小演示!您对问题的看法对我来说是新的,看起来很有趣-很高兴看到它可行!很高兴为您提供帮助,并感谢您的分享。
工程师

7

这可以看作是一个路径问题。不必考虑坏蛋如何避开子弹,而是对子弹进行静态成像,并且坏蛋必须穿过它们到达屏幕底部。

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E =敌人
B =子弹头
P =玩家
* =到屏幕底部的路径选项

一旦坏人画出一条成功的道路,它每次都只需要采取下一步。诸如此类的路径查找可能已经有了一些好的算法。如果坏蛋以与子弹相同的速度运动,则可能有一个示例算法;

从坏蛋开始,在左下方,右下方和右下方的空白处标记安全位置。然后考虑您刚刚创建的每个安全空间并重复。如果任何时候发现下面没有安全空间,请将该空间标记为不安全并回溯。


1
有趣的方法。我担心这样做会很昂贵,因为环境变化如此之快,而且很难使用常见的路径查找算法,因为它们最适合离散的“地图”。
bummzack 2011年

它不应该太昂贵,不要忘记,您只需要在每一回合计算底行,就不必重新计算整个事情。
2011年

@bummzack至少就计算机而言,环境不是“快速”的。对于游戏开发者来说,您应该了解,几乎每个游戏都是基于步骤的,而这仅仅是该步骤的大小。但是,每个步骤都可以进行计算,因此Qwerky解决方案是您所需要的。
Deele,

实际上,我同意@bummzack。尽管此方法在逻辑上是可靠的,但它将比问题中提出的一维方法昂贵。可能是过早的优化,但我发现这种方法要优雅得多。请参阅我的答案以进行详细说明。
工程师

2
这可能是正确的答案,但不完全是现实的答案。当敌人需要走出一条路径时,战场上可能会有另一组子弹完全使该路径无效,这意味着必须重新计算路径。重新计算是个a 。此外,您将反向传播到安全位置的想法使它变得更加昂贵!@尼克·威吉尔(Nick Wiggill)我不认为这是过早的优化,只是先见之明,以确保您不会踢kick。
Ray Dey
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.