コード例 #1
0
    void FindPath(Gride _startPo, Gride _endPo)
    {
        openList.Add(_startPo);

        Gride gr;

        while ((gr = GetMinGr()) != null)
        {
            CheckGride(gr);
            if (openList.Count == 0 || IsOpenListHave(_endPo))
            {
                break;
            }
        }

        gr = GetEndGr();
        if (gr == null)
        {
            Debug.LogError("寻路失败");
            return;
        }
        while ((gr = GetGrideFather(gr)) != null)
        {
            mMap[gr.x, gr.y] = 9;
        }
    }
コード例 #2
0
    /// <summary>
    /// 处理当前格子周围的格子
    /// </summary>
    /// <param name="gr"></param>
    void CheckGride(Gride gr)
    {
        for (int i = gr.x - 1; i <= gr.x + 1; i++)
        {
            if (i < 0 || i > mapX)
            {
                continue;
            }
            for (int j = gr.y - 1; j <= gr.y + 1; j++)
            {
                if (j < 0 || j > mapY)
                {
                    continue;
                }
                if (IsDisPointHave(i, j) || (i == gr.x && j == gr.y) || IsCloseListHave(gr))
                {
                    continue;
                }

                Gride gride = new Gride(i, j);
                ComputeGAndH(gride, gr);
                openList.Add(gride);
            }
        }
        openList.Remove(gr);
        closeList.Add(gr);
    }
コード例 #3
0
    List <Gride> closeList = new List <Gride>(); //关闭列表
    void Start()
    {
        mDisPoint = new List <int[]>();
        mDisPoint.Add(new int[2] {
            2, 2
        });
        mDisPoint.Add(new int[2] {
            2, 3
        });
        mDisPoint.Add(new int[2] {
            2, 4
        });
        mDisPoint.Add(new int[2] {
            3, 2
        });
        mDisPoint.Add(new int[2] {
            3, 4
        });
        mDisPoint.Add(new int[2] {
            4, 2
        });
        mDisPoint.Add(new int[2] {
            4, 3
        });
        mDisPoint.Add(new int[2] {
            4, 4
        });

        mMap = new int[mapX, mapY];

        int[] arr = new int[2];
        for (int i = 0; i < mapX; i++)
        {
            for (int j = 0; j < mapY; j++)
            {
                arr[0] = i;
                arr[1] = j;
                if (IsDisPointHave(i, j))
                {
                    mMap[i, j] = 0;
                }
                else
                {
                    mMap[i, j] = 1;
                }
            }
        }

        startPo = new Gride(0, 0);
        endPo   = new Gride(3, 5);

        FindPath(startPo, endPo);

        PrintMap();
    }
コード例 #4
0
 bool IsCloseListHave(Gride gr)
 {
     foreach (Gride gride in closeList)
     {
         if (gride.x == gr.x && gride.y == gr.y)
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #5
0
 /// <summary>
 /// 上个格子到当前格子的g值
 /// </summary>
 /// <param name="curGr"></param>
 /// <param name="lastGr"></param>
 /// <returns></returns>
 int GetG(Gride curGr, Gride lastGr)
 {
     if (curGr.x == lastGr.x || curGr.y == lastGr.y)
     {
         return(10);
     }
     else
     {
         return(14);
     }
 }
コード例 #6
0
    /// <summary>
    /// 获取map中f值最小的
    /// </summary>
    /// <returns></returns>
    Gride GetMinGr()
    {
        Gride gr = null;

        foreach (Gride gride in openList)
        {
            if (gr == null)
            {
                gr = gride;
            }
            else if (gride.g + gride.h < gr.g + gr.h)
            {
                gr = gride;
            }
        }
        return(gr);
    }
コード例 #7
0
    /// <summary>
    /// 当前格子的g和h值以及是否刷新父节点
    /// </summary>
    /// <param name="curGr"></param>
    /// <param name="lastGr"></param>
    void ComputeGAndH(Gride curGr, Gride lastGr)
    {
        int g = GetG(curGr, lastGr);

        if (curGr.father == null)
        {
            curGr.father = lastGr;
            curGr.g      = g;
        }
        else if (g + lastGr.g < curGr.g)
        {
            curGr.g      = g + lastGr.g;
            curGr.father = lastGr;
        }

        curGr.h = (Mathf.Abs(endPo.y - curGr.y) + Mathf.Abs(endPo.x - curGr.x)) * 10;
    }
コード例 #8
0
 Gride GetGrideFather(Gride gride)
 {
     return(gride.father);
 }