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

金陵蜂蜜

金陵蜂蜜

2016-02-19 19:31

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的扫雷外挂的设计与实现(二),手机电脑控们准备好了吗?一起看过来吧!

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

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

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

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

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

  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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
扫雷外挂的设计与实现(二)

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

编程语言 网络编程
扫雷外挂的设计与实现(五)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

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

编程语言 网络编程
扫雷外挂的设计与实现(一)

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

编程语言 网络编程
扫雷外挂的设计与实现(四)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

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

编程语言 网络编程
扫雷外挂的设计与实现(三)

希望被实现的100个概念设计二

平面设计 海报设计 广告设计 画报设计 签名设计 服装设计 名片设计 画册设计 版式设计 商标设计
希望被实现的100个概念设计二

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

经典:从追MM谈Java的23种设计模式

经典:从追MM谈Java的23种设计模式

PowerBuilder调用Delphi写的Dll时发生的奇怪问题

PowerBuilder调用Delphi写的Dll时发生的奇怪问题
下拉加载更多内容 ↓