You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:27:04