Пример #1
0
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
Пример #2
0
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()
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
if __name__ == "__main__":
    canvas.init("BFS")
    canvas.draw_bg()
    canvas.draw_grid()

    start = (6, 5)
    end = (12, 10)
    obstacles = []
    for x in range(4, 10):
        obstacles.append((x, 3))
    for x in range(4, 20):
        obstacles.append((x, 12))
    for y in range(2, 14):
        obstacles.append((10, y))
    for y in range(2, 16):
        obstacles.append((17, y))

    canvas.draw_cell(start, canvas.COLOR.GREEN.value)
    canvas.draw_cell(end, canvas.COLOR.RED.value)
    canvas.draw_cells(obstacles, canvas.COLOR.WHITE.value)
    canvas.update()

    input("Press <Enter> to start!")

    path = bfs(start, end, obstacles, show_details=True)
    canvas.draw_cell_line(path[:-1], canvas.COLOR.DARK_GRAY.value,
                          canvas.COLOR.RED.value)
    canvas.update()

    input("Press <Enter> to close!")