代码之家  ›  专栏  ›  技术社区  ›  anon

台球人工智能

  •  9
  • anon  · 技术社区  · 14 年前

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

    所以我想提高KI,但有几个问题很难解决。首先,我想选择最近的球,并试图把它直接放进最近的洞里。这并没有那么糟糕,但是如果在这两个球之间有其他球的话,它就不会再起作用了。此外,这并不能解决计算脉冲强度的问题。

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

    5 回复  |  直到 14 年前
        1
  •  7
  •   Igor Krivokon    14 年前

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

    这样,你就可以拥有不同级别的计算机播放器——较高的N(和T)对应较高的播放级别。

        2
  •  5
  •   Unreason    14 年前

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

    评估桌子上的情况(获取可能的照片)

    • 在完美的情况下(完美的瞄准,完美的射门),所有可能的射门都同样困难,如果你只考虑一个球的直接射门,那么你只需要分析最多6个洞x n个球的情况(分析简单的经典-打两个球只需要额外的n^2个球x 6个球)。LES情况)。对于这些情况中的每一种,确定它们是否可能需要简单的分析(除非您正在进行非常真实的碰撞模拟)。因此,在非常简单的模拟中,您可能希望构建所有可能的情况并对它们进行排序。为了分析银行的放炮情况,你可能需要镜像球和洞。

    • 或者,在枚举可能的情况时,您可以简单地对表进行行扫描,标记对于放炮是非法的区域,并枚举和构建可能的放炮,例如…

    角1、球1、袋2
    角2、球1、袋3
    角3、球1、球2、袋1
    角4,靠垫2,球2,口袋1

    • 对于更好的人工智能,你想模拟不完美,例如,通过在某个点X(可能定义为距离直接命中的一个角度)击球来进行击球,让我们假设dx有一个错误(由于瞄准不好,或命中不好,或任何东西),这反过来会导致球有一个方向错误,该错误将随着到袋的距离而增加。这就提供了一种按难度排列放炮的方法——根据瞄准/放炮中的误差对放炮的敏感度(有些放炮比其他放炮更容易)。这将取决于从白球到球以及从球到洞的路径长度。

    • 还有一件事要注意的是白球进入洞里的风险,或者其他非法射门的风险。

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

    • 你也需要考虑一下策略(一个简单的投篮可能会让你在下一轮中一无所获)
    • 这不仅是第一次击球有多容易,而且第二次击球有多难(为此,你可以再次对模拟的情况进行评估,在这里,你可以让球员变得更强或更弱,这取决于他能向前看多少球;你也可以玩家个性-寻找深度优先或广度优先的解决方案)
    • 在选择策略时,您应该寻找难度总和最小的组合镜头(考虑到您可能会错过的概率,您可能需要评估后面镜头的重要性)
    • 根据比赛情况,你可能会考虑引入安全球,这是一种纯粹的位置式比赛,目的不是立即将球塞到口袋里,而是迫使对手犯错或为自己缓解一种情况(在进行这种击球时,还有其他情况无益的-例如,当你不能击中任何东西,但将需要分裂几个球或移动他们远离垫)。在这种情况下,你需要从最后开始。
    • 所有这些在现实物理中变得更加复杂:旋转、现实碰撞、反弹、现实缓冲、提示滑动等。
        3
  •  1
  •   NXT    14 年前

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

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

    2. 向后看——看桌子上的每一个球,看是否能让球碰到它。然后计算出正确的提示位置和力水平,使其进入孔中。 你可以展开这个搜索树来搜索多个球。

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

        4
  •  1
  •   npinti    14 年前

    你可以考虑将球显示为一个加权图。你可以作为特殊的节点放在口袋里。然后根据球杆到特定球和球袋的路径的重量,选择要放置或击球的球。脉冲的强度也可以通过使用这个重量的值来设置。然后,您可以使用物理引擎来确定是否可以进行放炮。我从来没有尝试过这样的事情,所以一切都是理论上的,我不知道它是否实用。而且,这种方法不包括让球杆或其他球在周围跳动,所以基本上它只适合直杆击球。

        5
  •  0
  •   duffymo    14 年前

    我认为这不是随机的。你想要一个 physics engine 模拟球杆、球、保险杠和球袋的相互作用。我觉得它不像人工智能,更像物理学。