台球台AI

时间:2010-05-10 00:49:17

标签: algorithm math physics billiards

我用Java实现了一个游泳池台球游戏,一切正常。这是一个多人游戏,但是,它也应该可以单独玩。为此,我试图实现一个简单的KI。此刻,KI只是随意选择一个方向和一个随机强度的脉冲(不知道正确的英语单词)。当然,这个AI非常差,不太可能挑战玩家。

所以我想改善KI,但有几个难以解决的问题。首先,我想到只选择最近的球并尝试将其直接放入最近的洞中。这并不是那么糟糕,但如果在其他球之间有其他球,它就不再真正起作用了。另外,这并不能解决计算脉冲强度的问题。

那么有什么一般建议吗?还是有什么想法?最佳做法?

5 个答案:

答案 0 :(得分:7)

计算游戏一次“移动”的结果需要多少CPU时间和内存?你能负担得起分析一个以上的举动吗?如果它相对便宜,只需选择N个随机方向/脉冲,计算结果并选择最佳结果。你可以消除一些“棘手”的情况,当球在太多碰撞后进入口袋时。此外,为了简化,您可以限制每次移动的模拟时间(即,不要等到所有球停止,只需计算前T秒)。

这样,您可以拥有不同级别的计算机玩家 - 较高的N(和T)对应较高的游戏等级。

答案 1 :(得分:5)

根据台球的比赛,你通常有两个任务

评估桌面上的情况(获取可能的镜头)

  • 在完美的情况下(完美的目标,完美的投篮)所有可能的投篮同样很难,如果你只考虑直接投篮到一个球,你将需要分析的最多6洞xn球情况(分析)简单的教规 - 击中两个球只需要额外的n ^ 2球×6洞情况)。对于这些情况中的每一种,确定它们是否可能需要简单的分析(除非您正在进行非常逼真的碰撞模拟)。因此,在非常简单的模拟中,您可能希望尝试构建所有可能的情况并对它们进行排名。为了分析岸边的镜头,你可能想要镜像球和洞。

  • 或者在列举可能的情况时,您可以简单地对表进行线扫描,标记对于镜头非法的区域,并枚举和构建潜在的镜头,如......

angle1,ball1,pocket2
angle2,ball1,pocket3
angle3,ball1,ball2,pocket1
angle4,cushion2,ball2,pocket1

  • 对于更好的AI你想要模拟瑕疵,例如通过在某个点x(可能被定义为远离直接命中的角度)击球来进行击球,让我们假设会出现错误(由于dx的目标不好或打击不好,这反过来会导致球在方向上出现错误,这个错误会随着距离口袋的距离而增加。这提供了一种通过难度对镜头进行排名的方法 - 镜头在目标/镜头中的误差方面的敏感度(一些镜头比其他镜头更容易)。这将取决于从白色到球以及从球到洞的路径长度。

  • 要看的另一件事是白洞在洞中的风险,或其他非法击球

选择镜头(不仅基于难度,还基于潜在收益)

  • 你也需要看一下这个策略(一个简单的镜头可能会让你在下一轮没有任何东西)
  • 不仅第一次射击有多容易,而且第二次射击有多难(为此你可以再次对模拟情况进行评估,在这里你可以让玩家变得更强或更弱取决于他能够向前看多少次射击;你也可以给你的球员个性 - 首先寻找解决方案深度或先寻找解决方案深度。
  • 在选择策略时,你应该寻找难度之和最小的镜头组合(你可能需要评估后期镜头的重要性,考虑到你会错过的概率)
  • 根据比赛你可能会考虑引入纯粹位置比赛的安全投篮,目的不是立即掏出球,而是强迫对手犯错或为自己缓解局面(还有其他情况)在玩这样的镜头时会有所帮助 - 例如当你不能击中任何东西但需要分开几个球或将它们从垫子上移开时。在这种情况下,您需要从最后开始。
  • 所有这一切都变得更加复杂,逼真的物理:旋转,逼真的碰撞,弹跳,逼真的靠垫,提示单等。

答案 2 :(得分:1)

我可以想到两种广泛的方法。

  1. 列出主球和力水平周围所有可能的提示位置,然后搜索列表以找到第一个让你下沉球的位置。这是一个相当大的列表,您可以通过使用少量的力量级别并排除任何“明显”糟糕的镜头来修剪它。

  2. 向后工作 - 看看桌子上的每个球,看看母球是否可以接触它。然后计算出正确的提示位置和力水平,使其进入洞中。 您可以展开此选项以在树中搜索多球镜头。

  3. 我最喜欢解决方案1;它可以让你找到一次能够下沉两个或更多球的情况。

答案 3 :(得分:1)

您可以考虑将球显示为加权图。你可以将口袋作为特殊节点放入口袋。然后根据从母球到特定球和口袋的路径重量选择放入或击打哪个球。也可以通过使用该权重的值来设定脉冲的强度。然后,您可以使用物理引擎来确定是否完全可以拍摄。我从来没有尝试过这样的事情,所以一切都是理论上的,我不知道它是否实际可行。此外,这种方法不包括提示或其他球弹跳,所以基本上它只适合直接拍摄。

答案 4 :(得分:0)

我认为这几乎不是随意的。你需要一个physics engine来模拟球杆,球,保险杠和口袋的相互作用。感觉不像AI,对我来说更像是物理。