- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发捕食者和猎物的人工智能模拟。我想模拟人工智能躲在障碍物后面,如果它被追赶的话。但我仍在努力找出实现这一目标的最佳方法。
我的想法是检查捕食者位于障碍物的哪一侧,并尝试走到另一侧。也许使用 A* 路径查找算法来确保它使用最短路径到达那里。
现在我写这篇文章的主要原因是万一有人能够指出我实现这一点的正确方向(也许有人以前已经这样做过)或者有任何其他好的想法如何实现它。在人工智能编程或制作任何游戏方面,我以前从未做过这样的事情。
所有障碍物都是水平或垂直的正方形/矩形。
请注意,红色圆圈是捕食者,而绿色圆圈是被追逐的猎物。
最佳答案
我无法直接给出任何代码,但我可以告诉你一些事情:
首先,您需要定义该计划的目标。对于这种情况,就是让 AI 隐藏在障碍物后面,尽可能让用户和 AI 保持在相反的两侧。
接下来,您需要决定在代码内部需要做什么(无需编写任何实际代码)来实现此目标。例如:
这本身并不是一个简单的问题,但它肯定是可以实现的,而不需要付出太多的努力。我建议您找到一种方法,即使它很慢并且需要大量代码,然后为其编写代码,最后进行优化。如果您担心细化,那么您永远无法解决任何问题。
提示:确定从玩家指向障碍物中间的 vector 。然后,将 vector 乘以 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;
}
}
我根本没有测试过任何东西,但我认为这可能是一条正确的道路。我本可以做很多事情来改进这个小代码片段,但我没有(例如一些三角函数来确保玩家在对角线移动时以真实的速度移动,等等......)
希望这对您有一点帮助!
关于java - 实现人工智能隐藏在障碍物后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14166699/
我有一个程序可以检查距离以及玩家是否与障碍物发生碰撞。我现在尝试计算障碍数组中的哪个障碍最接近移动的玩家,然后返回该障碍的索引。 这是我到目前为止所拥有的: public static int
我尝试在 Unity 中创建 RTS 游戏,但在寻路方面遇到问题。我使用 NavMesh 进行寻路,效果很好:单位避免静态对象。但单位不会互相回避。有一个名为 NavMesh Obstacle 的组件
import math import random import pygame from pygame.locals import * import sys def events(): for
新程序员在我的腰带下使用了三个月的 Python(只有几周的 pygame)...... 我正在设计一个 2-D、自上而下的游戏,并且一直在尝试设置障碍来打破 sprite LOS。我目前的尝试是让每
我有一个数据框,其中存储的不是预期的数值“Object”类型的数据看起来像 3 014.0,即“3\xa0014.0”,而不是 3014.0 - 空格(即“\xa0”) - 造成转换问题 问题:有什么
我是一名优秀的程序员,十分优秀!