コード例 #1
0
    /// <summary>
    /// A*寻路算法。算法用一个Open和一个Close列表来存储没有访问的节点和访问过的节点.
    /// 当Close列表里面存在目标点或者Open列表为空时。算法结束
    /// 开始的时候。把起始点放到Open列表里面。
    /// 当Open列表不为空时。找出列表里面的节点AllCost最小,且nEndCost也最小的点作为当前节点
    /// 把当前节点移出Open列表。并放进Close列表里面,并判断当前节点
    /// 1、当前节点为目标点。找到路径。算法结束
    ////2、当前节点不是目标点,则查找它的相邻节点。
    ///     从当前节点重新计算相邻节点的StartCost,
    ///     如果相邻节点新的StartCost值比旧的StartCost值小或者没有在Open列表里面。则更新StartCost和nEndCost。
    ///     并把没有在Open列表里面的节点加入到Open列表里
    ///
    /// </summary>
    /// <param name="map"></param>
    /// <param name="start"></param>
    /// <param name="end"></param>
    public List <NodeItem> FindingPath(NodeItem[,] map, NodeItem startNode, NodeItem endNode)
    {
        List <NodeItem> openList  = new List <NodeItem>();
        List <NodeItem> closeList = new List <NodeItem>();

        openList.Add(startNode);
        startNode.nGCost = 0;
        startNode.nHCost = getDistanceNodes(startNode, endNode);
        while (openList.Count > 0)
        {
            NodeItem curNode = openList[0];
            for (int i = 1; i < openList.Count; ++i)
            {
                if (openList[i].AllCost < curNode.AllCost)
                {
                    curNode = openList[i];
                }
            }

            openList.Remove(curNode);
            closeList.Add(curNode);
            if (curNode == endNode)
            {
                return(generatePath(startNode, endNode));
            }

            List <NodeItem> ltNode = m_aCreateMap.getNeibourhood(curNode);
            for (int i = 0; i < ltNode.Count; ++i)
            {
                NodeItem _tempNode = ltNode[i];
                if (_tempNode.bWall || closeList.Contains(_tempNode))
                {
                    continue;
                }

                int newCost = curNode.nGCost + getDistanceNodes(curNode, _tempNode);
                if (newCost < _tempNode.nGCost || !openList.Contains(_tempNode))
                {
                    _tempNode.nGCost = newCost;
                    _tempNode.nHCost = getDistanceNodes(_tempNode, endNode);
                    _tempNode.parent = curNode;
                    if (!openList.Contains(_tempNode))
                    {
                        openList.Add(_tempNode);
                    }
                }
            }
        }

        return(generatePath(startNode, null));
    }