PROgrammist, №16

Page 54

ПРО

№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


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.