我用 Java 实现了一个台球游戏,一切正常。这是一个多人游戏,但无论如何,它也应该可以单独玩。为此,我正在尝试实现一个简单的 KI。目前,KI 只是随机选择一个方向和一个随机强度的脉冲(不知道正确的英文单词)。当然,这个 AI 很差,不太可能挑战玩家。
所以我想改进 KI,但有几个难以解决的问题。首先,我想只选择最近的球并尝试将其直接放入最近的洞中。这还不错,但是如果中间还有其他球,它就不再起作用了。此外,这并不能解决计算脉冲强度的问题。
那么有什么一般性的建议吗?或者有什么想法?最佳实践?
计算游戏的一个“移动”结果需要多少 CPU 时间和内存?你能负担得起分析不止一个动作吗?如果这样做相对便宜,只需选择 N 个随机方向/脉冲,计算结果并选择最好的一个。你可以消除一些“棘手”的情况,当球在太多碰撞后进入口袋时。此外,为简化起见,您可以限制每次移动的模拟时间(即不要等到所有球都停止,只需计算前 T 秒)。
这样,您可以拥有不同级别的电脑玩家 - 较高的 N(和 T)对应于较高的游戏级别。
根据台球的游戏,您通常有两个任务
评估桌子上的情况(获得可能的镜头)
在完美场景(完美瞄准,完美击球)中,所有可能的击球都同样困难,如果您只考虑直接击球到一个球,那么您需要分析的最多只有 6 个洞 xn 个球的情况(分析简单的大炮 - 击球两个球只需要额外的 n^2 球 x 6 洞情况)。对于这些情况中的每一种,确定它们是否可能都需要简单的分析(除非您正在进行非常逼真的碰撞模拟)。因此,在非常简单的模拟中,您可能想要尝试构建所有可能的情况并对其进行排名。要分析离岸投篮,您可能需要镜像球和洞。
或者,在列举可能的情况时,您可以简单地对桌子进行线扫描,标记出非法射击的区域并枚举和构建潜在的射击,例如......
角度1,球1,口袋2 角度2,球1,口袋3 角度3,球1,球2,
口袋1 角度4,垫子2,球2,
口袋
1
对于更好的 AI,您希望模拟缺陷,例如通过在某个点 x 击球(可能定义为远离直接击球的角度)来进行击球,让我们假设会有错误(由于瞄准不佳,或dx 的坏击,或任何东西) - 这反过来会导致球的方向错误,该错误会随着到口袋的距离而增加。这提供了一种按难度对击球进行排名的方法 - 击球在瞄准/击球误差方面的灵敏度(有些击球比其他击球更容易)。这将取决于从白球到球以及从球到球洞的路径长度。
还要注意的一件事是白球进入球洞或其他非法击球的风险
选择镜头(不仅基于难度,还基于潜在收益)
我可以想到两种广泛的方法。
列出母球周围所有可能的提示位置和力量水平,然后搜索列表以找到第一个让您下沉球的位置。这是一个相当大的列表,您可以通过使用少量的力级别并排除任何“明显”的坏球来修剪它。
向后工作——看看桌子上的每个球,看看母球是否可以接触到它。然后计算出正确的球杆位置和力量水平,使其进入球洞。您可以扩展它以搜索树中的多球投篮。
我最喜欢解决方案1;它可以让您找到可以一次下沉两个或更多球的情况。
您可能会考虑将球显示为加权图。您可以将其作为特殊节点放入口袋。然后,您根据从母球到特定球和口袋的路径的重量来选择放置或击打哪个球。脉冲的强度也可以通过使用这个权重的值来设置。然后,您可以使用物理引擎来确定是否可以拍摄。我从来没有尝试过这样的事情,所以一切都是理论上的,我不知道它是否实用。此外,这种方法不包括让球杆或其他球弹跳,所以基本上它只适合直接击球。
我认为这几乎不是随机的。您需要一个物理引擎来模拟球杆、球、保险杠和口袋的相互作用。对我来说,它不像人工智能,更像是物理学。