战斗函数运行异常:攻击未扣敌方生命值,移变量遇UnboundLocalError
问题分析
你的代码核心问题有两个:
- 每次调用
combat()函数时,都会重新把hp、ehp这些全局变量重置为初始值(比如ehp=100),所以你攻击扣血后,递归调用combat()又把敌方血量改回100了,看起来没生效。 - 如果把变量移到函数外,函数里修改这些变量时没加
global声明,Python会默认把它们当成局部变量,就会触发UnboundLocalError。
修正后的代码
# 全局变量初始化放在函数外面,只执行一次 hp = 100 p = 5 ehp = 100 at = 10 hg = 20 def combat(): # 声明要修改的全局变量 global hp, p, ehp print(f'player health {hp}') print(f'enemy health {ehp}') print('1 attack') print('2 heal') m = int(input()) if m == 1: ehp -= 10 # 敌方血量清零时结束战斗,避免无限递归 if ehp <= 0: print('Enemy defeated!') return combat() elif m == 2: p -= at hp += hg combat() # 启动战斗流程 combat()
关键修改点
- 把全局变量的初始化移到函数外部,确保初始值只设置一次,不会每次调用函数都重置数据。
- 函数内用
global声明需要修改的全局变量,避免Python将其误判为局部变量。 - 增加敌方战败的结束判断,防止无限递归调用。
内容的提问来源于stack exchange,提问作者Darrel Duprey
相关产品推荐
相关产品推荐

