def GenerateMaze(self, width, height, weights=None): if weights is None: use_weights = False weights = [1, 1, 1, 1] else: use_weights = True theMaze = Maze() theMaze.SetDimensions(width, height) # REWRITTEN AS OF 6/23 # I wrote this from a cell list which prevented me from using bias terms and weights. I've rectified that used_cells = np.zeros([height, width]) walls = [] # choose a start cell current_cell = [ np.random.randint(0, theMaze.height), np.random.randint(0, theMaze.width) ] used_cells[current_cell[0], current_cell[1]] = 1 # create adjacency list borders = theMaze.GetBorders(current_cell) for index in xrange(len(borders)): if borders[index] == 0: new_cell = deepcopy(current_cell) if index == 0: new_cell[0] -= 1 elif index == 1: new_cell[1] += 1 elif index == 2: new_cell[0] += 1 elif index == 3: new_cell[1] -= 1 walls.append([weights[index], current_cell, new_cell, index]) # print "FIRST SET", adjacent_cells, maze_cells while len(walls) > 0: # choose a wall to open if use_weights == False: wall_idx = randint(0, len(walls) - 1) wall = walls[wall_idx] walls.pop(wall_idx) else: index, wall = ValueFromHeap(walls) if self.mVerbosity > 0: print "active wall (weight, from, to, direction): ", wall # ensure the cell this wall refers to is not in the maze prior_cell = wall[1] current_cell = wall[2] if used_cells[current_cell[0], current_cell[1]] == 1: if self.mVerbosity > 0: print " to cell in maze" continue used_cells[current_cell[0], current_cell[1]] = 1 # open the wall wallToOpen = wall[3] rWallToOpen = (wallToOpen + 2) % 4 theMaze.cells[prior_cell[0], prior_cell[1], wallToOpen] = 1 theMaze.cells[current_cell[0], current_cell[1], rWallToOpen] = 1 # create adjacency list borders = theMaze.GetBorders(current_cell) for index in xrange(len(borders)): if borders[index] == 0: new_cell = deepcopy(current_cell) if index == 0: new_cell[0] -= 1 elif index == 1: new_cell[1] += 1 elif index == 2: new_cell[0] += 1 elif index == 3: new_cell[1] -= 1 walls.append( [weights[index], current_cell, new_cell, index]) theMaze.end_cell = [0, 0] theMaze.start_cell = [theMaze.height - 1, theMaze.width - 1] return theMaze
def GenerateMaze(self, width, height, weights=None): # force weights to null for now if weights is None: use_weights = False weights = [1, 1, 1, 1] else: use_weights = True theMaze = Maze() theMaze.SetDimensions(width, height) # REWRITTEN AS OF 6/23 used_cells = np.zeros([height, width]) walls = [] # depth first starts at top left current_cell = [0, 0] used_cells[current_cell[0], current_cell[1]] = 1 # create adjacency list next_walls = [] borders = theMaze.GetBorders(current_cell) for index in xrange(len(borders)): if borders[index] == 0: new_cell = deepcopy(current_cell) if index == 0: new_cell[0] -= 1 elif index == 1: new_cell[1] += 1 elif index == 2: new_cell[0] += 1 elif index == 3: new_cell[1] -= 1 next_walls.append( [weights[index], current_cell, new_cell, index]) if not use_weights: while len(next_walls) > 0: wall_idx = randint(0, len(next_walls) - 1) wall = next_walls[wall_idx] next_walls.pop(wall_idx) walls.append(wall) else: next_walls_heaped = [] while len(next_walls) > 0: index, wall = ValueFromHeap(next_walls) next_walls_heaped.append(wall) next_walls_heaped.reverse() walls += next_walls_heaped # print "FIRST SET", adjacent_cells, maze_cells while len(walls) > 0: wall = walls[-1] walls = walls[:-1] if self.mVerbosity > 0: print "active wall (weight, from, to, direction): ", wall # ensure the cell this wall refers to is not in the maze prior_cell = wall[1] current_cell = wall[2] if used_cells[current_cell[0], current_cell[1]] == 1: if self.mVerbosity > 0: print " to cell in maze" continue used_cells[current_cell[0], current_cell[1]] = 1 # open the wall wallToOpen = wall[3] rWallToOpen = (wallToOpen + 2) % 4 theMaze.cells[prior_cell[0], prior_cell[1], wallToOpen] = 1 theMaze.cells[current_cell[0], current_cell[1], rWallToOpen] = 1 # create adjacency list next_walls = [] borders = theMaze.GetBorders(current_cell) for index in xrange(len(borders)): if borders[index] == 0: new_cell = deepcopy(current_cell) if index == 0: new_cell[0] -= 1 elif index == 1: new_cell[1] += 1 elif index == 2: new_cell[0] += 1 elif index == 3: new_cell[1] -= 1 next_walls.append( [weights[index], current_cell, new_cell, index]) if not use_weights: while len(next_walls) > 0: wall_idx = randint(0, len(next_walls) - 1) wall = next_walls[wall_idx] next_walls.pop(wall_idx) walls.append(wall) else: next_walls_heaped = [] while len(next_walls) > 0: index, wall = ValueFromHeap(next_walls) next_walls_heaped.append(wall) next_walls_heaped.reverse() walls += next_walls_heaped theMaze.end_cell = [0, 0] theMaze.start_cell = [theMaze.height - 1, theMaze.width - 1] return theMaze