使用Python turtle开发Breakout打砖块游戏,求助paddle与ball碰撞检测代码实现
打砖块游戏 paddle 与 ball 碰撞逻辑实现
核心实现原理
你当前使用的paddle、ball均为无旋转的正方向图形,无需复杂物理算法,通过边界重叠判断即可完成碰撞检测:
- turtle创建的图形坐标系锚定在图形中心点,因此判断碰撞时不能仅比对中心点坐标,需要先算出每个图形的上下、左右四个边界的实际位置。
- 两个方形图形发生碰撞的必要条件,必须同时满足:
- Y轴方向存在重叠:球的底部边界 ≤ 板的顶部边界,且球的顶部边界 ≥ 板的底部边界
- X轴方向存在重叠:球的右侧边界 ≥ 板的左侧边界,且球的左侧边界 ≤ 板的右侧边界
- 判定碰撞触发后,将球的Y方向移动速度反转,即可实现球碰到板后向上反弹的效果。
补全的碰撞检测代码
对应你代码中预留的模块位置,直接粘贴以下内容即可:
# ---------- 预留碰撞检测模块 补全开始 ---------- # 根据你实际创建图形的尺寸修改以下参数 PADDLE_WIDTH = 100 # paddle 总宽度 PADDLE_HEIGHT = 20 # paddle 总高度 BALL_SIZE = 20 # 方形 ball 的边长 # 计算 paddle 的四个边界坐标 paddle_left = paddle.xcor() - PADDLE_WIDTH / 2 paddle_right = paddle.xcor() + PADDLE_WIDTH / 2 paddle_top = paddle.ycor() + PADDLE_HEIGHT / 2 paddle_bottom = paddle.ycor() - PADDLE_HEIGHT / 2 # 计算 ball 的四个边界坐标 ball_left = ball.xcor() - BALL_SIZE / 2 ball_right = ball.xcor() + BALL_SIZE / 2 ball_top = ball.ycor() + BALL_SIZE / 2 ball_bottom = ball.ycor() - BALL_SIZE / 2 # 同时满足X、Y轴重叠即判定为碰撞 if (ball_bottom <= paddle_top and ball_top >= paddle_bottom) and (ball_right >= paddle_left and ball_left <= paddle_right): # 反转Y方向速度,球向上弹 bally = -bally # 将球向上偏移1个单位,避免速度过快导致球卡入paddle内部反复触发碰撞 ball.sety(paddle_top + BALL_SIZE / 2 + 1) # ---------- 补全结束 ----------
实现注意事项
- 如果你的paddle/ball实际尺寸和代码中的默认值不匹配,需要对应修改
PADDLE_WIDTH、PADDLE_HEIGHT、BALL_SIZE参数,否则会出现碰撞判定提前、滞后的问题。比如你用turtle.shapesize(stretch_wid=1, stretch_len=5)设置paddle时,默认turtle方形原始尺寸为2020,拉伸后总宽度为205=100,总高度为20*1=20,与代码默认参数完全匹配。 - 不要使用“球的Y坐标等于paddle的Y坐标”这类等值判断逻辑,由于球每帧移动速度为3单位,很可能直接越过对应坐标位置,出现漏判;区间重叠的判断逻辑可以覆盖高速移动下的碰撞检测。
- 基础版仅反转Y方向速度即可满足玩法,如果需要实现击球角度随板上位置变化的效果,可在碰撞触发时根据球与板中心的X轴偏移量,动态调整
ballx的数值。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

