MicroPython开发Pong游戏:球无法与Paddle碰撞反弹问题求助
问题分析与解决方案
核心问题
球无法与Paddle碰撞的关键原因有两个:
- Y轴范围判断逻辑错误:原代码中
aipad > y > aipad+20的写法永远不成立(aipad必然小于aipad+20,没有数值能同时满足大于大值、小于小值),导致碰撞条件从未触发。 - X轴碰撞阈值不准确:原代码中左侧判断
x <5、右侧x>315,但根据Paddle的位置(距边缘5像素、宽度2像素),此时球已经完全越过Paddle,会直接触发得分逻辑,而非碰撞反弹。
修复后的完整代码
import random from pimoroni import Button from time import sleep x = 160 y = 120 p1point = 0 p2point = 0 x_speed = random.choice([-3.0, 3.0]) y_speed = random.choice([-3.0, 3.0]) aipad = 110 plpad = 110 width = 320 height = 240 # 需根据硬件引脚初始化按钮对象 button_up = Button(...) button_down = Button(...) while True: # 碰壁反弹 if x >= width or x <= 0: x_speed *= -1 if y >= height or y <= 0: y_speed *= -1 # Paddle碰撞反弹逻辑(修正版) # 左侧Paddle:X范围5-7,Y范围aipad到aipad+20 if aipad <= y <= aipad + 20 and x <= 7: # 修正球的位置到Paddle边缘,避免穿模 x = 7 # 添加随机反弹角度限制 x_speed = abs(x_speed) + random.uniform(-0.5, 0.5) y_speed += random.uniform(-0.5, 0.5) # 限制速度上限 if abs(x_speed) > 5: x_speed = 5 if x_speed > 0 else -5 if abs(y_speed) > 5: y_speed = 5 if y_speed > 0 else -5 print("左侧碰撞反弹") # 右侧Paddle:X范围313-315,Y范围plpad到plpad+20 elif plpad <= y <= plpad + 20 and x >= 313: # 修正球的位置到Paddle边缘 x = 313 x_speed = -abs(x_speed) + random.uniform(-0.5, 0.5) y_speed += random.uniform(-0.5, 0.5) # 限制速度上限 if abs(x_speed) > 5: x_speed = 5 if x_speed > 0 else -5 if abs(y_speed) > 5: y_speed = 5 if y_speed > 0 else -5 print("右侧碰撞反弹") # 得分逻辑 if x < 0: x_speed = 3 y_speed = random.choice([-3.0, 3.0]) x, y = 160, 120 p2point += 1 sleep(1) if x > width: x_speed = -3 y_speed = random.choice([-3.0, 3.0]) x, y = 160, 120 p1point += 1 sleep(1) # AI控制逻辑(改为以Paddle中心为目标,移动更平滑) if y < aipad + 10: aipad = max(aipad - 4, 0) elif y > aipad + 10: aipad = min(aipad + 4, 220) # 玩家控制逻辑(修复语法错误) if button_up.is_pressed: plpad = max(plpad - 3, 0) if button_down.is_pressed: plpad = min(plpad + 3, 220) # 球位置更新 x += int(x_speed) y += int(y_speed) # ... 渲染游戏界面代码 ...
关键修改点说明
- 修正Y轴碰撞条件:将反向的范围判断改为
aipad <= y <= aipad+20,确保球的Y坐标落在Paddle的高度范围内时触发碰撞。 - 调整X轴碰撞阈值:根据Paddle的宽度(2像素),左侧碰撞阈值设为
x <=7(Paddle右边缘),右侧设为x >=313(Paddle左边缘),保证在球接触Paddle时就检测碰撞。 - 添加位置修正:碰撞时将球的X坐标强制设置为Paddle的边缘,避免球嵌入Paddle内部导致连续碰撞或穿模。
- 优化速度逻辑:保留随机反弹角度的同时,通过
abs()确保X轴反弹方向正确,限制速度上限避免失控;AI控制改为以Paddle中心为目标,移动更平滑。 - 修复语法错误:为
if button_up.is_pressed添加缺失的冒号。
内容的提问来源于stack exchange,提问作者Commodore 64
相关产品推荐
相关产品推荐

