我一直在阅读tutorial。我在一章中你可以建立一个乒乓球比赛。但是我在尝试制作能够检测球何时击中球拍的功能时遇到了麻烦?
它说我应该这样做:
制作一个布尔函数
hit(bx, by, r, px, py, h)
,当球的垂直坐标(True
)位于球拍的底部和顶部之间时,返回by
,以及球的水平位置(bx
)小于或等于距桨叶前部的半径(r
)。
到目前为止我已尝试过这个:
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
答案 0 :(得分: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
请记住,这并不能说明球是圆形的(或者你想到的其他形状)。
修改强> 如果您在使其工作时遇到问题,可以尝试使用某些打印语句来告诉您参数的值是什么以及返回值是什么。这应该可以让您对实际情况有所了解。
再次编辑: 意识到函数有可能没有返回值。此外,此代码未通过所有测试用例 - 它将第一个作为命中计数。
答案 1 :(得分: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
然而,通过这些计算,我的球没有击中桨。