如何在乒乓球比赛中预测球的轨迹,对于AI球拍预测?

2024-10-02 16:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个更加数学化的问题,但我正试图弄清楚如何为乒乓球比赛编程一个无与伦比的人工智能。从我到目前为止所读到的内容来看,这将是模拟一个球在朝向AI挡板的方向移动时的轨迹

在这个游戏中,我有一个球,我可以读取它在棋盘上的x和y位置,然后在下一次迭代中再次读取,这将允许我计算x和y方向的速度

但是我不知道如何规划球在何处到达AI桨手的球门位置,并考虑球从墙上反弹的次数将要求我使用一些几何图形。但我无法理解它以及我将如何编程

到目前为止,我想到的是我得到的变量:x和y方向上的表的大小,“当前”和之前的球的位置,以获得x和y方向上的速度。我的第一个假设是找到一种方法来计算球是否会击中墙壁或AI球门一侧


Tags: 游戏内容棋盘轨迹编程数学方向人工智能
1条回答
网友
1楼 · 发布于 2024-10-02 16:28:41

有一种更直接的方法来代替重复的“光线投射”:

def predict(x, y, vx, vy, h, b):
    """
    :param x: ball x position
    :param y: ball y position
    :param vx: ball x velocity
    :param vy: ball y velocity
    :param h: the field height
    :param b: the y position the prediction is for
    :return: ball x position at y = b
    """
    m = vy / vx # slope
    c = -x * m + y # y-intercept
    val = (m * b + c) % (2 * h)
    return min(val, 2 * h - val)

现在,一步一步

m = vy / vx # slope
c = -x * m + y # y-intercept
val = (m * b + c)

显示球当前路径的简单线性函数

这是可行的,但前提是球永远不会碰到边墙

模型

想象一下,在原始场的两侧有相同高度的场,延伸到无限远

现在“反弹次数”变成了“球移动的细胞数”

此外,如果反弹次数为偶数,则从碰撞单元的下边界到碰撞点的距离与实际球在真实单元中碰撞的高度相同

所以

(m * b + c) % (2 * h)

为了覆盖奇数反弹,您需要围绕h镜像图形

下面是一个图形说明:

A graphic explanation

由于不相关图的值大于h,因此取最小值

可能的问题

在某些语言中,%是一个余数运算符,但不是python

如果预测在某些情况下为负值,则添加此项

val = ((m * b + c) % (2 * h) + 2 * h) % (2 * h)

此功能取决于“精确”碰撞

因此,如果反弹的处理方式与此类似

if y not in range(0, y_max):
    vy *= -1

预测结果将略有偏差

如果您可以更改核心游戏,请使用

if y < 0:
    y *= -1
    vy *= -1
elif y > y_max:
    y = 2 * y_max - y
    vy *= -1

如果vx为0,将抛出一个divide by zero exception,但由于在这种情况下球永远不会碰到墙,因此这应该由球移动逻辑处理

相关问题 更多 >