Python Pathfinder вызывает сбой Pygame - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь кодировать визуализатор A * Pathfinder в python, и у меня есть следующий код в скрипте с именем pathfinder.py.

Функция pathfinder вызывается из другого скрипта, но просто начальная и конечная переменные имеют формат [x, y], а переменная wall - это просто список, содержащий несколько точек одного формата

class Node:
    def __init__(self, parent = None, position = None):
        self.parent = parent
        self.position = position

        self.g = 0
        self.h = 0
        self.f = 0

    def __eq__(self, other):
        return self.position == other.position

def pathfinder(start, end, win, walls=None):
    startNode = Node(None, start)
    startNode.g = startNode.h = startNode.f = 0
    endNode = Node(None, end)
    endNode.g = endNode.h = endNode.f = 0

    openList = []
    closedList = []

    openList.append(startNode)

    while len(openList) > 0:
        currentNode = openList[0]
        currentIndex = 0

        for index, item in enumerate(openList):
            if item.f < currentNode.f:
                currentNode = item
                currentIndex = index
            openList.pop(currentIndex)
            closedList.append(currentNode)

        if currentNode == endNode:
            print("path found")

        children = []
        for newPosition in [[-1, -1], [0, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [0, 1], [1, 1]]:
            childPosition = ([newPosition[0] + currentNode.position[0], newPosition[1] + currentNode.position[1]])

            if [0, 0] > childPosition < [37, 37]:
                continue
            if childPosition in walls:
                continue

            newNode = Node(currentNode, childPosition)

            children.append(newNode)

        for child in children:

            for closedChild in closedList:
                if child == closedChild:
                    continue

            child.g = currentNode.g + 1
            child.h = ((child.position[0] - endNode.position[0]) ** 2) + ((child.position[1] - endNode.position[1]) ** 2)
            child.f = child.g + child.h

            for openNode in openList:
                if child == openNode and child.g > openNode.g:
                    continue

            openList.append(child)

Я попытался отладить это, и я думаю, что проблема может заключаться в том, что сценарий никогда не находит конечный узел, поскольку я видел, как некоторые позиции узлов становятся отрицательными, чего они не должны делать, потому что это означает, что они находятся за пределами сетки. Я не уверен, почему это так, и я не могу найти ошибку

...