Python文字冒险游戏中start未定义导致play_again及场景跳转失败问题
问题原因与修复方案
核心报错根源
你遇到的start未定义报错完全由缩进错误导致的函数作用域问题引发,其次是函数定义顺序的逻辑问题:
- 你当前代码里的
start函数缩进级别完全嵌套在Fällan_rum函数内部,属于Fällan_rum的私有内部函数,全局作用域的play_again、game_over都无法访问到这个内部start - 你在
Fällan_rum内部调用start()的位置,在def start()代码执行之前,就算是内部函数也还没完成定义,自然会报错 - 就算修正缩进,你当前的
x是全局变量,重玩游戏时不会重新生成随机数,会导致每次游戏随机结果完全一致 - 调整后
play_again里调用start不会有问题,因为游戏首次启动执行最后一行start()的时候,所有函数都已经完成定义,全局作用域可以正常访问到start函数。
修复步骤
- 调整
start函数的缩进,让它和play_again、Fällan_rum等函数平级,成为全局可访问的函数 - 修正
Fällan_rum内部混乱的缩进,保证所有同层级代码缩进一致 - 把随机数生成逻辑放到
start函数内部,保证每次重玩都会生成新的随机值 - 补充你代码中缺失的
bear_room、monster_room函数定义,否则运行到对应分支会报新的未定义错误
修复后参考代码
import random def play_again(): print("\n你想要重新玩一次吗?(y 或者 n)") answer = input(">").lower() if "y" in answer: start() else: exit() def game_over(reason): print("\n" + reason) print("游戏结束!") play_again() def Fällan_rum(): print("\n你刚踏入黑暗的房间就发现这里根本没有地板!") print("你开始往黑暗中坠落。\n你是想要抓住门框,还是赌坠落距离很短你不会有事?你要怎么做?(1 或者 2)") print("1). 尝试抓住门框") print("2). 赌坠落距离很短不会受伤") answer = input(">") if answer == "1" and x==3: game_over("熊杀死了你。") elif answer == "2" and x==3: print("\n太好了") start() else: game_over("你不知道怎么输入正确的数字吗?") def start(): global x x = random.randint(0,3) print("\n你站在一座废弃的大房子外面。") print("你走进房子看到三扇门:右边一扇、正前方一扇、左边一扇,你要进哪扇门?(h 或者 v 或者 f)") answer = input(">").lower() if "h" in answer: bear_room() # 需自行补充该函数定义 elif "v" in answer: monster_room() # 需自行补充该函数定义 elif "f" in answer: Fällan_rum() else: game_over("你不知道怎么正确输入内容吗?") # 启动游戏 start()
内容的提问来源于stack exchange,提问作者Axel Lundegren
相关产品推荐
相关产品推荐

