def dfs(start, end, obstacles=[], show_details=False): # 1. create stack for DFS # 2. visited contains all visited nodes # 3. push start node to stack # 4. pop a node from stack stack = [(start, [start])] visited = set() mov = [(0, 1), (0, -1), (1, 0), (-1, 0)] while stack: (vertex, path) = stack.pop() graph = list( filter(lambda x: isValidCell(x, visited, obstacles), [tuple(map(sum, zip(vertex, dir))) for dir in mov])) if vertex not in visited: if tools.cell_equal(vertex, end): return path visited.add(vertex) for neighbor in graph: stack.append((neighbor, path + [neighbor])) if show_details: canvas.draw_cell(vertex, canvas.COLOR.DARK_GREEN.value) canvas.update() return None
def run_game(): snake_coords = [(1, 2), (1, 1)] apple = get_apple_coord(snake_coords) score = 0 canvas.draw_bg() canvas.draw_grid() canvas.draw_cell_line(snake_coords, canvas.COLOR.DARK_GRAY.value, canvas.COLOR.DARK_GREEN.value) canvas.draw_cell(apple, canvas.COLOR.RED.value) canvas.update() while True: n_coord = next_coord(snake_coords, apple) if not n_coord: print("Game Over! STUCK") return score += move(snake_coords, n_coord, apple, draw=True) if not valid_coord(snake_coords[0], snake_coords[1:]): print("Game Over!") valid_coord(snake_coords[0], snake_coords[1:]) return if len(snake_coords) == TOTAL: print("Game KO!") canvas.draw_grid() return if tools.cell_equal(n_coord, apple): apple = get_apple_coord(snake_coords) canvas.draw_cell(apple, canvas.COLOR.RED.value) canvas.draw_grid()
def bfs(start, end, obstacles=[], show_details=False): # 1. create empty queue for BFS # 2. insert start position to queue # 3. create visited dict containing position:neighbors # 4. remove start from queue and then explore its neighbors # 5. set graph equal to all the available neighbors # 6. if neighbor has not been visited then add to visited{}. Push neighbor to queue. # 7 if neighbor is equal to end return path # 8. color in visited node queue = [] #(1) queue.append(start) #(2) visited = {tools.cell_coordinates(start): None} #(3) while queue: node = queue.pop(0) #(4) graph = tools.graph(node, visited, obstacles) #(5) for neighbor in graph: if tools.cell_coordinates(neighbor) in visited.keys(): #(6) continue visited[tools.cell_coordinates(neighbor)] = neighbor queue.append(neighbor) if tools.cell_equal(neighbor, end): #(7) path = tools.path(visited, tools.cell_coordinates(neighbor)) return path[1:] + [end] if show_details: #(8) canvas.draw_cell(neighbor, canvas.COLOR.DARK_GREEN.value) canvas.update() return None
def cal(start, end, obstacles=[], show_details=False): """ 使用DFS算法搜索路径 :param start: 起点 :param end: 终点 :param obstacles: 障碍 :param show_details: 是否显示细节 :return: 返回路径 """ if tools.cell_equal(start, end): return [] if tools.is_adjacent(start, end): return [end] queue = LifoQueue() mark = {} queue.put(Node(start)) while not queue.empty(): node = queue.get() cell = node.cell parent = node.parent if tools.cal_cell_id(cell) in mark.keys(): # 已经遍历过了 continue mark[tools.cal_cell_id(cell)] = parent if show_details: canvas.draw_cell(cell, canvas.COLOR.DARK_GREEN.value) canvas.update() if tools.cell_equal(cell, end): path = tools.cal_path(mark, tools.cal_cell_id(end)) return path[1:] + [end] adjs = tools.adj(cell, mark, obstacles) for adj in adjs: queue.put(Node(adj, cell)) return None
def cal(start, end, obstacles=[], show_details=False): """ 使用A*算法搜索路径 :param start: 起点 :param end: 终点 :param obstacles: 障碍 :param show_details: 是否显示细节 :return: 返回路径 """ if tools.cell_equal(start, end): return [] if tools.is_adjacent(start, end): return [end] queue = PriorityQueue() start_node = Node(start, 0, Node.cal_h(start, end)) queue.put(start_node, start_node.f) mark = {tools.cal_cell_id(start): None} while not queue.empty(): node = queue.get() adjs = tools.adj(node.cell, mark, obstacles) for adj in adjs: if tools.cal_cell_id(adj) in mark.keys(): continue mark[tools.cal_cell_id(adj)] = node.cell adj_node = Node(adj, node.g + 1, Node.cal_h(adj, end)) queue.put(adj_node, adj_node.f) if tools.cell_equal(adj, end): path = tools.cal_path(mark, tools.cal_cell_id(adj)) return path[1:] + [end] if show_details: canvas.draw_cell(adj, canvas.COLOR.DARK_GREEN.value) canvas.update() return None
def move(snake_coords, n_coord, apple, draw=False): """ 移动一个格子 :param snake_coords: snake_coords :param n_coord: 移动到此格子 :param apple: apple :param draw: 是否更新canvas """ snake_coords.insert(0, n_coord) tail = None if not tools.cell_equal(n_coord, apple): score = 0 tail = snake_coords.pop() else: score = 1 if draw: if tail: canvas.draw_cells([tail, apple], canvas.COLOR.BG_COLOR.value) canvas.draw_cell_line(snake_coords, canvas.COLOR.DARK_GRAY.value, canvas.COLOR.DARK_GREEN.value) return score