2013-11-21 10 views
0

Я хочу, чтобы имитировать проблему n queens с помощью backtracking. Я называю это drawboard() работать каждый раз со списком в качестве аргумента, как показано нижеПоказать динамический список в окне одиночного pygame

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


Этот список «х» возвращается из рекурсивной процедуры и так будет обновлять после каждой итерации

Итак, каждый раз это отображается в отдельных окнах. Следующее окно отображается только после первого перекрытия и так далее ...

Как я могу сделать вещи в одном окне, или как я могу автоматически закрыть эти окна после определенного ti мне интервал, так что эти окна показаны один за другим

Моя функция рисовать шахматная доска выглядит следующим образом

 
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

Вы, вероятно, нужно изменить archetecture вашей программы немного, чтобы заставить его работать с постоянный пользовательский интерфейс. Вместо того, чтобы ваш код моделирования вызывал пользовательский интерфейс для обновления, заставьте его работать наоборот, с пользовательским интерфейсом, запрашивающим новое состояние платы от сима.

Вы не указали какой-либо из ваших сим-кодов, поэтому я не уверен, какова его реализация, но, возможно, вы могли бы реорганизовать его как генератор, давая значения один за другим?

Тогда вы бы сделать ваш пользовательский интерфейс будет:

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

Это будет бросить курить, как только моделирование дает последнее значение. Если вы хотите, чтобы конечный результат оставался на экране, пока вы его не закрыли, вы можете добавить дополнительный цикл, который просто проверяет закрытие окна, не перерисовывая что-либо.

+0

http://stackoverflow.com/questions/20097072/how-to-pass-python-list-dynamically-to-another-python-file – dvs

+0

Aboue - это фактический код – dvs

+0

Получен результирующий список из файла к функции draw_board() – dvs

 Смежные вопросы

  • Нет связанных вопросов^_^