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

2016-02-19 19:32 337 1 收藏

下面这个扫雷外挂的设计与实现(一)教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

 

  文/jorge

  其实我不玩网络游戏的,所以对于外挂类程序也没什么好或坏的感觉,甚至平时基本不会想到这个概念。这个实验项目一开始称为“扫雷助手”,而究其技术含量,与现在真正实用的游戏外挂程序也没有可比性。设计它的意义,无非在于对某些Windows API的的进一步熟悉,使从未涉足过此领域的新手(当初的我自己)能够揭开某些“神秘的面纱”。之所以选择“扫雷”这个最经典的小游戏进行hack,一方面,使这个项目更贴近生活,更容易被理解,另一方面也可以最大化本人的成就感^_^,毕竟,在新手中,对扫雷的hack的探索似乎从来都没有停止过,从早期的修改.ini文件和注册表,到后来的Esc和xyzzy,无不体现着一代代人对这个目标的不懈追求^_^。而对于我们这些搞专业的来说,则应该有专业一点的方式,要有点技术含量!于是我做了这个叫MineAssistant的项目。

  它的原理说来也不难,无非实时地替人做两件事:1。把一定是雷的方块标上雷的记号,2。把一定不是雷的方块点击开。至于轻易判断不了是不是雷的,还得靠你的运气。其实,扫雷游戏中,这两项最简单的操作绝对是占了绝大多数时间的,不妨看看实测的效果:我使用扫雷外挂的纪录是:初级、中级都1秒,高级4秒。(和修改注册表的相比还是差了一点,不过那个一点技术含量都没有,呵呵)

  
  显然,这个实现过程涉及到了从一个程序操作另一个程序的窗口。这必须使用Windows API,主要的有下面几个:
   FindWindow
   GetDC
   GetPixel
   PostMessage

  稍微有点基础的看也看得出来,本人对于扫雷进程的内部数据是一无所知的,对于当前雷区的状态信息的取得,都是通过最浅显最笨的方法,就是直接读取屏幕像素。而反馈的操作,也都是通过PostMessage简单的发送一条信息来模仿鼠标点击。这样,本程序就自然的分成了两个层次,一个是与扫雷窗口的接口层,一个是实现判断的算法层。若是有基础的人,在提示到这以后,应该就可以自己来实现它了^_^,但就本人的经验来看,还有一个难点,就是如何从一个个像素的取值来分析出每个方块是什么状态。难不成用模式识别?!!别紧张,当初本人看了别人写的象棋对战程序,也忐忑地问了一句:难道要用人工智能?对方笑答,没那么严重,说这个算法你也写得出来。——实际上,只要检查每个方块上一两个特定位置像素,就可以得知这个方块的性质。当然,怎样找到这一两个像素的位置,还是要费一番周折的。为此,我写了好几个临时程序,专门用来测量“扫雷”窗口的各种尺寸参数。基本原理是,用FindWindow和GetDC得到扫雷窗口的HDC,然后把整个画面写到一个.bmp文件中去,再用Windows画图将其打开,用放大镜放到最大倍数,然后……一个个像素地数!另外,还用ResHacker把扫雷程序中的位图资源提取出来,把小方块中所有像素用程序进行扫描,以找到方块内某个特定像素,靠其颜色足以区分各种方块(未挖开的空白,未挖开的插旗,未挖开的问号,和挖开的1~8的数字,和挖开的空白)。在这其中我郁闷地发现,任何一个像素都不可能完全区分它们,因为扫雷窗口上的颜色总共还没有那么多种。引入第二个像素是不可避免的,于是我用另一个位置的像素,首先区分是挖开的还是没挖开的,才算解决了这个问题。

  另外,关于开发工具的选择。“程序员就像男人,编程语言就像女人,一般男人都想要很多女人,可没几个男人能真正了解一个女人”,这句话引自CSDN首页上曾看到的网友评论,本人当初也曾有过少年轻狂的时候,要了不少“女人”,以为女人越多真的越牛X,导致现在还对不少编程语言都一知半解。在做这个程序的时候,最了解的是Delphi,所以就用Delphi实现了。现在想来,Delphi确实是做此类程序的较好的选择。它和Windows底层有良好的互操作性,唯一不便则是,从MSDN中看到的WinAPI的声明都是C的,在Delphi中要稍微变换一下长相,而这些资料则是Borland所缺乏的。另外,再吹毛求疵一点,就是Delphi屏蔽了太多底层细节,使很多初学者冷丁与HDC等概念打交道时会陌生。但一般来说,这更像是使用者的毛病,而不是开发工具的。另外,C++也是个好选择,如果拿到今天,也许我更愿意用C++去实现它,C++配上wxWidgets,用来开发Windows应用程序真不是闹着玩的。但我一定不会喜欢用Java来实现它的,原因我想不必说大家也知道!

  好,现在用Delphi开始扫雷外挂的开发之旅。首先,来看一下前面提到的,本人跋山涉水啊,翻山越岭啊,费尽心思搜集来的扫雷窗口资料。所有资料取自Windows XP下带的扫雷“版本5.1”。注意,WinXP下的扫雷与Win9x中的,窗口图形有点细微差别,这足以使该外挂在Win9x下无法正确运行。不过我最终还是不打算加进判断OS版本并采用两套不同参数的代码了,毕竟只是个实验项目!

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

  实测数据(单位为像素):
  =================================================================
  每个小方块:宽=16,高=16
  雷区的最大可能大小:宽=30个方块, 高=24个方块
  从雷区的四边,到窗口客户区的四边,各有间隔,分别为:左=12,右=8,上=55,下=8
  在每一个方块内,如下两个像素可用来判断该方块的性质(坐标为相对方块左上角得值):
   首先判断(0,0)处,若为clWhite,则为未挖开的方块,若为clGray,则为挖开的。
   若是未挖开的方块,可再判断(5,4),对应关系如下:
    clSilver:空白
    clRed:插旗
    clBlack:问号
   若是挖开的方块,可再判断(7,4),对应关系如下:
    clSilver:空白(相当于数字0)
    clBlue:数字1
    clGreen:数字2
    clRed:数字3
    clNavy:数字4
    clMaroon:数字5
    clTeal:数字6
    clBlack:数字7
    clGray:数字8
  =================================================================

  另外,雷区上方的“重开始”按钮的状态也是很重要的数据,对于它的判断,后面遇到的时候有详述。

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

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

延伸阅读
template class CToolbar { public: CToolbar(); void CreateToolbar(HWND hParent);// 创建工具条 void AddButtons();// 逐个加入按钮 void DestroyToolbar();// 撤消工具条 LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&); // 工具条上按钮的提示信息 protected: ...
Java界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把...
界面设计应该是一项布满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局治理器等方案也无法很好地解决这个问题。 在本文中,我们会给出一种更好的解决方案,我们不是去试图把界...
标签: ASP
  摘要 网络办公已是现代企业发展的大势所趋。本文主要阐述了基于B/S结构的收发文管理系统的功能模块以及如何使用ASP和SQL Server解决一些相关的技术,其中包括系统的安全性问题。 引言 传统的手工办公方式已经无法满足现代办公的需求,收发文管理系统作为提高工作效率、规范办公制度,增强办公的透明性,实现信息、文档资...
标签: Web开发
树型结构是一类应用非常广泛的数据结构。人类社会中宗族的族谱和现代企业的组织形式都是树型结构。在计算机领域中,文件系统中文件的管理结构、存储器管理中的页表、数据库中的索引等也都是树型结构。随着Internet的飞速发展,树型结构在浏览器/服务器(Browser/Server,简称B/S)应用系统的应用也越来越广泛。 目前,在互联网上广泛存在、...

经验教程

111

收藏

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