用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 
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 用C#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1