0

我想使用回溯模拟 n 个皇后问题。我每次都用一个列表作为参数调用这个 drawboard() 函数,如下所示

def show_columns(x):
    打印“列:”,x
    如果 len(x)!=0:
        画板(x)    


此列表“x”是从递归过程返回的,因此将在每次迭代后更新

所以每次它都显示在单独的窗口中。只有在关闭第一个窗口后才会显示下一个窗口,依此类推......

如何在单个窗口中制作东西,或者如何在特定时间间隔后自动关闭这些窗口,以便这些窗口一一显示

我绘制棋盘的功能如下

def draw_board(the_board):
    pygame.init()
    颜色 = [(255,178,102), (255,255,255)]
    surface_sz = 480            
    sq_sz = surface_sz // n     
    surface_sz = n * sq_sz      


    表面 = pygame.display.set_mode((surface_sz, surface_sz))
    球 = pygame.image.load("queen.png")    


    而真:

        ev = pygame.event.poll()
        如果 ev.type == pygame.QUIT:
            休息;


        对于范围(n)中的行:           
            c_indx = 行 % 2           
            对于范围内的col(n):       
                the_square = (col*sq_sz, row*sq_sz, sq_sz, sq_sz)
                表面填充(颜色[c_indx],the_square)

                c_indx = (c_indx + 1) % 2


        枚举(the_board)中的(col,row):
          表面.blit(球,
                   (col*sq_sz+ball_offset,row*sq_sz+ball_offset))

        pygame.display.flip()

    pygame.quit()
4

1 回答 1

1

您可能需要稍微更改程序的架构以使其与持久 UI 一起工作。与其让您的模拟代码调用 UI 进行更新,不如让它以相反的方式工作,UI 向 sim 请求新的板状态。

您还没有显示任何 sim 代码,所以我不确定它的实现是什么,但也许您可以将它重构为生成器,一个一个地产生值?

然后你会让你的 UI 变成:

def app():
    pygame.init()
    colors = [(255,178,102), (255,255,255)] 
    surface_sz = 480            
    sq_sz = surface_sz // n     
    surface_sz = n * sq_sz      

    surface = pygame.display.set_mode((surface_sz, surface_sz))
    ball = pygame.image.load("queen.png")    

    the_sim = sim_generator()        # start the simulation

    for the_board in the_sim:        # loop over the values yielded from the simulation
        ev = pygame.event.poll()
        if ev.type == pygame.QUIT:
            break;

        for row in range(n):           
            c_indx = row % 2           
            for col in range(n):       
                the_square = (col*sq_sz, row*sq_sz, sq_sz, sq_sz)
                surface.fill(colors[c_indx], the_square)
                c_indx = (c_indx + 1) % 2

        for (col, row) in enumerate(the_board):
          surface.blit(ball,
                   (col*sq_sz+ball_offset,row*sq_sz+ball_offset))
        pygame.display.flip()            # you might want to add a frame delay
    pygame.quit()

一旦模拟产生其最后一个值,这将退出。如果您希望最终结果在您关闭它之前一直保留在屏幕上,您可以添加一个额外的循环来检查窗口是否关闭而不重绘任何内容。

于 2013-11-21T12:18:44.230 回答