用C#开发智能手机软件:推箱子(五)
来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 03:58 点击:次
在上篇文章“使用 C# 开发智能手机软件:推箱子(四)”中,我对Common/FindPath.cs 源程序文件进行了介绍。在这篇文章中介绍经过改进后的 Common/FindPath.cs 源程序文件。也就是说,已经实现了“使用 C# 开发智能手机软件:推箱子(四)”的第二个评论中的想法,将地图 ushort[,] map 改为 byte[,] map 了。下面就是改进后的 FindPath 类:
以下是引用片段: 1 using System; 2 using System.Drawing; 3 using System.Collections.Generic; 4 5 namespace Skyiv.Ben.PushBox.Common 6 { 7 /// 8 /// 寻找最短路线 9 /// 10 static class FindPath 11 { 12 static Size[] offsets = { new Size(0, 1), new Size(1, 0), new Size(0, -1), new Size(-1, 0) }; 13 static Direction[] directions = { Direction.South, Direction.East, Direction.North, Direction.West }; 14 15 /// 16 /// 寻找最短路线 17 /// 18 /// 地图 19 /// 出发点 20 /// 目的地 21 /// 最短路线 22 public static Queue Seek(byte[,] map, Point from, Point to) 23 { 24 Queue moveQueue = new Queue(); // 路线 25 int value; // 与离目的地距离相关的一个量,变化规律: => 2 => 1 => 3 => 2 => 1 => 3 => 2 => 1 26 if (Seek(map, to, out value)) // 找到了一条路线 27 { 28 Point here = from; // 出发点(即工人的位置) 29 Point nbr = new Point(); // 四周的邻居 30 for (value = (value + 1) % 3 + 1; here != to; value = (value + 1) % 3 + 1) // 逐步走向目的地 31 { 32 for (int i = 0; i < offsets.Length; i++) 33 { 34 nbr = Fcl.Add(here, offsets[i]); // 开始寻找四周的邻居 35 if (Block.Value(map[nbr.Y, nbr.X]) == value) // 就往这个方向走 36 { 37 moveQueue.Enqueue(directions[i]); // 路线向目的地延伸一步 38 break; 39 } 40 } 41 here = nbr; // 继续前进 42 } 43 } 44 Block.CleanAllMark(map); // 清除所有标志,恢复现场 45 return moveQueue; // 所寻找的路线,如果无法到达目的地则为该路线的长度为零 46 } 47 48 /// 49 /// 寻找最短路线,使用广度优先搜索 50 /// 51 /// 地图 52 /// 目的地 53 /// 输出:搜索完成时标记的值 54 /// 是否成功 55 static bool Seek(byte[,] map, Point to, out int value) 56 { 57 Queue q = new Queue(); 58 Block.Mark(ref map[to.Y, to.X], 1); // 从目的地开始往回寻找出发点,目的地标记为1 59 Point  相关新闻>>最新推荐更多>>>
|