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
相关产品推荐
相关产品推荐

