Python文本游戏go移动、get拾取命令运行异常问题排查
Python文本游戏移动、拾取功能修复方案
问题根因
- 未定义
current_room变量跟踪玩家当前所在房间,无法判断移动合法性、也无法获取当前房间的可拾取物品 - 命令匹配逻辑硬编码且存在语法错误:仅适配了
go west单条移动指令,get ' '的判断写法完全无法匹配用户输入的get 物品名格式指令 - 嵌套循环逻辑失效:
rooms == rooms['Coat room']判断永远不成立,内层循环从未执行 - 函数调用不匹配:
get_item定义要求传入物品参数,实际调用无传参,且函数内的命令判断逻辑完全错误 - 存在多处笔误:比如Chemical room的North指向小写的
operating room,和全局定义的首字母大写房间名不一致,command == input()用判断符做赋值操作,输入内容无法存储 - 没有统一的命令解析逻辑,所有指令靠硬编码判断,可维护性为0
修复后完整可运行代码
# IT140脚本入门课程文本游戏 # Derek Pruitt 2021/10/01 # 需先执行 pip install pyttsx3 安装依赖 import pyttsx3 engine = pyttsx3.init() # 设置女声 voices = engine.getProperty('voices') engine.setProperty('voice', voices[1].id) # 设置语速 engine.setProperty('rate', 125) # 欢迎语 engine.say('Hello, welcome to my text based game!') print('Hello, welcome to my text based game!') engine.say('what is your name') engine.runAndWait() player = input('请输入你的名字:\n') engine.say(player + ' we welcome you') engine.runAndWait() # 初始化玩家背包 inventory = [] # 房间配置:每个房间的可移动方向、房间内物品 rooms = { 'Cabin': {'West': 'Coat room'}, 'Coat room': {'South': 'Operating room', 'East': 'Cabin', 'item': 'Key'}, 'Operating room': {'South': 'Chemical room', 'North': 'Cabin', 'West': 'Armoire', 'East': 'Prayer room', 'item': 'Oil'}, 'Armoire': {'East': 'Operating room', 'item': 'Crossbow'}, 'Prayer room': {'West': 'Operating room', 'North': 'Sleeping chamber', 'item': 'Holy cross'}, 'Sleeping chamber': {'South': 'Prayer room', 'item': 'The Skinner'}, 'Chemical room': {'North': 'Operating room', 'East': 'Meat room', 'item': 'poison'}, 'Meat room': {'West': 'Chemical room', 'item': 'Cooked meat'} } # 初始化当前所在房间为出生点Cabin current_room = 'Cabin' def show_instructions(): # 打印游戏指令 print("任意时间输入 'Quit' 可退出游戏") print("收集齐6件物品即可获胜,遇到The Skinner则游戏失败") print("移动指令格式:go 方向(支持South/North/East/West,大小写不敏感)") print("拾取物品指令格式:get 物品名") print(f"你当前所在房间:{current_room}") if 'item' in rooms[current_room]: print(f"当前房间可拾取物品:{rooms[current_room]['item']}") print(f"当前背包:{inventory}\n") def get_item(item_name): # 校验当前房间是否有对应物品,有则拾取 if 'item' in rooms[current_room] and rooms[current_room]['item'].lower() == item_name.lower(): inventory.append(rooms[current_room].pop('item')) print(f"已成功拾取{item_name},当前背包:{inventory}") # 胜利条件判断 if len(inventory) == 6: print("恭喜你收集齐所有物品,游戏胜利!") engine.say("Congratulations, you win!") engine.runAndWait() exit() else: print(f"当前房间没有{item_name},请确认物品名是否正确") if __name__ == '__main__': show_instructions() while True: command = input("\n请输入指令:\n").strip() if command.lower() == 'quit': print("游戏退出") break # 解析移动指令 if command.lower().startswith('go '): direction = command.split(' ',1)[1].capitalize() # 判断方向是否合法 if direction in rooms[current_room]: current_room = rooms[current_room][direction] print(f"你已进入{current_room}") # 遇到Boss判断失败 if 'item' in rooms[current_room] and rooms[current_room]['item'] == 'The Skinner': print("你遇到了The Skinner,游戏失败!") engine.say("Game over!") engine.runAndWait() break show_instructions() else: print("该方向无法通行,请输入其他方向") show_instructions() # 解析拾取指令 elif command.lower().startswith('get '): item = command.split(' ',1)[1] get_item(item) # 非法指令 else: print("请输入合法指令") show_instructions()
功能验证说明
- 出生点默认在Cabin,输入
go west可进入Coat room,房间内有Key - 进入Coat room后输入
get Key即可将物品加入背包 - 所有移动、拾取逻辑自动适配所有房间配置,不需要单独硬编码每个房间的指令判断
- 自动触发胜负条件判断,收集6件物品获胜,进入Sleeping chamber遇到The Skinner失败
内容的提问来源于stack exchange,提问作者Derek Pruitt
相关产品推荐
相关产品推荐

