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

Python开发地牢游戏时字典与numpy数组相关IndexError无法解决

问题原因
  • 直接触发报错的语法逻辑错误:你在findExits函数中编写的判断语句存在语法问题,当前代码rooms[world[f"room{counter}"].coords[0]] + 1 == 1的执行逻辑是:先从numpy二维数组rooms中取出第coords[0]行的完整一维数组,再将这个数组整体加1后和1判等,最终会得到一个布尔类型的numpy数组。Python的if语句无法直接将布尔数组作为判断条件,numpy因此抛出该IndexError。
  • 循环逻辑错误:findExits的遍历循环中,counter变量没有自增逻辑,循环过程中永远只会访问room1,无法遍历所有房间。
  • 隐性索引顺序错误:你在makeRoomsForLevel函数中,判断rooms[c][r] == 1时才生成房间,同时给Room的coords属性赋值为(r, c),说明rooms的第一维索引对应coords的第二个值,第二维索引对应coords的第一个值,直接用coords[0]作为rooms的第一维索引会导致后续出口判断逻辑完全不符合预期。
修复方案

首先修正findExits函数的逻辑,以下是可运行的参考实现:

def findExits():
    # 先建立坐标到房间名的映射,避免每次遍历找房间,提升效率
    coord_to_room = {v.coords: k for k, v in world.items()}
    for room_name in world:
        current_room = world[room_name]
        r, c = current_room.coords
        # 四个方向分别判断,存在相邻房间则添加对应出口
        # 北方:c坐标减1
        if c > 0 and rooms[c-1][r] == 1:
            current_room.exits["N"] = coord_to_room[(r, c-1)]
        # 南方:c坐标加1
        if c < 10 and rooms[c+1][r] == 1:
            current_room.exits["S"] = coord_to_room[(r, c+1)]
        # 西方:r坐标减1
        if r > 0 and rooms[c][r-1] == 1:
            current_room.exits["W"] = coord_to_room[(r-1, c)]
        # 东方:r坐标加1
        if r < 10 and rooms[c][r+1] == 1:
            current_room.exits["E"] = coord_to_room[(r+1, c)]

同时建议额外修复一个隐性bug:将generateLevel函数中的global x声明删除,你并没有用到全局变量x,该声明反而会和其他地方的局部变量x产生冲突。

内容的提问来源于stack exchange,提问作者Jedidiah Blitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:36:04