【问题标题】:C# Monogame, trying to create a 2D racing AIC# Monogame,试图创建一个 2D 赛车 AI
【发布时间】:2020-08-27 16:30:04
【问题描述】:

所以我的任务是在暑假为大学制作一款 2D 自上而下的赛车游戏,我一直害怕做 AI,但现在是时候了。我用谷歌搜索了同一件事的许多不同方式,只是为了尝试找到一个问同样问题的人,但似乎每个人都使用 Unity 而不是 Monogame。

所以我有一辆可以加速(如缓慢加速到最高速度)、减速和左右转向的“敌人”汽车。我已经让玩家驾驶的实际汽车运行良好,但是当玩家不与任何人比赛时,游戏很无聊。我所需要的只是一个非常基本的人工智能,它会沿着路线走,如果它被撞到或发生什么事情,它会重新调整。我什至不知道从哪里开始,请帮助!!!如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 人工智能汽车是否应该执行复杂的任务,例如从错误中学习?或者只是执行转向和加速任务?我认为,前者需要比后者更多的努力和框架。
  • Jacob K 它需要能够在赛道上行驶,如果它被玩家的汽车轻推,那么即使它偏离了轨道,它也应该继续沿着赛道行驶。除了玩家之外,敌人的路上有任何障碍物。另外,我忘了提到玩家和敌人可以使用“加速”来暂时加速。充能后需要 3 秒才能充能,敌方 AI 也需要知道最佳的充能位置,例如赛道的直道

标签: c# artificial-intelligence 2d monogame topdown


【解决方案1】:

我可能误解了您的问题,但您似乎并没有在您的敌车中寻找 AI 功能....如果它被撞到或发生了什么事。”。人工智能通常意味着学习,但您似乎不需要汽车从过去的错误/“经验”中学习。听起来您可以使用寻路算法来解决您的问题,因为您不需要汽车从以前与其他汽车、领域等的交互中实际学习。您可以研究的一个超级流行的算法是 A*。您可以将游戏设置为具有“提升”权重低于常见“道路”的边的图形。障碍物或寻路等效项 - 墙可以表示为高权重的边缘,这将导致您的汽车自动避开它们,本质上是 A* 寻找到某个点的最快路径。

AStar 伪代码说明:https://en.wikipedia.org/wiki/A*_search_algorithm

很棒的可视化工具:https://qiao.github.io/PathFinding.js/visual/

加速/减速

至于加速/减速可以是单独的逻辑,比如随机决定是否加速。

如果它被撞到或发生了什么事

您可以在汽车被撞时重新计算 A*,以确保您的汽车获得新的最快路径以回到正轨。实际的碰撞逻辑取决于您(不是 A* 算法的一部分)。

请注意,如果您计划的不仅仅是一条直线路径,汽车可以在其中转向(这意味着没有疯狂的弯道或转弯),那么 A* 与自然算法的差异不应太大。如果您计划支持这种轨道,您可能需要研究稍微不同的算法,因为您需要跟踪汽车的旋转角度。

【讨论】:

  • 感谢您的回复。可视化工具真的很好知道它是如何工作的,但是我真的不知道如何实现它。 imgur.com/a/qK5B6jV 这就是你为它制作图表的意思吗?我不确定如何在游戏中实现它...编辑:然后我可以用边缘的近似距离对边缘进行加权?然后如果edge>一定距离敌方车辆加速
  • 想象一下将您的游戏表示为 2D 数组。假设每 10 个像素是数组中的一个“点”或项目。然后,每个单元格都有一个“连接”或边缘到下一个包含一个关键项的单元格:从自身到该边缘的权重。然后重量将取决于它是哪种细胞。例如,如果您的标准权重是从一个常规单元格到另一个常规单元格的 5,则表示您希望您的算法尝试并最大化它使用的提升次数,那么您可以将这些边的权重设为 2 或 3。“图表”是一种抽象概念;这是您可以做的众多实现之一。
  • 好的,你的意思是我应该有一个这样的数组? imgur.com/a/OGm79i0(数字是边权重的占位符)。那么越界的地方不应该加权(0)吗?对不起,如果我看起来像一个初学者,因为我是。 :P 所以“节点”数组中的每个节点都代表地图的一个区域,例如30x30 像素?编辑:所以如果敌人的汽车是一个特定的节点,那么与该节点相邻的所有节点都会进行比较,看看哪个节点的权重最小,等等?
  • 我会开设几个课程来实现这个目标。您可以创建一个 Node 类,该类将包含一些值,例如 tile 类型(以及您需要的所有 A* 数据)或您需要存储的任何其他内容。您还可以创建一个 Edge 类,其中包含两个节点(开始和结束)以及表示两个节点之间权重的双精度值。您的二维数组将是节点。您可以在一些初始化函数中循环遍历数组时自动生成边缘连接。
  • 好吧,你说的“平铺类型”是什么意思?哪些属性会存储在 Node 类和 Edge 类中? (我知道二维数组是 List nodes = new List();)。
【解决方案2】:

您需要实现的内容当然取决于您的 AI 需要的复杂程度。如果它需要做的只是重新调整它的转向和监控它的速度,一辆基本的人工智能汽车可以在给定的时间步长......

  1. 如果不是最高速度则加速
  2. 如果从加速冷却下来则减速
  3. 远离赛道边界
  4. 决定是否提升

(1) 和 (2) 在给定的时间间隔内很容易实现。类似于if(speed < maxSpeed) { accel(); } else if(speed > maxSpeed) { decel(); } 的东西,其中存在double maxBoostSpeed 以限制加速期间的速度。

(3) 和 (4) 可以通过在汽车前面绘制轨迹来实现,例如 [ x + speed*Math.cos(angle), y + speed * Math.sin(angle) ]。然后(3)可以通过转向轨道中心来实现,(4)可以通过将轨迹投影成一条线并找到下一个轨道边界(也就是下一个转弯)之前的距离。如果到轨迹交叉点的距离很大,可能是时候进行提升了。

【讨论】:

  • 感谢您的回复,但我现在意识到他们希望我实现“高级算法”,例如A* 或其他寻路算法。找到就行了;(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多