/// <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); }
/// <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); }