Pool Billiard AI

我用Java实现了一个游泳池台球游戏,一切正常。这是一个多人游戏,但是,它也应该可以单独玩。为此,我试图实现一个简单的KI。此刻,KI只是随意选择一个方向和一个随机强度的脉冲(不知道正确的英语单词)。当然,这个AI非常差,不太可能挑战玩家。 所以我想改善KI,但有几个难以解决的问题。首先,我想到只选择最近的球并尝试将其直接放入最近的洞中。这并不是那么糟糕,但如果在其他球之间有其他球,它就不再有效了。另外,这不能解决计算脉冲强度的问题。 那么有什么一般建议吗?还是有什么想法?最佳做法?     
已邀请:
计算游戏的一个“移动”结果需要多少CPU时间和内存?你能负担得起分析一个以上的举动吗?如果它相对便宜,只需选择N个随机方向/脉冲,计算结果并选择最佳结果。你可以消除一些“棘手”的情况,当球在太多碰撞后进入口袋时。此外,为了简化,您可以限制每次移动的模拟时间(即,不要等到所有球停止,只是计算前T秒)。 这样,您就可以拥有不同级别的计算机玩家 - 较高的N(和T)对应较高的游戏等级。     
根据台球的比赛,你通常有两个任务 评估桌面上的情况(获得可能的镜头) 在完美的情况下(完美的目标,完美的投篮)所有可能的投篮同样很难,如果你只考虑直接击球到一个球,你将需要分析最多6洞xn球情况(分析简单的教规 - 击中两个球只需要额外的n ^ 2个球×6个洞的情况)。对于这些情况中的每一种,确定它们是否可能需要简单的分析(除非您正在进行非常逼真的碰撞模拟)。因此,在非常简单的模拟中,您可能希望尝试构建所有可能的情况并对它们进行排名。要分析离开银行的镜头,你可能想要镜像球和洞。 或者,在列举可能的情况时,您可以简单地对表进行线扫描,标记对于镜头非法的区域,并枚举和构建潜在的镜头,如...... angle1,ball1,pocket2 angle2,ball1,pocket3 angle3,ball1,ball2,pocket1 angle4,cushion2,ball2,pocket1 对于更好的AI你想要模拟不完美,例如通过在某个点x(可能被定义为远离直接命中的角度)击球来进行击球,让我们假设会出现错误(由于目标不好,或者dx的坏命中或其他任何东西 - 这反过来会导致球在方向上出现错误,该错误将随着到口袋的距离而增加。这提供了一种通过难度对镜头进行排名的方法 - 镜头在目标/镜头中的误差方面的敏感度(一些镜头比其他镜头更容易)。这将取决于从白色到球以及从球到洞的路径长度。 另外还要注意的是白洞进入洞中的风险,或其他非法击球 选择镜头(不仅基于难度,还基于潜在收益) 你也需要看一下这个策略(一个简单的镜头可能会让你在下一轮没有任何东西) 第一次射击不仅有多容易,而且第二次射击有多难(为此你可以再次对模拟情况进行评估,在这里你可以让玩家更强或更弱,这取决于如何很多镜头他都能向前看;你也可以给你的球员个性 - 首先寻找解决方案深度或先寻找解决方案深度 在选择策略时,你应该寻找难度之和最小的镜头组合(你可能需要考虑后期镜头的重要性,考虑到你会错过的概率) 根据游戏你可能会考虑引入纯粹位置游戏的安全镜头,目的不是立即掏腰包,而是强迫对手犯错误或为自己缓解情况(还有其他情况下玩这种情况)射击将是有益的 - 例如,当你不能击中任何东西但需要分开几个球或将它们从垫子上移开时。在这种情况下,您需要从最后开始。 所有这一切都变得更加复杂与现实物理:旋转,逼真的碰撞,弹跳,逼真的垫子,提示滑动等。     
我可以想到两种广泛的方法。 列出主球和力水平周围所有可能的提示位置,然后搜索列表以找到第一个让你下沉球的位置。这是一个相当大的列表,您可以通过使用少量的力量级别并排除任何“明显”坏的镜头来修剪它。 向后工作 - 看看桌子上的每个球,看看母球是否可以接触它。然后计算出正确的提示位置和力水平,使其进入洞中。 您可以展开此选项以在树中搜索多球镜头。 我最喜欢解决方案1;它可以让你找到一次可以下沉两个或更多球的情况。     
您可以考虑将球显示为加权图。你可以将口袋作为特殊节点放入口袋。然后根据从母球到特定球和口袋的路径重量选择放入或击打哪个球。也可以通过使用该权重的值来设定脉冲的强度。然后,您可以使用物理引擎来确定是否完全可以拍摄。我从来没有尝试过这样的事情,所以一切都是理论上的,我不知道它是否实际可行。而且,这种方法不包括让球杆或其他球弹跳,所以基本上它只能用于直击。     
我认为这几乎不是随意的。你需要一个物理引擎来模拟球杆,球,保险杠和口袋的相互作用。感觉不像AI,对我来说更像物理。     

要回复问题请先登录注册