A*寻径算法

A*寻径算法

英文原文: http://www.policyalmanac.org/games/aStarTutorial.htm

中文译文: http://at020334.blog.163.com/blog/static/169949689201072734040785/

<!-- move.cpp -->
///A*寻路算法
int Npc::getNodeH(MapPos& to, StepNode& node)
{
    return 10 * (abs(to.x - node.x) + abs( to.y - node.y));
}

StepNode Npc::getNodeChild(StepNode sn, int i)
{
    StepNode point;

    int a = 0;
    int b = 0;
    switch (i)
    {
    case 0:
        a = 0;
        b = -1;
    break;
    case 1:
        a = -1;
        b = -1;
            break;
    case 2:
        a = -1;
        b = 0;
        break;
    case 3:
        a = -1;
        b = 1;
        break;
    case 4:
        a = 0;
        b = 1;
        break;
    case 5:
        a = 1;
        b = 1;
        break;
    case 6:
        a = 1;
        b = 0;
        break;
    case 7:
        a = 1;
        b = -1;
        break;
    default:
        break;
    }

    sn.x += a;
    sn.y += b;

    point.x = sn.x;
    point.y = sn.y;
    point.G = sn.G;
    point.H = sn.H;
    point.status = 0;

    return point;
}

list<StepNode> Npc::getSearchPath(MapPos& startPos, MapPos& to)
{
    vector<StepNode> openNodeVec;
    list<StepNode> pathList;
    //查找steps格范围内的目标
    int steps = 500;
    //初始点
    StepNode startNode;
    startNode.x = startPos.x;
    startNode.y = startPos.y;
    startNode.G = 0;
    startNode.H = 0;
    startNode.status = 0;
    //记录点
        openNodeVec.push_back(startNode);

        bool isFind = false;
    while (!isFind && steps > 0){
    //以F值从大到小 降序排列
    sort(openNodeVec.begin(), openNodeVec.end(), greater<StepNode>());

    StepNode curNode = openNodeVec[openNodeVec.size()-1];
    //openNodeVec.RemoveAt(openNodeVec.size()-1);
    if (openNodeVec.size() > 0){
        openNodeVec.pop_back();
        pathList.push_back(curNode);
    }

    for (int i = 0; i < 8 ; i++){
        StepNode nextNode = getNodeChild(curNode, i);
        if (nextNode.x == to.x && nextNode.y == to.y){
            pathList.push_back(nextNode);
            isFind = true;
            break;
        }
        /*CHECK POINT 非阻挡点 是连续移动点*/
        else if ( checkpoint(nextNode.x, nextNode.y) && checkNpcMove(curNode.x, curNode.y , nextNode.x , nextNode.y) ){
            int g = ((nextNode.x == curNode.x || nextNode.y == curNode.y) ? 10 : 14) + curNode.G;
            int h = getNodeH(to, curNode);
            if (nextNode.status == 0){
                nextNode.G = g;
                                    nextNode.H = h;
                nextNode.status = 1;
                openNodeVec.push_back(nextNode);
            }
            else if (nextNode.getF() > g + h) {
                nextNode.G = g;
                nextNode.H = h;
                nextNode.status = 1;
                openNodeVec.push_back(nextNode);
            }
        }
    }

    steps--;
    }
    return pathList;
}

你可能感兴趣的:(A*寻径算法)