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

Python新手开发类Shakes and Fidget游戏遇语法错误与None输出问题

问题分析与代码修正

你的代码存在几个关键问题,导致报错或输出None:

  • 未导入random模块:调用random.randint前必须先导入模块,否则会触发NameError
  • 嵌套函数仅定义未执行:Easy_PT和Easy_FT只是在循环里定义了,但从未调用,战斗逻辑完全没运行
  • 血量扣除未生效:Easy_Health - Pdamage只是计算了数值,没有把结果赋值回变量,需用Easy_Health -= Pdamage这种形式才会修改血量
  • 变量作用域错误:嵌套函数里修改外部函数的变量,需要用nonlocal声明,否则会被当成局部变量处理
  • 字符串拼接错误:数字不能直接和字符串相加,必须用str()转成字符串类型
  • 胜负判断逻辑颠倒:当前代码里Easy_Health !=0时输出胜利,逻辑完全相反,应该是血量≤0时判定胜负
  • print(fightgame())输出None:因为fightgame()没有返回值,默认返回None,直接调用函数即可,无需用print包裹

修正后的代码:

import random

def fightgame():
    Player_Health = 150
    Player_Damage = 7
    Easy_Health = 120
    Easy_Damage = 5
    
    # 循环直到一方血量归0
    while Player_Health > 0 and Easy_Health > 0:
        # 玩家攻击回合
        x = random.randint(1, 10)
        Pdamage = x * Player_Damage
        Easy_Health -= Pdamage
        print(f"你造成了{Pdamage}点伤害!Boss剩余血量: {Easy_Health}")
        
        if Easy_Health <= 0:
            print("Vyhral si.")
            break
        
        # 敌人攻击回合
        y = random.randint(1, 10)
        Edamage = y * Easy_Damage
        Player_Health -= Edamage
        print(f"Boss造成了{Edamage}点伤害!你的剩余血量: {Player_Health}")
        
        if Player_Health <= 0:
            print("Prehral si.")
            break

# 直接调用函数,无需print
fightgame()

if __name__ == "__main__":
    fightgame()

修正说明:

  • 加入import random解决随机数调用问题
  • 把固定次数的for循环改成while循环,直到一方血量≤0才终止战斗
  • 去掉冗余的嵌套函数,直接按回合顺序编写攻击逻辑,避免作用域问题
  • 用-=实现血量的实际扣除
  • 使用f-string做字符串拼接,简洁且避免类型错误
  • 调整胜负判断逻辑,血量≤0时输出对应结果并退出循环
  • 删除print(fightgame()),直接调用函数就不会输出None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:43