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

