Python使用random类触发randrange空范围ValueError错误求助
问题根因
- 初始房间被重置清空:
generateLevel函数执行时先调用resetLevel把rooms数组全部设为0,你在全局预先设置的中心位置初始房间(值为1)直接被清空,findPossibleRooms遍历的时候找不到任何已存在的房间,候选列表始终为空。 - 全局变量未正确声明:
possibleNextRoom是全局变量,在resetLevel、findPossibleRooms函数中修改时没有加global关键字,函数内操作的是局部同名变量,全局的候选列表永远是空,调用random.randrange(0, 0)直接触发报错。 - 候选列表重复追加:
findPossibleRooms每次调用前没有清空旧数据,会反复追加重复坐标,导致后续生成逻辑异常。 - 数组索引越界风险:遍历房间时没有做边界校验,比如r=0时访问r-1会得到负索引,触发数组访问异常。
修复后完整代码
import random import numpy as np class Room: def __init__(self, name, contents): self.name = name self.contents = contents rooms = np.zeros((11, 11)) maxRooms = 7 possibleNextRoom = [] def resetLevel(): global rooms, possibleNextRoom # 清空所有房间 for r in range(len(rooms)): for c in range(len(rooms[0])): rooms[r][c] = 0 # 初始化中心起始房间 halfHeight = int(len(rooms[1]) / 2) halfWidth = int(len(rooms[0]) / 2) rooms[halfWidth][halfHeight] = 1 # 清空候选房间列表 possibleNextRoom = [] def countRooms(): global rooms roomCount = 0 for r in range(len(rooms)): for c in range(len(rooms[0])): if rooms[r][c] == 1: roomCount += 1 return roomCount def findPossibleRooms(): global possibleNextRoom, rooms # 每次重新查找前清空旧候选 possibleNextRoom.clear() max_row = len(rooms) - 1 max_col = len(rooms[0]) - 1 for r in range(len(rooms)): for c in range(len(rooms[0])): if rooms[r][c] == 1: # 四个方向增加边界校验,避免越界 if c + 1 <= max_col and rooms[r][c+1] != 1: possibleNextRoom.append((r, c+1)) if c - 1 >= 0 and rooms[r][c-1] != 1: possibleNextRoom.append((r, c-1)) if r - 1 >= 0 and rooms[r-1][c] != 1: possibleNextRoom.append((r-1, c)) if r + 1 <= max_row and rooms[r+1][c] != 1: possibleNextRoom.append((r+1, c)) def addRoom(): global possibleNextRoom, rooms # 无可用候选时直接返回避免报错 if not possibleNextRoom: return nextRoom = random.randrange(0, len(possibleNextRoom)) rooms[possibleNextRoom[nextRoom][0]][possibleNextRoom[nextRoom][1]] = 1 possibleNextRoom.pop(nextRoom) def generateLevel(): resetLevel() while countRooms() < maxRooms: findPossibleRooms() addRoom() def displayLevel(): print(rooms) generateLevel() displayLevel()
内容的提问来源于stack exchange,提问作者Jedidiah Blitz
相关产品推荐
相关产品推荐

