Exemplo n.º 1
0
class SpanningTreeWalk():
    def __init__(self, start, target, allow_diagonals, World):
        self.start = Node(start, target, 0, None, World, False,
                          allow_diagonals)
        self.target = Node(target, target, 0, None, World, False,
                           allow_diagonals)
        self.reached = False
        self.stack = [self.start]
        self.visited = []
        self.path = []

        while (not (self.start.is_accessible())):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write('START Tile have no children, choose another one ! ')
            stdout.write("\033[0;0m")
            start = int(input("New START Tile --->  "))
            self.start = Node(start, target, 0, None, World, False,
                              allow_diagonals, True)
        while (not (self.target.is_accessible())):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write('TARGET Tile have no children, choose another one ! ')
            stdout.write("\033[0;0m")
            target = int(input("New TARGET Tile --->  "))
            self.target = Node(target, target, 0, None, World, False,
                               allow_diagonals, True)

        self.path = [self.start.tile_pos]
        self.costs = [0]

    def shortest_path(self):
        while (self.stack):
            current_node = self.stack.pop()

            if current_node == self.target:
                self.reached = True
                self.target = current_node
                break

            else:
                self.visited.append(current_node)
                successors = current_node.successors()

                for node in successors:
                    if ((node not in self.visited)
                            and (node not in self.stack)):
                        node.parent = current_node
                        self.stack.append(node)

        if not (self.reached):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write(
                '========================! NO PATH FOUND !========================='
            )
            stdout.write("\033[0;0m")

    def compute_paths(self):
        if self.reached:
            self.path, self.costs = self.target.reconstruct_path()

    def path_info(self):
        if self.reached:
            print("\nGoal reached.")

            stdout.write("Using DFS, the shortest path between < TILE = " +
                         str(self.start.tile_pos) + " > and < TILE = " +
                         str(self.target.tile_pos) + " > is ")
            stdout.write("\033[1;31m")
            stdout.write("|| " + str(len(self.path)) + " ||\n\n")
            stdout.write("\033[0;0m")

        else:
            print("No path found...\n")
Exemplo n.º 2
0
class AStar():
    def __init__(self, start, target, allow_diagonals, World):
        self.start = Node(start, target, 0, None, World, True, allow_diagonals)
        self.target = Node(target, target, -1, None, World, True,
                           allow_diagonals)

        self.open_nodes = [self.start]
        self.closed_nodes = []

        self.last_node = None

        self.reached = False
        self.available_tiles = World.list_available_tiles()

        while (not (self.start.is_accessible())):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write('START Tile have no children, choose another one ! ')
            stdout.write("\033[0;0m")
            start = int(input("New START Tile --->  "))
            self.start = Node(start, target, 0, None, World, False,
                              allow_diagonals, True)
        while (not (self.target.is_accessible())):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write('TARGET Tile have no children, choose another one ! ')
            stdout.write("\033[0;0m")
            target = int(input("New TARGET Tile --->  "))
            self.target = Node(target, target, 0, None, World, False,
                               allow_diagonals, True)

        self.path = [self.start.tile_pos]
        self.costs = [0]

    def shortest_path(self):
        while self.open_nodes:
            self.open_nodes.sort()  # use __lt__ to sort f values
            current_node = self.open_nodes.pop(0)

            if current_node == self.target:
                self.reached = True
                self.target = current_node
                break

            else:
                self.closed_nodes.append(current_node)

                # get successors (depending on allow_diagonals constructor parameter)
                successors = current_node.successors()

                for s_node in successors:
                    if s_node in self.open_nodes:
                        # pop the node from open_list
                        chosen_one = self.open_nodes.pop(
                            self.open_nodes.index(s_node))

                        if s_node.g_cost < chosen_one.g_cost:
                            self.open_nodes.append(s_node)
                        else:
                            self.open_nodes.append(chosen_one)

                    elif s_node not in self.closed_nodes:
                        self.open_nodes.append(s_node)

        if not (self.reached):
            stdout.write("\033[;1m" + "\033[1;31m")
            stdout.write(
                '========================! NO PATH FOUND !========================='
            )
            stdout.write("\033[0;0m")

    def compute_paths(self):
        if self.reached:
            self.path, self.costs = self.target.reconstruct_path()

    def path_info(self):
        if self.reached:
            print("\nGoal reached.")

            stdout.write("Using A*, the shortest path between < TILE = " +
                         str(self.start.tile_pos) + " > and < TILE = " +
                         str(self.target.tile_pos) + " > is ")
            stdout.write("\033[1;31m")
            stdout.write("|| " + str(len(self.path)) + " ||\n\n")
            stdout.write("\033[0;0m")

        else:
            print("No path found...\n")