python 自动玩 连连看 外挂

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangfengz1995/article/details/78569733


源码放github了

https://github.com/ZhangFengze/QQLianLianKanCheat


(我的电脑全速跑的时候配合这首BGM正好节奏搭配哈哈哈

http://music.163.com/#/m/song?id=26220036&userid=376367907 )

(更新,控制台输出每一步的矩阵)

(更新,main.py接受可选参数--interval seconds用作每一步中间的sleep时间)

----------------------------------------------------------------


一直搞C++, 最近工作需要才看了看python。

发现好强大。。库又多又好用。

偶然看到有人拿python搞ocr,自动识别验证码。

想到能OCR,自然也能识别图像。完全可以搞个游戏外挂嘛。。

以前C++也想整,可是各种地方都要自己造轮子,要去接触乱七八糟的底层。复杂点的还要找内存地址,过驱动保护。。。。就一直拖着

现在有python了,可以试试弄个简单点的小外挂。写起来又不费事又好玩。


先拿连连看试试手。QQ游戏大厅的连连看。没什么复杂的反外挂功能,挺好的练手对象。。。

试了试,常规的模拟鼠标方式都没有封掉。截图也可以截取成功。


大概思路,整一个简单点的,自动找出来哪两个可以连起来,然后自动消掉它们。

实现方式也简单点,不要去整什么查内存地址什么的。就简简单单,把屏幕截下来,然后分析分析。然后求解。

(后来在github上搜了搜,发现了一个人写的。。直接读内存获得棋盘形式,https://github.com/laoyang103/qqllk-plugin)


实现方式:

pywin32找游戏窗口句柄,获得其坐标和大小。

PIL截取游戏区。然后把图像分成每个格子。

判断哪些格子是一类。

得到一个矩阵

求解这个连连看矩阵该怎么解

执行(鼠标点一点,我用的是pyautogui)

更新矩阵继续求解


前两步是脏活,无难度

第三步,上网一搜,图片相似识别,一堆。。


求解连连看矩阵,只有这个地方自己动动脑子。。


博客里就只写重点了。细节看我后面放的源码就行。

图像相似识别,没怎么接触过。直接参考的别人代码。

参考的这篇文章。浅显易懂。

http://blog.csdn.net/feimengjuan/article/details/51279629


然后就是求解连连看矩阵了。

我们之前做了一堆脏活。终于把图形化的游戏界面抽象成了一个矩阵。

看这个矩阵我们可以知道哪些位置上的格子是同类的。

但是QQ连连看的规则是,连线不能用超过三条直线。

增加了一点点复杂性。



如果愿意的话,当然可以直接找到所有同类的,然后强行全拿鼠标点一点。

不过这里我前面部分都没怎么动脑子。。这里还是想折腾折腾


其实可以抽象成一个寻路问题,但是不是常规的求最短路径,而是只需要获得一个符合要求的路径即可

最常规寻路思路也就是遍历啦,要么BFS,要么DFS,要么dijkstra,要么A*。还有什么别的,我也没仔细研究过

我这里也懒得求连连看问题的特殊解法了。直接弄了个DFS,减枝条件是不要用超过3条直线。

(后来看了看别人的解法,因为最多只有三条直线,所以情况可以枚举出来。可是我感觉这里枚举出来,后面几种复杂的情况挺脏的。而且还要思考思考枚举全了没。。)


DFS实现细节无所谓,我这里采用的是从某一点开始出发,向四周延伸。记录路径,这样就可以算出来用了几条直线。


这样一个一个位置用DFS搜索,搜出来解了,就执行一步。(也就是拿鼠标点一点了)

然后再重复同样的步骤。


对于QQ连连看这个游戏来说,有一些细节

它是有道具的,似乎是消掉某些方块就得到道具。而不是消掉的同时就直接生效。我们这里选择不用就行了(也就是不鸟它)

所以我们是不用每一步执行完以后重新扫描游戏区的。直接一直用第一次扫描出来的矩阵就行了。执行一步更新一次矩阵。

我刚开始以为消掉道具格子会直接改变场上局势,所以每次都重新分析图像。还是挺慢的。当然和在用python有关系。也和我这里代码写得糙有关系。。。

不过要是不用重新分析图像,还是挺快的。

基本上一秒消几对吧。

为了不太变态,记得在每一步中间sleep一会儿。。


还有,实验发现QQ连连看,是有无解的情况的。

脚本中会提示无解,游戏也会提示。

这时候正常游戏需要用一下道具。。我这里没考虑这情况,有需要的自己添加吧。

就是点一下重列道具,(总是第二个道具)


还有个问题就是,QQ连连看消完一对后,会有爆炸特效。而且两个格子的爆炸效果貌似一样。所以如果每次都重新扫描图像。会扫描到爆炸效果的两个格子。

如果需要重新扫描,要注意一下。不过我这里改用了一次扫描,以后都不管图像了。所以无所谓。

还有一个类似的问题是,鼠标会影响图像判断。

这里我的只扫描一次。所以保证扫描的时候鼠标别放棋盘区域就行了


这样就结束了,代码我会放在我的github上(本页最上面)

放上效果图(本页最上面)






展开阅读全文

没有更多推荐了,返回首页