【问题标题】:Pool Billiard AI台球 AI
【发布时间】:2010-05-10 00:49:17
【问题描述】:

我正在用 Java 实现一个台球游戏,一切正常。这是一个多人游戏,但无论如何,它也应该可以单独玩。为此,我正在尝试实现一个简单的 KI。目前,KI 只是随机选择一个方向和一个随机强度的脉冲(不知道正确的英文单词)。当然,这个 AI 很差,不太可能挑战玩家。

所以我想改进 KI,但有几个难以解决的问题。首先,我想只选择最近的球并尝试将其直接放入最近的洞中。这还不错,但是如果中间还有其他球,它就不再起作用了。此外,这并不能解决计算脉冲强度的问题。

那么有什么一般性的建议吗?或者有什么想法?最佳做法?

【问题讨论】:

    标签: algorithm math physics billiards


    【解决方案1】:

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

    这样,你就可以拥有不同级别的电脑玩家——N(和T)越高,游戏级别越高。

    【讨论】:

    • 我喜欢这个解决方案的两点。首先它是可并行化的,因为您可以轻松地一次计算 3/4 个不同的选项。其次,您可以选择一个时间并在到达时停止计算,而不是选择 N,从而保证永远不会花费太长时间(这很好)。
    • -1 随机射击会使 AI 变得非常糟糕。它还没有显示出对应该已经内置数学和物理的游戏的洞察力。
    • 感谢您的建议,但我认为不止一个动作是不可能的,因为它是一个非常慢的设备;)
    • 我也喜欢这个解决方案。人工智能有时会拍出糟糕的照片,有时会拍出很棒的照片;您可以通过考虑更多的镜头来增加或降低难度;它是可并行的;而且,与许多 AI 不同,它并不完美,因此与它对抗实际上可能很有趣。
    【解决方案2】:

    根据台球游戏的不同,您通常有两个任务

    评估桌面上的情况(获得可能的投篮机会)

    • 在完美场景(完美瞄准,完美击球)中,所有可能的击球都同样困难,如果您只考虑直接击球一个球,那么您需要分析的最多只有 6 个洞 xn 个球的情况(分析简单的大炮 - 打两个球只需要额外的 n^2 个球 x 6 个洞的情况)。对于这些情况中的每一种,确定它们是否可能需要简单的分析(除非您正在进行非常逼真的碰撞模拟)。因此,在非常简单的模拟中,您可能想要尝试构建所有可能的情况并对其进行排名。要分析离岸投篮,您可能需要镜像球和洞。

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

    角度1,球1,口袋2
    角度2,球1,口袋3
    角度 3、球 1、球 2、口袋 1
    角度4,坐垫2,球2,口袋1

    • 对于更好的 AI,您希望模拟缺陷,例如通过在某个点 x 处击球来进行击球(可能定义为远离直接击球的角度),假设会出现错误 (由于 dx 的不良瞄准、不良击球或任何其他原因 - 这反过来会导致球的方向错误,该错误会随着到口袋的距离而增加。这提供了一种按难度对击球进行排名的方法 - 击球在瞄准/击球误差方面的灵敏度(有些击球比其他击球更容易)。这将取决于从白球到球以及从球到球洞的路径长度。

    • 还有一点需要注意的是白球进入球洞的风险,或其他非法击球

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

    • 您还需要查看策略(轻松出手可能会让您在下一轮中一无所获)
    • 不仅看第一次射门的难易程度,还看第二次射门的难易程度(为此,您可以再次运行模拟情况的评估,在这里您可以让玩家变得更强或更弱取决于他能够向前看的投篮次数;您还可以赋予您的球员个性 - 寻找解决方案的深度优先或广度优先)
    • 在选择策略时,您应该寻找难度总和最小的击球组合(您可能需要评估后面击球的重要性,同时考虑到您将错过的概率)
    • 根据比赛情况,您可能会考虑引入安全射门,这是纯粹的位置比赛,其目的不是立即将球入袋,而是迫使对手犯错或为自己缓解局势(还有其他情况打这样的球是有益的——例如,当你不能击中任何东西但需要分开几个球或将它们从垫子上移开时)。在这种情况下,您需要从头开始。
    • 所有这一切都随着逼真的物理而变得更加复杂:旋转、逼真的碰撞、反弹、逼真的垫子、球杆滑等等。

    【讨论】:

      【解决方案3】:

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

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

      2. 向后工作——查看桌上的每个球,看看是否可以让母球接触到它。然后计算出正确的球杆位置和力量水平,使其进入球洞。 您可以将其展开以搜索树中的多球投篮。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我认为这几乎不是随机的。您需要physics engine 来模拟球杆、球、保险杠和口袋的交互。对我来说,它不像 AI,更像物理。

          【讨论】:

          • 也许我误解了英文单词 AI ;) 我只是想找到一种或多或少简单的方法/算法来实现一个不像随机播放器那么糟糕的电脑播放器
          • AI 是一个首字母缩略词,而不是一个词。您对问题简单性的判断取决于您对物理学的理解以及您希望嵌入模型中的忠诚度。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 2017-04-04
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多