def eller_optimized(maze_graphics, maze): dsu = DSU() dsu.set_size(maze.x_size * maze.y_size) #processing the rows except the last for y in range(1, maze.y_size): for x in range(1, maze.x_size): #if random > 0.5 delete wall if dsu.find(x - 1 + (y - 1) * maze.x_size) != dsu.find( x + (y - 1) * maze.x_size) and random.random() > 0.5: dsu.union(x - 1 + (y - 1) * maze.x_size, x + (y - 1) * maze.x_size) maze.set_wall(x, y, x + 1, y, ' ') classes = {} classes_count = {} for x in range(1, maze.x_size + 1): current_class = dsu.find(x - 1 + (y - 1) * maze.x_size) if current_class not in classes: classes[current_class] = [x] classes_count[current_class] = 0 else: classes[current_class].append(x) #maze.set_cell(x, y, current_class) if maze_graphics: input("press enter to continue") maze_graphics.redraw(maze) for x in range(1, maze.x_size + 1): #if random > 0.5 delete wall if random.random() > 0.5: dsu.union(x - 1 + (y - 1) * maze.x_size, x - 1 + y * maze.x_size) maze.set_wall(x, y, x, y + 1, ' ') current_class = dsu.find(x - 1 + (y - 1) * maze.x_size) classes_count[current_class] += 1 for key, val in classes_count.items(): if val == 0: x = random.choice(classes[key]) dsu.union(x - 1 + (y - 1) * maze.x_size, x - 1 + y * maze.x_size) maze.set_wall(x, y, x, y + 1, ' ') current_class = maze.get_cell(x, y) ''' for x in range(1, maze.x_size + 1): current_class = dsu.find(x-1 + y*maze.x_size) maze.set_cell(x, y + 1, current_class) ''' if maze_graphics: input("press enter to continue") maze_graphics.redraw(maze) #the last row processing y = maze.y_size for x in range(1, maze.x_size): if dsu.find(x - 1 + (y - 1) * maze.x_size) != dsu.find(x + (y - 1) * maze.x_size): maze.set_wall(x, y, x + 1, y, ' ') dsu.union(x - 1 + (y - 1) * maze.x_size, x + (y - 1) * maze.x_size) ''' for x in range(1, maze.x_size + 1): current_class = dsu.find(x-1 + (y-1)*maze.x_size) maze.set_cell(x, y, current_class) ''' if maze_graphics: input("press enter to continue") maze_graphics.redraw(maze)