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

战斗函数运行异常:攻击未扣敌方生命值,移变量遇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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:52:07