我想使用回溯来模拟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()
答案 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()
一旦模拟产生最后一个值,这将退出。如果您希望最终结果保留在屏幕上直到您关闭它,您可以添加一个额外的循环,只检查窗口关闭而不重绘任何内容。