Я пытаюсь кодировать визуализатор 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)
Я попытался отладить это, и я думаю, что проблема может заключаться в том, что сценарий никогда не находит конечный узел, поскольку я видел, как некоторые позиции узлов становятся отрицательными, чего они не должны делать, потому что это означает, что они находятся за пределами сетки. Я не уверен, почему это так, и я не могу найти ошибку