求助:如何修复PyCharm中文本游戏代码的三类警告?
代码警告修复方案
1. 解决"Local variable might be referenced before assignment"警告
问题根源:当用户输入仅单个单词(比如只输入Go或Get)时,direction和item变量未被赋值,但后续代码仍尝试调用它们,触发未定义引用警告。
修复步骤:
- 在拆分输入后,先初始化
direction和item为None,避免未赋值就引用的情况 - 在
Go和Get的逻辑分支里,先检查参数是否存在,再执行后续操作
2. 解决"Too broad exception clause"警告
问题根源:原代码用except Exception:会捕获所有类型异常(包括KeyboardInterrupt这类系统级异常),会隐藏潜在问题,不符合编程最佳实践。
修复方法:
- 捕获具体异常类型:处理房间移动时,捕获
KeyError(仅当方向不在当前房间的可用方向列表中时触发);处理物品获取时,用dict.get()方法替代直接键访问,无需捕获异常,通过判断返回值是否为None即可处理物品不存在的情况
完整修复后的代码
# Name Here # 显示游戏目标和操作指令 def show_instructions(): print('The Serial Killer Cadet') print('------------------------------') print('你是警校的一名警员,决心逮捕一名沦为危险连环杀手的学员。') print('在面对连环杀手前收集6件关键物品即可获胜,否则会被杀害!') print('------------------------------') print('移动指令:go North, go East, go South, go West') print('收集物品:get [物品名称]') print('退出游戏:"Exit"') print('------------------------------') # 调用指令显示函数 show_instructions() # 显示玩家当前状态 def show_status(current_room, inventory): print(f'你现在在{current_room}\n背包:{inventory}') # 房间与物品关联字典 def main(): rooms = { '训练场': {'North': '武器库', 'East': '制服室', 'South': '更衣室', 'West': '犬舍'}, '武器库': {'East': '办公室', 'South': '训练场', 'Item': '警棍'}, '办公室': {'West': '武器库', 'Item': '手铐'}, '制服室': {'North': '宿舍', 'West': '训练场', 'Item': '防弹背心'}, '宿舍': {'South': '制服室', 'Item': '手电筒'}, '犬舍': {'East': '训练场', 'Item': '警犬'}, '更衣室': {'North': '训练场', 'East': '地下室', 'Item': '泰瑟枪'}, '地下室': {'West': '更衣室', 'Villain': '连环杀手'} # 反派所在房间 } # 玩家初始位置在训练场 current_room = '训练场' # 初始化背包 inventory = [] # 游戏主循环 while True: # 显示玩家状态 show_status(current_room, inventory) # 提示当前房间的物品 if 'Item' in rooms[current_room]: nearby_item = rooms[current_room]['Item'] if nearby_item not in inventory: if nearby_item[-1] == 's': print(f'你看到了{nearby_item}。') else: print(f'你看到了一个{nearby_item}。') print('------------------------------') # 遭遇反派 if 'Villain' in rooms[current_room]: # 失败条件 if len(inventory) < 6: print( '你被连环杀手杀害了...游戏结束!\n' '感谢游玩,希望你玩得开心 (:') break # 胜利条件 else: print( '恭喜!你成功逮捕了连环杀手学员!\n感谢游玩,希望你玩得开心 (:') break # 获取玩家输入 user_input = input('请输入你的操作:\n') # 拆分输入内容 next_move = user_input.split(' ') # 提取操作指令 action = next_move[0].title() # 初始化变量,避免未赋值引用 direction = None item = None if len(next_move) > 1: direction = next_move[1].title() item = ' '.join(next_move[1:]).title() # 移动逻辑 if action == 'Go': if not direction: print('请指定移动方向(North/East/South/West)!') continue try: current_room = rooms[current_room][direction] print(f'你向{direction}方向前进。') # 仅捕获方向不存在的异常 except KeyError: print('你不能往这个方向走!') # 收集物品逻辑 elif action == 'Get': if not item: print('请指定要收集的物品名称!') continue room_item = rooms[current_room].get('Item') if item == room_item: if item not in inventory: inventory.append(room_item) print(f'你获得了{item}!') else: print(f'你已经拥有{item}了。') else: print(f'找不到{item}。') # 退出游戏 elif action == 'Exit': break # 无效指令 else: print('无效指令,请重新输入!') if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Drayn
相关产品推荐
相关产品推荐

