在单个pygame窗口上显示动态列表

时间:2013-11-21 11:55:48

标签: python pygame n-queens

我想使用回溯来模拟n皇后问题。 我每次使用list作为参数调用这个drawboard()函数,如下面的

def show_columns(x): 
    print "columns:", x
    if len(x)!=0:
        draw_board(x)    


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

因此,每次在单独的窗口中显示。下一个窗口仅在完成第一个窗口之后显示,依此类推......

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

我绘制国际象棋棋盘的功能如下

def draw_board(the_board): 
    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")    


    while True:

        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()

    pygame.quit()

1 个答案:

答案 0 :(得分:1)

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

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

然后你将你的用户界面设为:

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()

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