首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PyQT制作游戏,然后再破解,制作游戏辅助,Python魅力无穷啊!

先说游戏的制作,再说如何破解咯!

游戏窗口探查

下载安装PyWin32库(对windows接口的Python封装),但不能直接点Download图标,不然下下来是一个Readme.txt,点“Browse All Files”寻找需要的版本。

使用spy++找到窗口句柄(或者找到窗口类名lpClassName和窗口名lpWindowName)

Note:1. FindWindow函数:

FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。

函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。

函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);

参数:

IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低16位,高位必须为0。

IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。

返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。

2. 句柄

直接使用句柄可能的问题:

1)firefox中每个页面tab都是同一个句柄,程序中找到的句柄对应当前tab,如果当前tab不是找茬游戏就不对了

2)使用窗口类名lpClassName和窗口名lpWindowName时如果当前tab不是找茬游戏会找不到相应句柄

上面问题一个有效的解决方法是将找茬游戏单独在新窗口中打开

也可以使用spy++反向从句柄找到句柄对应窗口,检查是否正确。

游戏图片提取

提取图片采用了截屏的方式,找到窗口后将窗口提到最前,再作窗口截屏。

下载安装PIL图形处理库

Note:1.win32gui.GetWindowRect函数

l,t,r,b =win32gui.GetWindowRect(self.hwnd) #返回图形左、上、右、下边界(或者说是左上、右下的坐标点)

2.ImageGrab.grab函数:ImageGrab是PIL的一个模块,用于图像的抓取。不带参数的ImageGrab.grab()进行全屏截屏,返回一个Image对象,也可使用一个元组作为参数指定要截取的范围(左上与右下两点的坐标),这两种截屏都是不带鼠标指针的。

上面用到的坐标都为为了演示代码简单填的,实际上可使用了变量参数,而且要区分分辨率什么的。

还有一个ImageGrab.grabclipboard()可从系统剪贴板采集图像。

3. 得到Image图像后可用show()方法,使用系统默认的图像查看工具打开,方便调试。

也可以用save(filename)保存成文件,对应的可以Image.open(filename)打开获得。

4. crop(box)方法:参数为左上和右下标点坐标(或者说是左、上、右、下边界)

grab得到了一个包含左右图片的Image对象后,用crop(box)方法可裁剪得到其中指定的区域,分别拿到左右两个游戏图片。

对比获得两图内容不同的区域

把两图裁剪成N个小图片分别对比,左右统一区域对应的小图片不相等则为“茬”区,问题是怎么判断两个图片内容不一致?

Image.histogram()函数:用于得到图像的颜色直方图。直方图可以表示一张图片中各种亮度(或颜色)的数量,两张自然图片的直方图基本是不一样的,除非两图对称、颜色一致但排列不一,但就算如此,将两图继续分割下去,其子图的直方图也会不一样。直方图就是一种图形到数值的转换,对比两图的颜色数值就可知是否存在差异。一张用RBG颜色格式的图像,histogram()函数将返回一个长度为768的数组,第0-255表示红色的0-255,第256-511表色绿色的0-255,第512-767表色蓝色的0-255,

数值表示该颜色像素的个数。

因此,histogram()列表所有成员之和等于改图像的像素值 x 3。

用来获得两图比较的数值差的函数

Note:将函数返回的红绿蓝差值相加,如果超过了预定定的阀值2000,则表示该区域不同。这个计算方式有点“土”,但对这次要解决的问题很有效,就没再继续改进。

把两图裁剪成N个小图片分别对比

Note:大图是 780*520,分隔成10x10的小块,定义一个78*52的二位数组存储结果,分别比较后将差值大于阀值的数组区域标记为1.

在游戏上标记两边不同的区域

可以使用PyWin32的函数,获得游戏窗口句柄后直接在上面绘制,但要熟悉Windows编程,解决游戏自身重绘后将我的标记擦除的问题。

也可以使用Qt。下面用Qt创建了一个和游戏大小一样透明的QWidget窗口,叠加在游戏窗口上,用遮罩来绘制标记。标记数据已记录在result数组中,在指定的位置绘制一个方格则表示该区域左右不同,要注意两个方格间的边界不要绘制,避免格子太多干扰了游戏。除标记外,还绘制了两个按钮来触发对比与擦除。

Python实现大家来找茬小游戏辅助

出了一个小程序的找茬游戏,如下示意:

很多时候“眼疾手快”比不过别人,只好寻找一种便捷的玩法:程序自动实现!

这里使用的是Python3

第一步:获取手机截图

上面的命令获得的截图在windows系统上会出错,这是由于windows默认使用的换行符为 而Andriod系统使用的是Linux内核,其换行表示为 ,在手机端把二进制数据流传输给电脑时,windows会自动把 替换为 因而为了正确显示,还需要一个转换,我们编写Python的转换代码如下:

第二步:图片裁剪

获得的图片有多余的部分,需要进行裁剪,使用Python的opencv库,代码如下:

第三步:图片差异对比

图片差异对比这就很好理解了,把两张图片叠到一起,相减,剩下的就是不同的地方了,当然,这里有几个细节需要注意:原图的截取,上面从手机获取的截图有很多非目标区域,因而我们需要定义截图区域,这就是我们程序中需要给出的box参数:

box=(0.2,0.93,0.05,0.95)

这里,参数依次代表:

开始截取的列=0.2*图片宽,停止截取的列=0.93*图片宽

开始截取的行=0.05*图片高,开始截取的行=0.95*图片高

然后,仔细观察你会发现中间还有一块多余的区域,把上下两张图分开只需要给出中间区域要截除的像素值,这也就是我们程序运行的第二个参数:

gap=38

这里代表把第一次截图得到的图片二分后分别截去38像素的高度。

这时,还有一个问题要注意的是,我们截图参数是根据肉眼分辨设置的,你截图的结果可能并不是严格的目标图片的开始行列,这时,得到的两张图片会存在很小的错位,为了微调这个错位,我们给出程序的第三个参数:

dis=2

这代表两张图片在进行相减作差的时候会微调两行。

好了,得到差异图片后我们来看看效果

哈,五个不同的地方,终于“原形毕露”!

这时,你就可以看着这张差异图去“找茬”了。

当然,上面这张丑陋的差异图是不能忍受的,没事,我们接着改进。

找到了差异,如何“优雅”的展示差异呢?我的第一反应就是:在原图上画个圈出来,这样既直观又不失“优雅”。好吧,说干就干!

第一步,使用Opencv库检索差异图的轮廓。这里,值得一提的是在图片的右上角有个小程序的返回图标,这会干扰我们提取轮廓,因而需要先把这个图标去除。查找到轮廓之前需要把图片转换为二值图,然后运用形态学开运算去除噪声,这里涉及程序的第四个参数:滤波核尺寸:

filter_sz=25

最后查找外轮廓并根据轮廓周长保存前n个轮廓,这就是程序里的第五个参数:

num=5

然后检测轮廓的最小外接圆,找到圆心和半径,绘制到原图上,效果如下:

这么样,效果是不是更“优雅”一些了呢!

最后贴上完整的代码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180724A0XAK100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券