Пример #1
0
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)