树莓派Sense Hat太空侵略者项目如何检测不同函数内两个变量是否相等
问题核心原因
moveship函数中修改ly变量时未声明global,导致全局ly变量始终未被更新,spawnEnemyShip中读取的ly永远是初始值None,无法完成匹配- 碰撞检测仅判断了y坐标一致,未校验x坐标是否相同,就算y坐标对上x坐标不对也会误判
- 当前激光发射是单阻塞循环,发射过程中没有同步做碰撞检测,只有激光完全飞出屏幕后才会走后续逻辑,检测时机错误
- 敌人生成和移动逻辑是单阻塞任务,运行时会阻塞摇杆事件响应,需要单独开线程运行
修改后的完整代码
from sense_hat import SenseHat from random import randint from time import sleep import threading sense = SenseHat() # 玩家坐标 x = 4 y = 7 # 颜色定义 g = (64, 64, 64) # 背景 p = (0, 255, 0) # 玩家 l = (255, 0, 0) # 激光 s = (0, 0, 255) # 敌人 # 全局状态变量 sy = None # 敌人y坐标 sx = None # 敌人x坐标 ly = None # 激光y坐标 lx = None # 激光x坐标 enemy_alive = False # 敌人是否存活 sense.clear(g) sense.set_pixel(x, y, p) def moveship(event): global x, y, p, g, l, ly, lx, sx, sy, enemy_alive if event.action == "pressed": if event.direction == "left" and x > 0: sense.set_pixel(x, y, g) x -= 1 sense.set_pixel(x, y, p) elif event.direction == "right" and x < 7: sense.set_pixel(x, y, g) x += 1 sense.set_pixel(x, y, p) elif event.direction == "up" and y > 0: # 发射激光前记录当前发射的x坐标 lx = x ly = y for i in range(7): ly -= 1 sense.set_pixel(lx, ly, l) # 每帧激光移动后检测碰撞 if enemy_alive and lx == sx and ly == sy: print("击中敌人!") enemy_alive = False sense.set_pixel(sx, sy, g) sense.set_pixel(lx, ly, g) break sleep(0.05) sense.set_pixel(lx, ly, g) def spawnEnemyShip(): global x, y, g, s, sx, sy, enemy_alive while True: if not enemy_alive: # 生成新敌人 sx = randint(0,7) sy = 0 enemy_alive = True # 敌人移动逻辑 while enemy_alive and sy < 8: sense.set_pixel(sx, sy, s) sleep(0.5) sense.set_pixel(sx, sy, g) # 检测是否被激光击中 if enemy_alive and lx == sx and ly == sy: print("it works") enemy_alive = False break sy += 1 # 敌人走到屏幕底部没被击中,重置状态 enemy_alive = False sleep(1) sense.stick.direction_any = moveship # 开单独线程运行敌人生成逻辑,避免阻塞摇杆事件 enemy_thread = threading.Thread(target=spawnEnemyShip, daemon=True) enemy_thread.start() # 主线程保持运行 while True: sleep(1)
关键修改说明
- 新增全局变量存储敌人x坐标
sx、激光x坐标lx、敌人存活状态enemy_alive,避免碰撞检测漏判 moveship函数中新增global ly声明,保证修改的是全局激光y坐标变量- 激光发射的每一步、敌人移动的每一步都同步做碰撞校验,只要x、y坐标同时匹配就触发击中逻辑
- 新增单独线程运行敌人生成和移动逻辑,避免阻塞摇杆事件响应
内容的提问来源于stack exchange,提问作者ahem11
相关产品推荐
相关产品推荐

