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

Pygame中刀具(障碍物)变速功能报错UnboundLocalError求助

这个错误的核心原因是Python的变量作用域规则:当你在函数内部对一个变量进行赋值操作时,Python会默认把这个变量当作局部变量,而你在changeofspeed += 0.001这句里,相当于先读取变量值再赋值,但此时局部的changeofspeed还没被定义,所以抛出UnboundLocalError。

下面是两种可行的解决方法:


方法一:用global关键字声明全局变量

在函数内部开头,明确告诉Pythonchangeofspeed是全局变量,这样函数就能直接修改全局的变量值:

# change of speed for the knives as game progresses
changeofspeed = 0

def obstacle_movement(obstacle_list):
    global changeofspeed  # 声明使用全局变量
    if obstacle_list:
        for obstacle_rect in obstacle_list:
            changeofspeed += 0.001
            obstacle_rect.y -= changeofspeed

            if obstacle_rect.x == 40:
                screen.blit(butcher_knife_surf,obstacle_rect)
            elif obstacle_rect.x == 520:
                screen.blit(knife_surf,obstacle_rect)

        obstacle_list = [obstacle for obstacle in obstacle_list if obstacle.y > -100]
        
        return obstacle_list 
    else: 
        return []

方法二:避免全局变量(更推荐)

全局变量不利于代码模块化和维护,你可以把changeofspeed作为参数传入函数,并返回更新后的值,更符合规范:

# change of speed for the knives as game progresses
changeofspeed = 0

def obstacle_movement(obstacle_list, speed_change):
    if obstacle_list:
        for obstacle_rect in obstacle_list:
            speed_change += 0.001
            obstacle_rect.y -= speed_change

            if obstacle_rect.x == 40:
                screen.blit(butcher_knife_surf,obstacle_rect)
            elif obstacle_rect.x == 520:
                screen.blit(knife_surf,obstacle_rect)

        obstacle_list = [obstacle for obstacle in obstacle_list if obstacle.y > -100]
        
        return obstacle_list, speed_change  # 返回更新后的列表和速度值
    else: 
        return [], speed_change

# 主循环中的调用方式
while True:
    # ... 其他游戏逻辑 ...
    obstacle_list, changeofspeed = obstacle_movement(obstacle_list, changeofspeed)
    # ... 其他逻辑 ...

额外修正提醒

你当前的代码会在遍历每个障碍物时都让changeofspeed自增,若同时存在多个障碍物,速度会瞬间跳升,可能不符合“随游戏进程逐步加速”的预期。如果想让速度按帧递增,应该把changeofspeed += 0.001移到for循环外面:

def obstacle_movement(obstacle_list):
    global changeofspeed
    if obstacle_list:
        changeofspeed += 0.001  # 每帧只递增一次
        for obstacle_rect in obstacle_list:
            obstacle_rect.y -= changeofspeed
            # ... 绘制逻辑 ...

内容的提问来源于stack exchange,提问作者Akhil Voora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:57:14