def test(): with open("tests") as file: grid = Grid() ai = AI(grid, "dfs") lines = file.readlines() for line_i, line in enumerate(lines): print("test {}/{}: ".format(line_i + 1, len(lines))) split = line.split() score = {} score["dfs"] = split[0] score["bfs"] = split[1] score["ucs"] = split[2] score["astar"] = split[3] grid.load(" ".join(split[4:])) for method in ["dfs", "bfs", "ucs", "astar"]: ai.set_type(method) ai.set_search() while not ai.finished: ai.make_step() if not ai.failed: ai.get_result() expected = int(score[method]) actual = ai.final_cost if expected != actual: print( "\t {} FAILED: expected score of {}, actual {}".format( method, expected, actual)) else: print("\t {} PASSED".format(method))
class GridWorld(): def __init__(self): pygame.init() pygame.display.set_caption("Grid World") self.clock = pygame.time.Clock() self.last_tick = pygame.time.get_ticks() self.screen_res = [400, 470] self.font = pygame.font.SysFont("Calibri", 16) self.screen = pygame.display.set_mode(self.screen_res, pygame.HWSURFACE, 32) self.show_checked = True self.quit = False self.type = "dfs" self.grid = Grid(True) self.ai = AI(self.grid, self.type) self.run = False self.pause = False def loop(self): while True: self.draw() self.clock.tick(60) self.mpos = pygame.mouse.get_pos() if self.run and not self.pause: if self.ai.finished: if not self.ai.failed: self.ai.get_result() self.run = False else: self.ai.make_step() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: pygame.quit() sys.exit() if event.key == K_c: self.ai.set_search() self.run = False if event.key == K_RETURN: if not self.run: self.ai.set_search() self.run = True self.pause = False else: self.pause = not self.pause if not self.run: if event.key == K_w: self.grid.save("saved_grid") if event.key == K_l: try: with open("saved_grid") as file: self.grid.load(file.read()) except: print("no saved file present") if event.key == K_m: self.grid.random() if event.key == K_n: self.grid.random_clear() if event.key == K_1: self.grid.clear_path() self.type = "dfs" self.ai.set_type(self.type) if event.key == K_2: self.grid.clear_path() self.type = "bfs" self.ai.set_type(self.type) if event.key == K_3: self.grid.clear_path() self.type = "ucs" self.ai.set_type(self.type) if event.key == K_4: self.grid.clear_path() self.type = "astar" self.ai.set_type(self.type) for node in self.grid.nodes.values(): if node.get_rect(pygame)[1].collidepoint( game.mpos): if event.key == K_p: self.grid.reset() node.make_puddle() if event.key == K_r: self.grid.reset() node.make_grass() if event.key == K_x: self.grid.reset() node.clear() if event.key == K_s: self.grid.reset() self.grid.set_start(node.pos) if event.key == K_g: self.grid.reset() self.grid.set_goal(node.pos) def blitInfo(self): line1 = self.font.render( "Esc: exit; Enter: search/pause; c: clear path; m: random board (clear first)", 1, WHITE) line2 = self.font.render( "s: place start; g: place goal; p: place puddle; r: place grass; x: clear node", 1, WHITE) line3 = self.font.render( "w: save board; l: load board, n: no obstacles", 1, WHITE) line4 = self.font.render("1: DFS, 2: BFS, 3: UCS, 4: A*", 1, WHITE) if self.ai.finished and not self.ai.failed: score = str(self.ai.final_cost) elif self.ai.finished and self.ai.failed: score = "[no path]" else: score = "..." line5 = self.font.render( "Mode: {}; Score: {}".format(self.type, score), 1, WHITE) self.screen.blit(line1, (5, 5)) self.screen.blit(line2, (5, 20)) self.screen.blit(line3, (5, 35)) self.screen.blit(line4, (5, 50)) self.screen.blit(line5, (5, NODE_W * self.grid.height + OFFSET[1] + 5)) def draw(self): self.screen.fill(0) self.grid.update(self, pygame) self.blitInfo() pygame.display.update()