如何检测乓球游戏中球何时击中挡板?

2 投票
2 回答
2012 浏览
提问于 2025-04-16 05:50

我最近在看这个教程,里面有一章教你怎么做一个乒乓球游戏。不过我在写一个函数时遇到了麻烦,这个函数需要能检测球什么时候碰到球拍。

教程里说我应该这样做:

写一个布尔函数 hit(bx, by, r, px, py, h),这个函数会在球的垂直坐标(by)在球拍的上下边界之间,并且球的水平位置(bx)距离球拍前面小于或等于半径(r)时返回 True

到目前为止,我尝试了这个:

def hit(bx, by, r, px, py, h):
    if by > py and by <= h:
        if bx <= r:
            return True
    else:
        return False

...

# If this returns True then change the direction of the ball (dx).
if hit(ball_x, ball_y, radius, paddle_x, paddle_y, height):
    dx *= -1

我在把上面那段话翻译成代码时遇到了困难。我哪里做错了?

注意:这个函数的预期输出应该是:

hit(760, 100, 10, 780, 100, 100)
    False

hit(770, 100, 10, 780, 100, 100)
    True

hit(770, 200, 10, 780, 100, 100)
    True

hit(770, 210, 10, 780, 100, 100)
    False

2 个回答

1

这是我的“命中”代码:

def hit(bx, by, r, px, py, h):
    if bx >= px - r and py <= by <= py + h:
        True
    else:
        False

这段代码在我们测试的数值上似乎是有效的。不过,当我把它放到我修改过的游戏里(在“while True”这一部分)时,

hit(ball_x, ball_y, 10, paddle_x, paddle_y, 50)
#10 and 50 are the width and height of my paddle

但是,按照这些计算,我的球并没有击中挡板。

2

你没有考虑到物体的实际位置——你现在的坐标只是指球和挡板上的一个特定点。你的代码检查的是球是否在挡板上方,并且球的半径是否大于从y轴原点到挡板的距离,然后再检查球的宽度是否大于从x轴原点到挡板的距离。

假设(px, py)是挡板的左上角,你可以试试下面这样的代码:

def hit(bx, by, r, px, py, h):
    if by >= py and by <= py + h:
        print "Y satisfied."
        if bx <= px + r:
            print "HIT"
            return True
        print "X not satisfied."
    print "not hit."
    return False

不过要记住,这段代码没有考虑到球是圆的(或者你想象中的其他形状)。

补充: 如果你在让它正常工作上遇到问题,可以试着加一些打印语句,这样你就能看到参数的值和返回值是什么。这应该能帮助你了解实际发生了什么。

再次补充: 我意识到这个函数可能没有返回值。而且,这段代码并没有通过所有的测试用例——它把第一个当作命中处理了。

撰写回答