这是背景..。在我的空闲时间,我正在设计一个名为Staker的炮兵战游戏(灵感来自于老的基本游戏坦克战争和焦土,我正在用MATLAB编程。你的第一个想法可能是“为什么是MATLAB?还有很多其他语言/软件包更适合游戏设计。”你是对的。然而,我是一个呆子,我感兴趣的是学习如何从底层设计一个游戏的具体细节,所以我不一定想使用任何预制件模块。而且,我使用MATLAB已经很多年了,我喜欢用它来做别人没有真正尝试过的事情的挑战。
现在让我们来看看眼前的问题:我想加入人工智能,这样玩家就可以对抗电脑了。我刚刚开始思考如何设计算法来选择方位角、仰角和弹丸速度来击中目标,然后调整它们。我觉得我可能在一开始就过度思考这个问题,试图让人工智能变得过于复杂,所以我想我应该停下来问问这里的社区,他们将如何设计一个算法。
一些具体问题:
一些附加信息:我用来模拟弹丸运动的模型包含流体阻力和风的影响。液体可以是空气,也可以是水。在空气中,根据一些简单的大气模型,空气密度(以及阻力的影响)随地面以上高度的变化而变化。在水中,阻力很大,所以弹丸通常需要额外的推力。换句话说,抛射物除了受重力的影响外,还会受到其他力的影响。
发布于 2009-01-10 19:52:03
在真实的炮兵情况下,所有这些因素要么用公式处理,要么简单地用蛮力模拟:发射电子炮弹,应用所有相关的力量,看看它降落在哪里。调整并重试,直到电子外壳击中目标。现在你可以把你的号码发给枪了。
考虑到局势的复杂性,我怀疑没有比蛮力更好的答案了。虽然你可以预先计算一个表的预期阻力效果与速度,我不能看到它是值得的。
当然,在游戏中,AI每次都会把第一个弹壳扔到你的头上,这是不有趣的。一旦你知道正确的值,你将不得不使人工智能一个糟糕的机会。在射击中加入一个随机因素,然后走向目标--移动它,说30+random(140)%每次射向真正的目标。
编辑:
我确实同意BCS的观点,即随着时间的推移而改进它。我说了这句话,但后来改变了主意,决定如何写一堆,最后却忘了把它放回去。它的难度应该越大,随机分量应该越小。
发布于 2009-01-10 20:01:09
洛伦的蛮力解决方案很有吸引力,因为它可以通过增加更多的迭代来轻松地进行“智能调整”。此外,迭代的调整因素可能是智能的一部分,因为某些值将使其更快地收敛。
对于基本系统(没有阻力、风等),有一个封闭的形式的解决方案,可以从一个基本的物理文本。我会先猜测一下,然后每次进行一个或多个迭代。您可能需要尝试找出一个经验修正相关性,以改进第一个镜头(这将使第一个镜头分布的平均值更接近于正确)。
发布于 2009-01-10 21:36:58
谢谢Loren和BCS,我想你想到了一个我正在考虑的想法(这就引出了上面的问题2)。AIs的伪码如下所示:
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)?
https://stackoverflow.com/questions/431586
复制相似问题