1

我正在开发捕食者和猎物的人工智能模拟。如果被追逐,我想模拟隐藏在障碍物后面的 AI。但我仍在试图找出实现这一点的最佳方法。

我正在考虑检查捕食者在障碍物的哪一侧,并试图从另一侧前进。也许使用 A* 路径查找算法来确保它使用最短路径到达那里。

现在我写这篇文章的主要原因是,如果有人能够指出我实现这个的正确方向(也许有人以前做过),或者有任何其他好的想法来实现它。在编写 AI 或制作任何游戏方面,我以前从未做过类似的事情。

所有障碍物都是水平或垂直的正方形/矩形。

在此处输入图像描述

请注意,红色圆圈是捕食者,绿色圆圈是被追逐的猎物。

4

2 回答 2

1

我无法给出任何代码,但我可以告诉你一些事情:

首先,您需要定义该程序的目标。对于这种情况,它是让 AI 隐藏在障碍物后面,尽可能让用户和 AI 保持在相对的两侧。

接下来,您需要决定在代码中需要做什么(无需编写任何实际代码)来实现这一目标。例如:

  • 我们需要确定场景的哪个“区域”被认为是“障碍物后面”
  • 接下来,我们需要确定一条路径,让 AI 在不通过障碍物的情况下到达该区域。
  • 最后,我们需要为此添加某种延迟,这样 AI 就不会因为用户在屏幕上移动的每个像素而不断改变主意

这本身并不是一个简单的问题,但它肯定是可以实现的,而无需付出太多的汗水。我建议您找到一种方法,即使它很慢并且需要大量代码,然后为它编写代码,最后进行改进。如果您担心细化,那么您将永远无法解决任何问题。

提示:确定一个从玩家指向障碍物中间的向量。然后,将向量乘以 2 并将其添加到玩家的位置,这会在障碍物的另一侧为您提供一个点(假设它是一个矩形)。对您获得的 x 和 y 值应用一个Math.min()Math.max()限制器,以使 AI 尽可能靠近或远离障碍物。这应该是一个不错的开始!:)

更新——我决定添加一些代码!

// This assumes a few variables:
int obstacleCenterX, obstacleCenterY;
int aiX, aiY, aiWalkSpeed;
int predatorX, predatorY;
private void updateAIMovement() {
    int slope_x = obstacleCenterX - predatorX;
    int slope_y = obstacleCenterY - predatorY;
    int destination_x = predatorX + (slope_x * 2);
    int destination_y = predatorY + (slope_y * 2);
    if(aiX != destination_x){
        aiX += (slope_x / Math.abs(slope_x)) * aiWalkSpeed;
    }
    if(aiY != destination_y){
        aiY += (slope_y / Math.abs(slope_y)) * aiWalkSpeed;
    }
}

我根本没有测试任何东西,但我认为这可能是一条正确的道路。我本可以做很多事情来改进那个小代码片段,但我没有(例如一些触发以确保玩家在对角线移动时以真实速度移动,等等......)

希望这会有所帮助!

于 2013-01-04T23:44:03.307 回答
0

我会检查是否有东西穿过 x 和每个观察者之间的直线。如果是,则 x 被隐藏。

于 2013-01-04T23:29:39.583 回答