ПРО
№16 (июль) 2011
граммист
АЛГОРИТМЫ списке
клетку
с
наименьшим
F
для
ее
дальнейшего анализа (возвращает порядковый номер открытого списка):
// Родительский ID, для которого ищем соседей int iMasterID = m_aOpenList[iChunkNum].ID; // вычисляем по номеру ячейки ширину и высоту в сетке int iMasterX = iMasterID % WayMap–>GetGridWidth();
int CPathfinding::GetMinWayChunk()
int iMasterZ = iMasterID / WayMap–>GetGridWidth();
{
// проходимся по всем соседям // если открытый список пуст, то мы не нашли путь
for (int i = –1; i <= 1; i++)
if (!m_aOpenList.size())
{ for (int j = –1; j <= 1; j++)
return NOT_FIND_END;
{ // если это и есть ячейка, соседей которых
// ищем в открытом списке клетки с наименьшим F int iMinWay = m_aOpenList[0].F;
// мы ищем, то пропускаем
int ID = 0;
if (!j && !i) continue;
for (unsigned int i=0; i < m_aOpenList.size(); i++) {
int iNeighborX = iMasterX+i;
if (m_aOpenList[i].F < iMinWay)
int iNeighborZ = iMasterZ+j;
{ iMinWay = m_aOpenList[i].F;
// проверка на диапазон и проходимость клетки
ID = i;
if (WayMap–>CheckPassability(iNeighborX, iNeighborZ)) {
}
// если он является диагональным, то можно ли
} // если H этой клетки не 0, то это не конец пути
// пройти в него не срезав углы
if (m_aOpenList[ID].H != 0)
if (WayMap–>CheckDiagonals(iNeighborX, iNeighborZ,
return ID; else
iMasterX,
{
iMasterZ)) // иначе добавляем конечную точку и сообщаем об этом
{
m_aCloseList.push_back(m_aOpenList[ID]);
// по ширине и высоте находим
return FIND_END;
// номер соседа в сетке int iNeighborID = WayMap–>GetIDByPos(
}
iNeighborX, iNeighborZ);
}
«DoSearchStep»
получает
номер
элемента
открытого списка, из которого определяет ID клетки, для которой будем искать проходимых
соседей. Каждого «хорошего» мы добавляем в
открытый список, оценивая его путь. В конце
анализирующую клетку, с которой работали, удаляем из открытого списка и добавляем в закрытый:
bool CPathfinding::DoSearchStep(int iChunkNum) {
// если клетка проверялась, пропускаем if (FindInCloseList(iNeighborID) > –1) continue; // начинаем оценивать путь этой точки WayChunk Chunk; // устанавливаем ID клетки Chunk.ID = iNeighborID; // устанавливаем родителя клетки Chunk.MasterID = iMasterID; // стоимость передвижения Манхеттена
54