mình muốn làm 1 cái NPC auto follow với auto đánh quái cho RPG, chả nghĩ ra cách nào cả nên dùng dijkstra cho NPC tìm đường. Nhưng mà cái algorithm này nọ chậm quá, tầm 300 nodes là lag tung cả lên. Ngồi 1 hồi thì cũng đỡ hơn tí nhưng mà cảm giác cái này nó còn nặng hơn cả cái game của mình. Ai có cách nào chỉ mình optimize với. Nếu không dc nữa thì đi học cái A* quá.
import heapq
class Node:
def __init__(self, x, y):
self.x = x
self.y = y
self.name = str(self.x) + ' ' + str(self.y)
def __str__(self):
return self.name
def __lt__(self, other):
return self.name < other.name
class Graph:
def __init__(self):
self.nodes = []
def add_node(self, node):
if node not in self.nodes:
self.nodes.append(node)
def remove_node(self, posi):
node = self.find_node(posi)
self.nodes.remove(node)
def neighbor(self, node):
result = dict()
if node:
n = self.find_node((node.x-32, node.y))
if n:
result[n] = 1
n = self.find_node((node.x + 32, node.y))
if n:
result[n] = 1
n = self.find_node((node.x, node.y - 32))
if n:
result[n] = 1
n = self.find_node((node.x, node.y +32))
if n:
result[n] = 1
return result
def find_node(self, posi):
for n in self.nodes:
if n.x == posi[0] and n.y == posi[1]:
return n
return None
def find_path(self, node1, node2):
src = self.find_node(node1)
dst = self.find_node(node2)
result = []
distance = {node: None for node in self.nodes}
previous = {}
distance[src] = 0
nodes = []
heapq.heapify(nodes)
heapq.heappush(nodes, (distance[src], src))
while nodes:
current_node = heapq.heappop(nodes)[1]
for node, weight in self.neighbor(current_node).items():
if distance[node] == None or distance[node] > weight + distance[current_node]:
distance[node] = weight + distance[current_node]
previous[node] = current_node
heapq.heappush(nodes, (distance[node], node))
if current_node == dst:
nodes = []
break
node = dst
while node != src:
node = previous[node]
result.append(node)
return result