Exemplo n.º 1
0
        /// <summary>
        /// 移动小猫的算法,利用广度优先的思想
        /// </summary>
        /// <returns></returns>
        private bool SearchBestPath()
        {
            int  i = 0, j = 0, di = 0;
            bool find = false;

            Circle[,] map = new Circle[gameSize, gameSize];
            CloneMap(map);            //克隆一份地图
            QuType qu = new QuType(); //定义顺序队

            qu.Front = qu.Rear = -1;
            qu.Rear++;
            qu.Data.Add(new Box {
                Circle = circles[catRow, catCol], Pre = -1, Row = catRow, Col = catCol
            });                                    //小猫现在的位置进队
            map[catRow, catCol].IsSelected = true; //避免重复搜索
            while (qu.Front != qu.Rear && !find)
            {
                qu.Front++;
                i = qu.Data[qu.Front].Row;
                j = qu.Data[qu.Front].Col;
                if (i == 0 || j == 0 || i == gameSize - 1 || j == gameSize - 1)
                {
                    find = true;
                    GetBestPath(qu, qu.Front);
                    return(true);
                }
                for (di = 0; di < 6; di++)//六个方向遍历
                {
                    switch (di)
                    {
                    case 0: i = qu.Data[qu.Front].Circle.TopLeft.X; j = qu.Data[qu.Front].Circle.TopLeft.Y; break;

                    case 1: i = qu.Data[qu.Front].Circle.TopRight.X; j = qu.Data[qu.Front].Circle.TopRight.Y; break;

                    case 2: i = qu.Data[qu.Front].Circle.Left.X; j = qu.Data[qu.Front].Circle.Left.Y; break;

                    case 3: i = qu.Data[qu.Front].Circle.Right.X; j = qu.Data[qu.Front].Circle.Right.Y; break;

                    case 4: i = qu.Data[qu.Front].Circle.BottomLeft.X; j = qu.Data[qu.Front].Circle.BottomLeft.Y; break;

                    case 5: i = qu.Data[qu.Front].Circle.BottomRight.X; j = qu.Data[qu.Front].Circle.BottomRight.Y; break;
                    }
                    if (!map[i, j].IsSelected)
                    {
                        qu.Rear++;
                        qu.Data.Add(new Box {
                            Circle = circles[i, j], Pre = qu.Front, Row = i, Col = j
                        });
                        map[i, j].IsSelected = true;//避免回过来重复搜索
                    }
                }
            }
            return(false);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 获取最贪心的路径
        /// </summary>
        /// <param name="qu"></param>
        /// <param name="front"></param>
        private void GetBestPath(QuType qu, int front)
        {
            List <Box> path = new List <Box>();
            int        k = front, j = 0;

            do
            {
                j = k;
                k = qu.Data[k].Pre;
                qu.Data[j].Pre = -1;
            } while (k != 0);
            k = 0;
            while (k < qu.Data.Count)//正向搜索到pre为-1的方块,即构成正向的路径
            {
                if (qu.Data[k].Pre == -1)
                {
                    path.Add(qu.Data[k]);
                }
                k++;
            }
            catRow = path[1].Row;
            catCol = path[1].Col;
            SetCatPos(catRow, catCol);
        }