Основная проблема здесь заключается в том, что алгоритм A * должен учитывать тот факт, что существует различие между «нахождением в положении (x, y), обращенным в направлении d 1 » и «бытием в положении (x, y), обращенном в направлении d 2 . " Если алгоритм этого не знает, он не сможет дать вам лучший набор инструкций, которым нужно следовать.
Один из способов решения этой проблемы - представить, что ваш мир - это не 2D-сетка, а 3D-пространство, состоящее из четырех копий 2D-сетки, уложенных друг на друга. Так же, как ваша позиция в 2D-пространстве состоит из вашей текущей координаты (x, y), ваша позиция в 3D-пространстве состоит из вашей текущей координаты (x, y) в сочетании с направлением, с которым вы сталкиваетесь.
Представьте, что значит перемещаться в этом пространстве. У вас есть два варианта действия, которое вы можете предпринять - «двигаться» или «повернуть на 90 градусов»; Действие «перемещение» переместит вас на один шаг вперед в текущем 2D-срезе, в котором вы находитесь, где «вперед» имеет другое значение в зависимости от того, в каком срезе вы находитесь. Другими словами, «перемещение» заставит вас двигаться чисто в плоскости X / Y, сохраняя ваше направление фиксированным. Операция "поворота" сохранит ваше положение X / Y фиксированным, но изменит плоскость, в которой вы находитесь (в зависимости от того, в каком направлении вы оказались в данный момент).
Если вы явно закодируете эту информацию в своем поиске, A * может использовать ее, чтобы найти лучший путь для вас. Вам нужно будет определить новую эвристику, которая оценивает расстояние до цели. Один из вариантов - предположить, что стен нет, и определить, сколько шагов вам нужно сделать, плюс количество вращений, необходимых для достижения цели. На этом этапе A * может дать вам лучший путь, по которому следует использовать эвристику для поиска.
В целом, многие проблемы вида «У меня есть положение в мире плюс некоторые дополнительные состояния (ориентация, скорость и т. Д.)» Могут быть преобразованы из поиска пути в 2D-пространстве в поиск пути в 3D-пространстве, где ваш третий измерение будет той дополнительной информацией. Или, возможно, он займет до 4D или 5D места, если у вас есть несколько дополнительных частей информации.
Надеюсь, это поможет!