台球台AI

9 algorithm math physics billiards

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

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

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

Igo*_*kon 7

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

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

  • 我喜欢这个解决方案有两件事.首先它是可并行化的,因为您可以一次轻松计算3/4个不同的选项.其次,不是选择N,而是选择一个时间并在达到时停止计算,从而保证永远不会花费太长时间(这很好). (2认同)

Unr*_*son 5

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

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

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

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

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

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

  • 另外还要注意的是白洞进入洞中的风险,或其他非法击球

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

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