台球人工智能

9
我正在使用Java实现一个台球游戏,一切都很顺利。这是一个多人游戏,但尽管如此,也应该可以独自玩。为此,我正在尝试实现一个简单的KI。目前,KI只是随机选择方向和冲量(不知道正确的英文词汇是什么)。当然,这个AI非常差,不太可能挑战玩家。
所以我考虑改进KI,但有几个难以解决的问题。首先,我想到了只选择最近的球,并尝试将其直接放入最近的洞中。这并不是那么糟糕,但如果在两球之间有其他球,它就不再起作用了。此外,这也没有解决计算冲量强度的问题。
那么,有什么通用建议吗?或者任何想法?最佳实践?
5个回答

7
计算每次“移动”游戏结果需要多少CPU时间和内存?您是否能够分析多个移动步骤?如果成本相对较低,只需选择N个随机方向/冲力,计算结果并选择最佳方案。您可以消除一些“棘手”的情况,例如球在经过太多碰撞后进入口袋。另外,为了简化,您可以限制每个移动步骤的模拟时间(即不要等到所有球停止,只需计算前T秒)。
这样,您就可以拥有不同水平的电脑玩家-更高的N(和T)对应于更高的游戏水平。

2
这个解决方案有两个我喜欢的地方。首先,它是可并行的,因为你可以轻松地同时计算3/4个不同的选项。其次,你可以选择一个时间而不是选择N,在达到时间后停止计算,从而保证永远不会花费太长时间(这很好)。 - Matthieu M.
-1 随机尝试会导致非常糟糕的人工智能。这也表明对于已经内置了数学和物理学的游戏没有深入的了解。 - phkahler
感谢您的建议,但我认为不止一个操作可能不可行,因为它是一台非常慢的设备;) - RoflcoptrException
我也喜欢这个解决方案。人工智能有时会打出糟糕的球,有时会打出好球;你可以通过考虑更多的投篮来增加或减少难度;它是可并行化的;而且,与许多人工智能不同,它并不完美,所以可能真的很有趣去对战。 - BlueRaja - Danny Pflughoeft

5
根据台球游戏,你通常有两个任务:
评估桌面情况(获得可能的击球)
在完美的情况下(完美的瞄准,完美的击球),所有可能的击球都同样困难,如果只考虑直接击打一个球,那么你需要分析的情况最多只有6个洞口x n个球的情况(分析简单的激光 - 击打两个球只需要额外的n^2个球x 6个洞口的情况)。对于这些情况中的每一种,确定它们是否可能需要进行简单的分析(除非你正在进行非常逼真的碰撞模拟)。因此,在非常简单的模拟中,您可能希望尝试构建所有可能的情况并对其进行排序。要分析从银行出手的镜像球和洞口。
或者,在枚举可能的情况时,您可以简单地对桌子进行扫描,标记不合法的击球区域,并枚举和构建潜在的击球,例如...
角度1,球1,袋口2
角度2,球1,袋口3
角度3,球1,球2,袋口1
角度4,垫子2,球2,袋口1
为了更好的人工智能,您需要模拟不完美的情况,例如通过在某个点x处击打球来进行击球,假设会有误差(由于瞄准不准确或击打不好等原因)dx - 这反过来会导致球在方向上出现误差,这种误差会随着到袋口的距离增加而增加。这提供了一种根据困难程度对击球进行排序的方法 - 击球的灵敏度(某些击球比其他击球更容易)。这将取决于从白球到球和从球到洞口的路径长度。
还要看一下白球掉进洞口或其他非法击球的风险。
选择击球(不仅基于难度,还基于潜在收益)。
  • 您需要考虑策略(一个简单的击球可能会让您在下一轮中一无所获)。
  • 不仅要考虑第一杆有多容易,还要考虑第二杆有多难(为此,您可以再次运行模拟情况的评估,并根据玩家能够预测多少杆来使玩家变得更强或更弱;您还可以赋予玩家个性,深度优先或广度优先寻找解决方案)。
  • 在选择策略时,您应该寻找难度之和最小的杆的组合(您可能需要评估后期杆的重要性,并考虑错过的概率)。
  • 根据游戏的不同,您可能需要考虑引入安全杆,这是纯位置比赛,目的不是立即将球袋进,而是要么迫使对手犯错误,要么为自己创造便利的局面(在其他情况下打这样的球也会很有益 - 例如当您无法击中任何东西但需要分裂几个球或将它们移开时)。在这种情况下,您需要从末尾开始思考。
  • 所有这些都会因为逼真的物理效果而变得更加复杂:旋转,逼真的碰撞,反弹,逼真的垫子,球杆滑动等。

1

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

  1. 列出所有可能的球杆周围位置和力度水平的列表,然后搜索该列表以找到让您击入球的第一个位置。这是一个相当大的列表,您可以通过使用少量的力度水平并排除任何“明显”不好的击球来修剪它。

  2. 向后工作--查看桌子上的每个球,并查看球杆是否可以接触它。然后计算出正确的球杆位置和力度水平,使其进入洞中。 您可以扩展此操作以搜索多球射击树。

我最喜欢解决方案1;它可以让您找到能够同时击中两个或更多球的情况。


1
你可能考虑将球显示为加权图。您可以将球袋放置在特殊节点上。然后,您根据从球杆到特定球和球袋的路径的权重选择要放置或击打的球。冲量的强度也可以使用此权重的值来设置。然后,您可以使用物理引擎确定射击是否可能。我从未尝试过这样的事情,所以一切都是理论的,我不知道它是否实用。此外,这种方法不包括球杆或其他球的弹跳,因此基本上只适用于直线射击。

0

我认为这不是纯粹的随机。您需要一个物理引擎来模拟球杆,球,凸起和球袋之间的交互。对我来说,它感觉更像是物理学而不是人工智能。


也许我误解了英文词汇AI ;) 我只是想找到一种更简单的方式/算法来实现一个电脑玩家,它不像随机玩家那么差。 - RoflcoptrException
2
AI是一个缩写,而不是一个单词。你对问题简单程度的判断取决于你对物理学的理解以及你希望在模型中嵌入的忠实度。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接