0

バックトラッキングを使用して n クイーン問題をシミュレートしたい。以下のような引数としてリストを使用して、毎回この drawboard() 関数を呼び出しています

デフォルト show_columns(x):
    print "columns:", x
    len(x)!=0 の場合:
        draw_board(x)    


このリスト 'x' は再帰プロシージャから返されるため、各反復後に更新されます

したがって、毎回別のウィンドウに表示されます。次のウィンドウは、最初のウィンドウを閉じた後にのみ表示されます...

単一のウィンドウで物事を作成するにはどうすればよいですか、または特定の時間間隔の後にこれらのウィンドウを自動的に閉じて、これらのウィンドウが 1 つずつ表示されるようにするにはどうすればよいですか

チェス盤を描く私の機能は次のとおりです

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      


    surface = pygame.display.set_mode((surface_sz, surface_sz))
    ボール = pygame.image.load("queen.png")    


    True の間:

        ev = pygame.event.poll()
        ev.type == pygame.QUIT の場合:
            壊す;


        範囲内の行 (n):           
            c_indx = 行 % 2           
            範囲内の列 (n):       
                the_square = (列*sq_sz、行*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(ボール、
                   (col*sq_sz+ball_offset,row*sq_sz+ball_offset))

        pygame.display.flip()

    pygame.quit()
4

1 に答える 1

1

永続的な UI で動作させるには、おそらくプログラムのアーキテクチャを少し変更する必要があります。シミュレーション コードで UI を呼び出して更新するのではなく、逆に、UI がシムから新しいボードの状態を要求するようにします。

sim コードを表示していないため、その実装が何であるかはわかりませんが、値を 1 つずつ生成するジェネレーターにリファクタリングできますか?

次に、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 に答える