扫雷外挂的设计与实现(二)
|
源代码网整理以下文/jorge 源代码网整理以下有了前述的数据,编写接口层似乎已经不成问题了。现在来构思一下程序运行的过程。说句实话,那种对于某种变化实时作出响应的程序,一般都用什么方法编成,本人并不很了解,推测无非是两种思想,一种是用一个线程不断地对这个变化进行检查,发现改变则动作;另一种是注册一个类似于钩子的东西,用回调函数来处理。无疑第二种方式要更节省系统资源,只是难在本人对Windows的钩子掌握的还一塌糊涂。若换了个高手,无疑应该用这种方式,而我却只有望着Spy 中迅速滚动的消息发呆的份。也许等我学好了钩子之后,会写个0.2版,而在0.1版中我已经决定了使用丑陋的反复检查的方式。于是,用了一个TTimer控件,定时间隔设在了30左右,用它的OnTimer事件来进行一次检查和反馈操作。时间间隔是反复试验确定的,太小,会很占CPU,太大则反应会变慢。 源代码网整理以下这样,运行过程已经确定下来: 源代码网整理以下OnTimer事件->判断当前可否进行操作->取得整个雷区当前状况->用算法进行分析->反馈操作 源代码网整理以下所谓不可进行操作的时候,无非是指:根本没有扫雷窗口,或者窗口部分被遮挡(此时无法取得正确的像素值),或者扫雷游戏没有开始。 源代码网整理以下在我的代码中,OnTimer事件处理过程的核心就是如下简单的几句: 源代码网整理以下================================================================= 源代码网整理以下if GetMineWindow then 源代码网整理以下================================================================= 源代码网整理以下其中: 源代码网整理以下上述输入缓冲区和输出缓冲区,各是一个二维数组,直观地对应了扫雷窗口上的每一个方块。前者保存每个方块的当前状态供分析,后者保存分析完毕后,将要实施到每一个方块的操作。雷区的宽和高都不是固定的,而这两个二维数组,则无论何时都要能够保存所有方块的信息。这时有两个选择,一是定义足以容下最大情况的静态数组,二是使用动态数组。为了简单,我采用了前者,毕竟最大情况也不是大得难以忍受。这样,还需要一对整型变量保存实际雷区的宽和高。 源代码网整理以下现在可以来看一下全部需要的全局常量,变量和类型: 软件开发网 www.mscto.com 源代码网整理以下================================================================= 源代码网整理以下const 源代码网整理以下 //以下四个,为雷区四边到窗口客户区四边的距离 源代码网整理以下 CELL_WIDTH = 16; //每个方块宽度 源代码网整理以下 MAX_COLUMN_COUNT = 30; //雷区最大可能的列数 源代码网整理以下type 源代码网整理以下 //TCellState的集合类型,供分析算法使用 源代码网整理以下 //对每个方块的操作种类,包括无操作,左键单击,右键单击,左右键同时单击,和右键双击(用于将问号标记成旗) 源代码网整理以下var 软件开发网 www.mscto.com 源代码网整理以下 //雷区的实际宽度和高度(方块数) 源代码网整理以下 //输入缓冲区 源代码网整理以下 //输出缓冲区 源代码网整理以下================================================================= 源代码网整理以下 源代码网推荐 源代码网供稿. |
