A * - это алгоритм, который по своей сути применяется к графу. В вашем случае каждый узел на графике соответствует одной плитке на вашей карте.
Каждое ребро на графике соответствует смежности между двумя тайлами.
Внедрение A * не сложно, но это может быть излишним для вашего использования. Вам нужно беспокоиться об использовании приоритетной очереди, поддержке эвристики и т. Д.
В вашем случае простой поиск в ширину может помочь, если на ваших краях нет веса.
Эскиз грубого алгоритма:
ShortestPath(start, goal):
let queue = new Queue
queue.Enqueue(start)
while (queue is not empty):
let node = queue.Dequeue()
if (node == goal)
break;
else
for each adjacent node, aNode:
// only add unvisited nodes
if (aNode.previous == null)
aNode.previous = node
queue.Enqueue(previous)
if (node != goal) return failure // we never found the goal, so there's no path
// trace back your path into a list structure
let path = new List
while (node != null):
path.Add(node)
node = node.previous
// it's in a backwards order, so reverse it
return path.Reverse()