转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
扫雷外挂的设计与实现(二)         ★★★★

扫雷外挂的设计与实现(二)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:646 更新时间:2009/4/23 18:27:10

文/jorge

有了前述的数据,编写接口层似乎已经不成问题了。现在来构思一下程序运行的过程。说句实话,那种对于某种变化实时作出响应的程序,一般都用什么方法编成,本人并不很了解,推测无非是两种思想,一种是用一个线程不断地对这个变化进行检查,发现改变则动作;另一种是注册一个类似于钩子的东西,用回调函数来处理。无疑第二种方式要更节省系统资源,只是难在本人对Windows的钩子掌握的还一塌糊涂。若换了个高手,无疑应该用这种方式,而我却只有望着Spy++中迅速滚动的消息发呆的份。也许等我学好了钩子之后,会写个0.2版,而在0.1版中我已经决定了使用丑陋的反复检查的方式。于是,用了一个TTimer控件,定时间隔设在了30左右,用它的OnTimer事件来进行一次检查和反馈操作。时间间隔是反复试验确定的,太小,会很占CPU,太大则反应会变慢。

这样,运行过程已经确定下来:

OnTimer事件->判断当前可否进行操作->取得整个雷区当前状况->用算法进行分析->反馈操作

所谓不可进行操作的时候,无非是指:根本没有扫雷窗口,或者窗口部分被遮挡(此时无法取得正确的像素值),或者扫雷游戏没有开始。

在我的代码中,OnTimer事件处理过程的核心就是如下简单的几句:

=================================================================

if GetMineWindow then
begin
    FetchCells;
    AnalyzeCells;
    OperateCells;
end;

=================================================================

其中:
GetMineWindow函数返回一个Boolean值,表示可否进行操作。如果可以,同时将关于扫雷窗口的一些参数存放进全局变量中。
FetchCells过程取得整个雷区所有方块的信息,填入输入缓冲区。
AnalyzeCells过程对输入缓冲区中的数据进行分析,将反馈操作填入输出缓冲区。
OperateCells过程根据输出缓冲区中的数据对扫雷窗口进行反馈操作。

上述输入缓冲区和输出缓冲区,各是一个二维数组,直观地对应了扫雷窗口上的每一个方块。前者保存每个方块的当前状态供分析,后者保存分析完毕后,将要实施到每一个方块的操作。雷区的宽和高都不是固定的,而这两个二维数组,则无论何时都要能够保存所有方块的信息。这时有两个选择,一是定义足以容下最大情况的静态数组,二是使用动态数组。为了简单,我采用了前者,毕竟最大情况也不是大得难以忍受。这样,还需要一对整型变量保存实际雷区的宽和高。

现在可以来看一下全部需要的全局常量,变量和类型:

=================================================================

const
  MINE_WINDOW_TITLE = ''''扫雷'''';     //窗口标题,供寻找扫雷窗口用

  //以下四个,为雷区四边到窗口客户区四边的距离
  TOP_MARGIN = 55;                //上边距
  BOTTOM_MARGIN = 8;              //下边距
  LEFT_MARGIN = 12;               //左边距
  RIGHT_MARGIN = 8;               //右边距

  CELL_WIDTH = 16;                //每个方块宽度
  CELL_HEIGHT = 16;               //每个方块高度

  MAX_COLUMN_COUNT = 30;          //雷区最大可能的列数
  MAX_ROW_COUNT = 24;             //雷区最大可能的行数

type
  //每个方块的可能状态,包括0~8的数字(0不显示),未知的,已插旗标记为雷的,和标记问号的
  TCellState = (cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, cs8, csUnknown, csMarked, csPossible);

  //TCellState的集合类型,供分析算法使用
  TCellStates = set of TCellState;

  //对每个方块的操作种类,包括无操作,左键单击,右键单击,左右键同时单击,和右键双击(用于将问号标记成旗)
  TOperation = (opNone, opLeftClick, opRightClick, opBothClick, opRightDoubleClick);

var
  MineWnd: HWND;                  //保存扫雷窗口的句柄
  MineDC: HDC;                    //保存扫雷窗口的设备上下文

  //雷区的实际宽度和高度(方块数)
  AreaWidth: Integer
  AreaHeight: Integer;

  //输入缓冲区
  Cells: array[0..MAX_COLUMN_COUNT-1, 0..MAX_ROW_COUNT-1] of TCellState;

  //输出缓冲区
  Operations: array[0..MAX_COLUMN_COUNT-1, 0..MAX_ROW_COUNT-1] of TOperation;

=================================================================


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台