当前位置: 首页 > 知识库问答 >
问题:

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

陆畅
2023-03-14

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

def show_columns(x): 
    print "columns:", x
    if len(x)!=0:
        draw_board(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个答案

秦珂
2023-03-14

您可能需要稍微更改一下程序的原型,以使其与持久化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()

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

 类似资料:
  • 我正在为平台游戏做教程,但我的Pygame窗口显示一个黑屏。 我不知道怎么解决这个问题。 我尝试再次关闭和打开Visual Studio Code,但没有任何结果。

  • 我一直在尝试使用pygame来显示游戏场景,但它似乎已经停止了对我的工作:在pygame关闭之前,它只在我创建的任何屏幕上显示一个灰色框,然后屏幕上应该显示的内容在退出之前短暂闪烁。例如,下面的最小代码显示灰色屏幕5秒钟,然后快速闪烁黑色并退出: 这似乎是屏幕显示的问题,而不是pygame本身的问题,因为我可以使用pg.image制作曲面并将其保存到图像文件中。save(),它们在那里看起来很好。

  • 当我运行我的pyplay程序的游戏窗口显示没有反应,我也写了退出功能,但我不知道为什么它再次广告再次显示没有反应,我的笔记本电脑是Windows 8和32位

  • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。

  • 这是完整的代码,这是一个滚动程序的原型,它被打破了(尽管如此),但是每当我试图点击它时,我都会看到没有响应的窗口

  • 问题内容: 我正在遵循上的示例,但无法在出现的窗口中成功显示字符串。尺寸和标题设置正确,并显示窗口。如果我在控制台上使用paint()方法输出一个字符串,我会看到它实际上被调用了几次,但是该字符串没有出现在我的应用程序窗口中。我看不到与示例有何不同;我实际上少了一些代码(他们添加了鼠标侦听器和按键侦听器):\ 问题答案: 您遇到的问题是您直接在框架顶部绘画。框架还包括框架边框,因此位置0、0(或者