源码放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上(本页最上面)
放上效果图(本页最上面)