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

2016-02-19 19:31 28 1 收藏

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

【 tulaoshi.com - 编程语言 】

  有了前述的数据,编写接口层似乎已经不成问题了。现在来构思一下程序运行的过程。说句实话,那种对于某种变化实时作出响应的程序,一般都用什么方法编成,本人并不很了解,推测无非是两种思想,一种是用一个线程不断地对这个变化进行检查,发现改变则动作;另一种是注册一个类似于钩子的东西,用回调函数来处理。无疑第二种方式要更节省系统资源,只是难在本人对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;                    //保存扫雷窗口的设备上下文

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

    //雷区的实际宽度和高度(方块数)
    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://www.tulaoshi.com/bianchengyuyan/)

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

来源:https://www.tulaoshi.com/n/20160219/1621229.html

延伸阅读
摘 要 :介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。 关键词 :XML文档 解析器 元素 在XML应用中,最常用也最实用的莫过于XML文件的读写。由于XML语义比较严格,起始标记必须配对,所以合并XML文档并不像合并普通文件那样简单。在JAVA中,如何合并XML文档,下面介绍一种方法。 设计思想 应用ja...
标签: Web开发
随着Internet的普及和电子商务的兴起,网上书店是Internet电子商务在图书销售行业发展的必然结果。这种新型的图书销售形式,与传统利用书店进行销售的方式相比,网上书店拥有许多优势:一是降低了销售成本;二是利用网络作为交易平台,改变了传统的交易方式,使得交易活动不受空间和时间的限制;同时,信息的传递更迅速灵活,新书信息上传...
template class CToolbar { public: CToolbar(); void CreateToolbar(HWND hParent);// 创建工具条 void AddButtons();// 逐个加入按钮 void DestroyToolbar();// 撤消工具条 LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&); // 工具条上按钮的提示信息 protected: ...
Java界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把...
界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把界...

经验教程

430

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部