コード例 #1
0
    private void FindAStartPath(Vector3 startPos, Vector3 endPos)
    {
        showData.openPath  = new List <Node>();
        showData.ErrorPath = new List <Node>();
        Node        startNode = showData.GetFromPosition(startPos);
        Node        endNode   = showData.GetFromPosition(endPos);
        List <Node> openNode  = new List <Node>();
        List <Node> closeNode = new List <Node>();

        openNode.Add(startNode);

        startNode.parent = null;
        while (openNode.Count > 0)
        {
            Node currentNode = openNode[0];

            //找到打开节点中最小的权重的节点
            for (int i = 0; i < openNode.Count; i++)
            {
                if ((openNode[i].fCode <= currentNode.fCode) && (openNode[i].hCode < currentNode.hCode))
                {
                    currentNode = openNode[i];
                }
            }
            //将这个权重最小的节点移除
            openNode.Remove(currentNode);

            closeNode.Add(currentNode);

            // 结束
            if (currentNode == endNode)
            {
                List <Node> path = new List <Node>();
                while (currentNode.parent != null)
                {
                    try
                    {
                        path.Add(currentNode);
                    }
                    catch (Exception)
                    {
                        enabled = false;
                        throw;
                    }
                    currentNode = currentNode.parent;
                }
                path.Reverse();
                showData.path = path;
                return;
            }
            showData.openPath.Add(currentNode);

            //搜索当前节点走位可以走得节点,然后更新权重值
            foreach (var node in showData.GetOpenAroundNode(currentNode, closeNode))
            {
                int newCode = currentNode.gCode + GetDistancePos(currentNode, node);
                if (!openNode.Contains(node) || (node.gCode > newCode))
                {
                    if (currentNode == showData.date[8, 4])
                    {
                        showData.ErrorPath.Add(node);
                    }
                    node.gCode  = newCode;
                    node.hCode  = GetDistancePos(node, endNode);
                    node.parent = currentNode;
                    if (!openNode.Contains(node))
                    {
                        openNode.Add(node);
                    }
                }
            }
        }
    }