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
相关产品推荐
相关产品推荐

