class Window: def create_grid(self, rows, columns): self.bfs_grid = Grid(self.width, self.height*2//3, rows, columns, self.screen) self.dfs_grid = Grid(self.width, self.height*2//3, rows, columns, self.screen) self.astar_grid = Grid(self.width, self.height*2//3, rows, columns, self.screen) def update_cell(self, row, column, state): self.bfs_grid.update_cell(row, column, state) self.dfs_grid.update_cell(row, column, state) self.astar_grid.update_cell(row, column, state) def create_astar(self): self.bfs = AStar(self.bfs_grid, 'BFS') self.dfs = AStar(self.dfs_grid, 'DFS') self.astar = AStar(self.astar_grid, 'AStar') self.active_search = self.bfs self.active_grid = self.bfs_grid def create_buttons(self): l = 10 h = 25 t = self.height*2//3 + 10 w = (self.width-l*4)//3 p = [(l,t,w,h),(l*2 + w,t, w,h),(l*3 + w*2, t,w, h)] self.buttons = [pygbutton.PygButton(p[0], "BFS"), pygbutton.PygButton(p[1], "DFS"), pygbutton.PygButton(p[2], "A*")] def __init__(self, width=500,height=750): pygame.init() self.width = width self.height = height self.screen = pygame.display.set_mode((self.width, self.height)) self.create_buttons() # self.font = pygame.font.SysFont('Arial', 25) self.font = pygame.font.Font('freesansbold.ttf', 16) self.WHITE = (255, 255, 255) self.BLACK = (0, 0, 0) def show_text(self): x = 10 y = self.height*2//3 + 50 text = self.bfs.getStats() self.screen.blit(self.font.render(text, True, self.BLACK), (x, y)) y += 25 text = self.dfs.getStats() self.screen.blit(self.font.render(text, True, self.BLACK), (x, y)) y += 25 text = self.astar.getStats() self.screen.blit(self.font.render(text, True, self.BLACK), (x, y)) def drawPath(self): self.active_search.backtrackPath() pathNodes = self.active_search.bestPath for node in pathNodes[:-1]: ((x,y),s) = node.getID() if node.state != 'goal': self.active_grid.drawPath(x, y) def loop(self): clock = pygame.time.Clock() results = [None, None, None] active_result_index = 0 active_result = results[active_result_index] while True: pygame.event.pump() active_result = results[active_result_index] if active_result == None or active_result.state != 'goal': active_result = self.active_search.iterateAStar() results[active_result_index] = active_result self.screen.fill(self.WHITE) self.active_grid.draw() self.drawPath() self.show_text() for event in pygame.event.get(): if 'click' in self.buttons[0].handleEvent(event): self.active_search = self.bfs self.active_grid = self.bfs_grid active_result_index = 0 if 'click' in self.buttons[1].handleEvent(event): self.active_search = self.dfs self.active_grid = self.dfs_grid active_result_index = 1 if 'click' in self.buttons[2].handleEvent(event): self.active_search = self.astar self.active_grid = self.astar_grid active_result_index = 2 if event.type == pygame.QUIT: sys.exit() for button in self.buttons: button.draw(self.screen) # pygame.display.update(changed_rectangles) is faster pygame.display.flip() # --- Limit to 60 frames per second clock.tick(60)