这是背景......在我的空闲时间我正在设计一款名为Staker的炮兵战游戏(灵感来自旧的BASIC游戏Tank Wars和Scorched Earth)并且我在MATLAB中编程。您的第一个想法可能是“为什么选择MATLAB?还有很多其他语言/软件包更适合游戏设计。”你会是对的。然而,我是一个笨蛋,我有兴趣学习如何从头开始设计游戏的具体细节,所以我不一定要使用任何预制模块。此外,我已经使用MATLAB多年了,我喜欢用其他人没有真正尝试过的做事的挑战。
现在针对手头的问题:我希望合并AI,以便玩家可以对抗计算机。我刚开始考虑如何设计算法来选择方位角,仰角和射弹速度来击中目标,然后每回合调整一次。我觉得也许我一直在思考这个问题并试图让AI在开始时过于复杂,所以我想我会暂停并向社区询问他们如何设计算法的想法。
一些具体问题:
您建议我查看AI设计的具体参考资料吗?
你会设计AI玩家以连续的方式改变难度(难度为0(简单)到1(硬),所有仍然使用相同的通用算法)或者你会设计特定的算法吗?离散数量的AI玩家(就像一个随机方向射击的易敌,或者是一个能够解释风的影响的敌人)?
你会从什么样的数学算法(伪代码描述)开始?
一些额外的信息:我用来模拟抛射物运动的模型包含了流体阻力和风的影响。 “流体”可以是空气或水。在空气中,基于一些简单的大气模型,空气密度(以及阻力的影响)随着地面高度的变化而变化。在水中,阻力非常大,以至于弹丸通常需要额外的推力。换句话说,射弹可能受到除重力之外的力的影响。
答案 0 :(得分:4)
在真实的炮兵情况下,所有这些因素都可以通过公式或简单的蛮力模拟来处理:发射电子炮弹,施加所有相关力量并查看其落地位置。调整并再试一次,直到电子外壳击中目标。现在你有你的号码发送到枪。
鉴于情况的复杂性,我怀疑没有比蛮力更好的答案。虽然你可以预先计算一个预期拖曳效果与速度的表格,但我看不出它是值得的。
当然,每次AI掉落头顶的第一个外壳的游戏都不会有趣。一旦你知道正确的值,你将不得不使AI成为一个糟糕的镜头。对镜头施加一个随机因子,然后走向目标 - 每次射击时朝向真实目标移动30 +随机(140)%。
编辑:
我同意BCS随着时间的推移改进它的想法。我说过,但后来改变了我的想法,如何写一堆它然后最终忘记把它放回去。它应该是随机组件应该越小越强硬。
答案 1 :(得分:3)
Loren的蛮力解决方案很吸引人,因为它可以通过添加更多迭代来轻松实现“智能调整”。此外,迭代的调整因子可能是智能的一部分,因为某些值会使其收敛得更快。
对于基本系统(无拖拽,风等),还有一种封闭的形式解决方案,可以从基本的物理文本中获得。我会做出第一个猜测,然后每回合做一次或多次迭代。您可能想尝试并提出经验校正相关性以改善第一次拍摄(这将使第一次拍摄分布平均更接近正确)
答案 2 :(得分:3)
感谢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的“智能”度量。一个“哑”的AI会有nSims = 0,并且每回合都会做一个新的猜测(根据前一轮的结果)。 “智能”人工智能会通过模拟弹丸飞行来改善每回合的猜测nSims次数。
另外还有两个问题:
1)get_new_guess函数有什么用途?我应该如何调整三个镜头参数以最小化到目标的距离?例如,如果射击距离目标不足,您可以尝试通过仅调整仰角,仅调整射弹速度或将它们一起调整来使距离更近。
2)对于所有AI,get_new_guess是否应该相同,nSims值是“智能”的唯一决定因素?或者get_new_guess应该依赖于另一个“智能”参数(如guessAccuracy)?
答案 3 :(得分:3)
炮兵游戏和真实炮兵情况之间的区别在于所有方面都有100%的信息,并且通常有超过2个对手。
因此,您的评估功能应该考虑哪个对手更难以尝试和消除。例如,如果我有90%的轻松杀戮,但是有人有50%的机会试图杀死我并且在我附近错过了两次射击,那么处理这个机会就更为重要了。
我认为你需要一些方法来评估每个人在弹药,地点,活动,历史等方面给你带来的风险。
答案 4 :(得分:3)
我现在正在处理您发布的回复:
虽然你有一般的想法我不相信你的方法是可行的 - 即使对于低价值的nSims,它也会收敛得太快。我怀疑你想要在shell之间进行多次get_new_guess迭代,而且很可能需要一些随机化。
即使你可以使用多次迭代,他们也不会擅长不断增加的难度,因为它们将是重要的步骤。在我看来,困难必须通过随机性来处理。
首先,get_initial_guess:
首先,我会有一个将世界划分为区域的桌子 - 难度越大区域越多。这些区域之间的边界将具有预先计算的45,60和60的功率。 75度。做一个测试图,如果一个炮弹击中地形再试一次更高的角度 - 如果75次撞击地形仍然使用它。
初始shell应该在为低边界和高边界给出的值之间以随机功率触发。
现在,对于get_new_guess:
炮弹击中地形了吗?增加角度。我认为需要增加多少功率才能保持相同的距离 - 你需要对此进行测试。
假设它没有砸山,请注意它是短还是长。这给你一个约束。新猜测介于两个边界之间(如果您缺少一个边界,请使用get_initial_guess中表格中的值。)
注意目标所在的低限和高限撞击点之间的百分比,并选择远低于上限和上限之间的功率。
这可能太准确了,可能需要一些随机化。我改变了主意添加一个简单的随机%。相反,应该使用多个随机数来获得钟形曲线。
答案 5 :(得分:1)
另一个想法:我们是否正在处理一次只有一个shell处于活动状态的系统?很久以前我实施了一个炮兵游戏,你有5个桶,每个桶的固定重装时间都超过了最大可能的飞行时间。
有了这个,我发现自己使用了一种在我当前的低限和高限之间范围内发射炮弹的策略。虽然这可能只是一个人类,但我没有使用最佳策略 - 这是实时的,一旦枪管准备好就完成一次回合比确保它尽可能地瞄准更重要,因为它会收敛反正很快。我通常会在第二次齐射时将目标放在目标上,而第三次通常都是命中。 (杀死需要杀死目标中的 ALL 像素。)
在人工智能的情况下,我会对此进行建模,并采取一种策略来阻止一些发射后更准确的发射。我仍然会在目标范围内射击,唯一的问题是我是否会使用所有的桶。
答案 6 :(得分:1)
我个人创建了这样一个系统 - 用于网络游戏Zwok,使用蛮力。我在随机方向射击很多镜头并记录了最好的结果。我不建议以任何其他方式进行,因为时间步长等之间的差异会给你带来意想不到的结果。