首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何开始为炮兵战游戏设计人工智能算法?

我应该如何开始为炮兵战游戏设计人工智能算法?
EN

Stack Overflow用户
提问于 2009-01-10 19:28:35
回答 6查看 2.8K关注 0票数 19

这是背景..。在我的空闲时间,我正在设计一个名为Staker的炮兵战游戏(灵感来自于老的基本游戏坦克战争焦土,我正在用MATLAB编程。你的第一个想法可能是“为什么是MATLAB?还有很多其他语言/软件包更适合游戏设计。”你是对的。然而,我是一个呆子,我感兴趣的是学习如何从底层设计一个游戏的具体细节,所以我不一定想使用任何预制件模块。而且,我使用MATLAB已经很多年了,我喜欢用它来做别人没有真正尝试过的事情的挑战。

现在让我们来看看眼前的问题:我想加入人工智能,这样玩家就可以对抗电脑了。我刚刚开始思考如何设计算法来选择方位角、仰角和弹丸速度来击中目标,然后调整它们。我觉得我可能在一开始就过度思考这个问题,试图让人工智能变得过于复杂,所以我想我应该停下来问问这里的社区,他们将如何设计一个算法。

一些具体问题:

  1. 是否有具体的参考AI设计,你会建议我退房?
  2. 你是将AI玩家的难度设计为连续变化(难度为0(容易)到1(难),所有算法仍然使用相同的通用算法),还是会为离散数量的AI玩家设计特定的算法(比如向任意方向射击的容易敌人或能够考虑到风的影响的硬敌人)?
  3. 你会从什么样的数学算法(伪代码描述)开始?

一些附加信息:我用来模拟弹丸运动的模型包含流体阻力和风的影响。液体可以是空气,也可以是水。在空气中,根据一些简单的大气模型,空气密度(以及阻力的影响)随地面以上高度的变化而变化。在水中,阻力很大,所以弹丸通常需要额外的推力。换句话说,抛射物除了受重力的影响外,还会受到其他力的影响。

EN

回答 6

Stack Overflow用户

发布于 2009-01-10 19:52:03

在真实的炮兵情况下,所有这些因素要么用公式处理,要么简单地用蛮力模拟:发射电子炮弹,应用所有相关的力量,看看它降落在哪里。调整并重试,直到电子外壳击中目标。现在你可以把你的号码发给枪了。

考虑到局势的复杂性,我怀疑没有比蛮力更好的答案了。虽然你可以预先计算一个表的预期阻力效果与速度,我不能看到它是值得的。

当然,在游戏中,AI每次都会把第一个弹壳扔到你的头上,这是不有趣的。一旦你知道正确的值,你将不得不使人工智能一个糟糕的机会。在射击中加入一个随机因素,然后走向目标--移动它,说30+random(140)%每次射向真正的目标。

编辑:

我确实同意BCS的观点,即随着时间的推移而改进它。我说了这句话,但后来改变了主意,决定如何写一堆,最后却忘了把它放回去。它的难度应该越大,随机分量应该越小。

票数 4
EN

Stack Overflow用户

发布于 2009-01-10 20:01:09

洛伦的蛮力解决方案很有吸引力,因为它可以通过增加更多的迭代来轻松地进行“智能调整”。此外,迭代的调整因素可能是智能的一部分,因为某些值将使其更快地收敛。

对于基本系统(没有阻力、风等),有一个封闭的形式的解决方案,可以从一个基本的物理文本。我会先猜测一下,然后每次进行一个或多个迭代。您可能需要尝试找出一个经验修正相关性,以改进第一个镜头(这将使第一个镜头分布的平均值更接近于正确)。

票数 3
EN

Stack Overflow用户

发布于 2009-01-10 21:36:58

谢谢Loren和BCS,我想你想到了一个我正在考虑的想法(这就引出了上面的问题2)。AIs的伪码如下所示:

代码语言:javascript
复制
nSims;        % A variable storing the numbers of projectile simulations
              %    done per turn for the AI (i.e. difficulty)
prevParams;   % A variable storing the previous shot parameters
prevResults;  % A variable storing some measure of accuracy of the last shot
newParams = get_new_guess(prevParams,prevResults);
loop for nSims times,
  newResults = simulate_projectile_flight(newParams);
  newParams = get_new_guess(newParams,newResults);
end
fire_projectile(newParams);

在这种情况下,变量nSims本质上是人工智能的“智能”度量。一个“哑巴”AI会有nSims=0,并且简单地对每一个回合进行一个新的猜测(基于上一回合的结果)。一个“聪明的”AI将通过模拟弹丸的飞行来改进它的猜测每次nSims次数。

由此又引出两个问题:

1)函数get_new_guess中包含哪些内容?我应该如何调整三个射击参数,以尽量减少距离的目标?例如,如果一次射击没有达到目标,你可以试着通过只调整仰角,只调整弹丸速度,或者将两者同时调整来接近目标。

2)对于所有认可机构而言,get_new_guess是否应该是相同的,而nSims值是“智力”的唯一决定因素?或者get_new_guess应该依赖另一个“智能”参数(比如guessAccuracy)?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/431586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档