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

求助:如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:16:19