本文内容转自我本人的知乎回答:你看过/写过哪些有意思的代码? - 三级狗的回答 - 知乎 https://www.zhihu.com/question/275611095/answer/407984155 。转载请务必联系作者授权,并注明出处。

博客里不能加小视频,上几张图展示下外挂的惊人效果,图中是将时间间隔设置为0的效果。

前言

python写的连连看外挂,图中时间间隔设置成了0,效果有点吓人。用的是简单的opencv图像识别结合连连看的算法,下面的内容是具体的实现思路和源码地址,希望不会接到腾讯爸爸的律师函?

源码连接:先点这里,然后点star

这个小外挂用python2写出来有将近半年了,挂到github上的版本我想用python3重构,当时只写了个开头后来不了了之了。这篇回答发出来,关注度如此之高,这才想起来我的github上挂的是半喇项目,尴尬我的今天趁下班时间赶紧写完了python3的版本,并且把思路代码都理了理。

需要使劲敲黑板强调一下的是:我在Github上提供的源码捆绑销售了一个自己实现的连连看游戏,按照源码中的参数运行起来,可以挂我自己的这款连连看, 如果挂腾讯爸爸的游戏,需要修改一些参数,参数我在此不做提供。此处开源仅用于交流学习使用,请不要大肆传播,影响正常的游戏秩序和公司的商业利益。

实现思路

下面的内容,伸手党可以不用看了,毕竟大家更感兴趣的,肯定是上面那个链接。

项目一共350行左右的源码,注释150行,是的,实现起来比你想象的简单的多。接下来我用我的方式讲解一下这个外挂是怎么实现的,尽可能简洁,让绝大部分人都能听懂。

首先,我们先想想人类是怎么玩连连看这个游戏的?

游戏开始,纵览全局,一眼扫到能够相连的两个相同的图片,就用鼠标去点,先点第一个,再点第二个,随着“撕拉”一道闪电两个方块随即爆炸,爽的不要不要,以此类推直到游戏结束,通过以上的操作可以细化出这样几个点来:

  1. 图片要相同。这个我们人类可以一眼就分辨出来。
  2. 两个点可以连通。很多人玩到现在也不是很清楚怎样能连,怎样不能,反正看了就知道,具体是啥硬性规则也并不是特别清楚。
  3. 点击,鼠标一个一个的点,如果刚点过的两个图片相同并且可以连通,就是“撕拉”一道闪电让你爽一下。

回到问题,人类是这样玩的?那机类能不能也这么玩?

答案是肯定的,计算机运算速度那么快,如果能想办法让他用和人类一样的思路去操作,那我们岂不是能轻易享受到“撕拉撕拉”的快感?而唯一需要我们做的,就是躺好,让她自己动。哦它!错别字!

想到这问题就清晰一些了,我们想让电脑按照我们的方式去执行和我们一样的操作,借助CPU发热的淫威,达到我们人类难以企及的速度,就是酱紫。那么计算机怎么像我们一样思考和操作呢?回到上面分析出的三点:

1. 它要能认出屏幕上相同的图片。
2. 它要知道某俩图片能不能相连。
3. 它要能像人一样去对着屏幕啪啪啪…地点击。

就像把大象装进冰箱一样,让电脑代替人脑,需要的也就是这么简单的三步。

第一步:它要能认出屏幕上相同的图片。

程序它如何能认识屏幕中的游戏中的一个一个的小方块呢?深受铺天盖地的Python培训班的广告洗礼,看到这个问题你肯定立马想到了:图像识别+机器学习


没错、乍一看屏幕中间一个个的小方块是很有规律的,也有明显并且规律性的色值的梯度变化,好像学了点AI看到这种需求不训练一下就不舒服!通过一些图像识别的算法一定可以让程序认出屏幕上的小方块来。

可以是可以,但这样做真的不会很麻烦嘛?这里我一定要跟在坐的提一下:无论是产品设计还是编码实现,一定要遵循一个核心原则:大道至简!什么叫大道至简?意思就是复杂的我也不会。

那简单的怎么做?其实很简单,这游戏从零几年发行后到现在就几乎没咋更新过,完全可以通过固定坐标去搜捕方块的位置:

  1. 首先,找到游戏窗体的位置坐标(windows API)
  2. 然后从屏幕上截张图(PIL)
  3. 从游戏窗体顶点的横纵坐标各加上一个数字,就找到了游戏区域(图中绿框),然后,通过图像切片的方式,在刚才截得那张图上,从点C开始,分别以方块宽度为高度为步长,把图像切割成n个小块,然后再比较这些图片是否相等,一样的就用同样的数字标识,空白就用0,就这样简单粗暴地完成了第一步。

至于我怎么知道方块的宽度高度,还有从顶点到游戏区域的距离?这个我是截图拿PS看的,不然还拿尺子量么。。。

第二步:判断两张图是否能够相连

图像转化成数据了,数据该怎么进行处理?

这里就得扯一下连连看的算法了,它的算法和它的规则关联度很大,它的规则是和拐点相关的:
两个方块的通路上,最多可以有两个拐点,如果用两个拐点还连不上,那他们就不能连通。 落实在算法上其实很好写也:

  1. 两个点能否直连是很好判断的,只需要判断两点之间的通路上是不是都为0就可以。
  2. 那么两点通过一个拐点连通的情况,就是其中一点到拐点,再从拐点到另一点两个直连的判断。
  3. 那么两个拐点的情况,就是一个点到拐点的直连+一个拐点到另一点的单拐点的情况进行判断。

这样写下来,几乎全是嵌套调用,最后全部都集中在直线的校验上。

第三步:如果能够相连,模拟鼠标点击屏幕

第二步判断出的两个点可以相连,那需要程序点击一下两个点就可以,通过刚才的判断两个点的坐标是可以知道的,那只需要再向两个坐标发送鼠标点击的时间就可以。这里通过python win32的API就可以实现模拟,贴心的答主已经在源码开头附上pywin32下载链接了。

最后,重复以上步骤

电脑会以惊人的速度向你反馈“撕拉撕拉”的快感。

一些闲蛋

就这么简单,落实在代码上200行出头就可以搞定!接下来就是一些闲扯的内容了,是我的一些看法和讨论,可能没什么技术含量和价值,不喜勿喷。

说好的图像识别呢?

相信很多人看了思路和源码一定很失望,根本没有什么高端的算法和逻辑,说好的图像识别,也就是用了一下opencv的函数比较了一下图像是否相等。当然,外挂确实实现了还很吊炸天。理想状态下当然是通过图像识别找出相同的图片然后分析计算然后执行自动消除的操作。但是不那么做的理由我在上面也说过了,大道至简…-_-||

程序中可改进的地方还有很多

1、这个外挂程序的局限性比较大,从我上面的分析就可以知道很多都是基于固定坐标来算的,那其实只要腾讯爸爸把这个游戏做的支持缩放,这个外挂也就跪了。但是腾讯没有,自打我有记忆以来,这游戏怕是有15年没更新了,600*800的像素在我同事的外星人上显示地像个幼儿版本。可能是看不上这一天两万人的用户量吧,还是开发新版本的欢乐斗地主更挣钱。

2、如果速度设置的较慢,让别人先赢了,将是一件比较尴尬的事情,别人赢了你再点击屏幕已经无效了,但是程序继续运行仍然会让鼠标在对应的位置点来点去。你还没法移动它去停止程序,你鼠标还没挪走呢,就又给你挪到其他位置了。此处应该设置个中断机智,能够随时停止程序的。

3、我在程序中使用的是opencv+numpy进行的图片读取,切片,还有图片是否相等的校验。后来同事给我提供了一种思路:1、PIL本身就可以进行图片切片,2、operater.eq()可以校验两个对象是否一致,用来校验切片出来的图像是完全可以的。 这样的话根本就不需要opencv和numpy,什么图像识别,根本不需要的,如果那么做,代码量还可以比现在更精简。当然运行效率上,operater.eq()跟opencv+numpy根本不是一个量级。

关于外挂

关于外挂有很多中办法实现,我说几种主流的,感兴趣的大佬可以再留言评论补充,

1、其中很大一部分,也是绝大多是外挂的主流做法,就是直接在本机改内存。你的游戏运行在我这里,代码就得加载到我的内存里运行,那么内存里的数据再抽象,总有高手能给它鼓捣出来。就比如说这个连连看,我也可以通过读取内存的手段直接拿到它方块布局的数据,直接把这个数据全改成0,那立马就赢了。不过这样的做法需要很高的技术含量,违反了我刚在说的大道至简原则!什么叫大道至简?意思就是复杂的我也不会。。。

有一些游戏数据必须要在本地进行处理的,很容易遇到这种外挂,比如地下城与勇士无限刷图啦,更比如吃鸡,CS这样的第一人称射击游戏,打一枪子弹中没中,不可能放到服务器去判断,一是判断不过来,二是受网络的影响实时性根本达不到要求。所以你一枪子弹打出去中没中,一定是放在本地进行计算的,既然是在本地内存里,一旦防范不到位那就有人能给你改,我们所谓的“飞天遁地锁血金身”什么的。像LOL就不多存在这样类型的外挂,一方面肯定是反外挂投入的力度大,另一方面就是因为你的操作全部都是由服务器来进行计算并反馈的,不存在太多本地数据篡改的风险。

2、另一种外挂,不在本机改内存,而是通过网络去骗数据,常见于数据协议被黑客窃取或破解,那他就可以按照协议格式发伪造的数据,来骗服务器。这种外挂我见过的比如GTA5 online版本,当时答主的舍友花50块买的外挂,头上一个劲儿的往出冒钱,外挂弄出的钱,退出后重新登录会消失,但是如果这些钱用来买了资产,那资产就实打实的是你的了。看上去也是很爽,感觉那外挂应该是了窃取某个加钱的接口,然后发模拟数据一个劲儿的刷。

3、再有,就是我的这种外挂,用程序来模拟用户的某些操作,类似于按键精灵的意思,得益于计算机优秀的运算速度,往往能达到人类难以企及的水平。除了我这个连连看,还有之前微信跳一跳的外挂也是如此。而这种外挂也很难防范,有些时候程序无法判断操作是来源于用户还是代码。

关于攻防

我是这个外挂的作者,所以也想说说关于如何防范这个外挂,以下来说说我替鹅厂想的一些法子来阻止我这个外挂。

1、最行之有效:窗体缩放。如果这个游戏的窗体可以缩放,那我这个外挂基本上算是废了,除非你每次玩的时候都能缩成固定的大小,并且每次保证都一样。如果真的修改地支持窗体的缩放了,那我的外挂就不得不通过真正的图像识别来搞了。当然,那样会很麻烦…而且我也不会。

2、检测每次点击的时间间隔,如果每次间隔都一样,则视为外挂。这属于比较蠢的办法之一,你是不知道python中生成个随机数有多简单,随便弄个0.5~2秒随机,那家伙比真人还真!

3、通过驱动级别的检测,看是否有鼠标输入。这个原理很简单,实现起来比较复杂。让程序的代码深入驱动底层去检测,如果没有捕获到鼠标点击,但是程序却收到了鼠标事件,说明这次点击是程序模拟的,直接过滤掉。但是这样做的研发成本是很大的,驱动底层的windwos编程带来的可能是巨大的兼容性难题,XP、win7、win10很有可能不一样。与其这样,干嘛还在每天2W用户量的连连看上面较劲,投入人力物力去开发欢乐斗地主不是更好么。

当然,鹅厂是完全有这样的能力和技术手段的。答主曾经遇到过一个windows键盘监听器,用C++钩子实现的全局键盘监听,可以监听一切用户输入。但腾讯QQ的登录框的密码,则是完全兼听不到的,这说明腾讯在此处做了比钩子更加底层的安全处理,也就是驱动级别的处理。题外话:银行官网登录时让下载的安全控件也可以提供这种级别的保护的,四大行只有一个会被钩子监听到按键输入,是哪一个我就不说了,曾经提交过反馈,不知现在处理了没有。

这个外挂其他语言能不能做

可以!答案是一定可以,这其中用到的技术没有一个是非python干不了了,只能说用其他语言,可能代码量多少的问题,比如我python用了200行有效代码,可能go需要300行? C++400行? java2000行…

哦,当然不是任何语言都可以,html和css就不行。

关于代码中不给针对QQ连连看的数据

外挂这种东西一定会多多少少损害到其他公司的商业利益,虽然鹅厂还轮不到我来考虑人家的商业利益,但是我仍然不希望外挂的配置代码从我手中散播出去。代码的开源一是为了交流和学习,二是为了Github上多多的star(不要脸到我自己都怕)。我也不扯什么伦理道德,我能做的,就只是管好自己。作为原作者也希望大家都能够做到:不要在公开场合散布有关破解QQ游戏连连看的配置信息,不要将此代码用于任何商业用途。

还有就是答主是个玻璃心,以上言论 有何不妥欢迎随时交流探讨,但是谢绝辱骂。

洋洋洒洒墨迹完,已经深夜了,祝大家好梦,就这样。

200行Python实现效果逆天的连连看外挂相关推荐

  1. 详解200行Python代码实现控制台版2048【总有一款坑适合你】【超详细】

    跟着实验楼学习了2048的Python实现,先丢个地址 200行Python代码实现2048 我接触Python时间不长,只了解一些基本的语法和容器,在学习的过程中遇到不少问题,这里做一个记录. cu ...

  2. 炫酷!200 行 Python 代码实现马赛克拼图!

    在一图胜千言的时代,没有什么比一张图片更有冲击力的了,那如果一千张图片拼接起来是什么效果呢? 别问,问就是两字 -- 炫酷! 你有没有想过上面的图片是怎么实现的,难道这是用 ps 一张张拼起来的?当然 ...

  3. Python实战2 - 200行Python代码实现2048(控制台)

    Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向 本文为第2篇–200行Python代码实现2048 一.分析与函数设计 1.1 游戏玩法 2048这款游 ...

  4. 用 200 行 Python 代码掌握基本音乐理论

    本文作者是一位多年自学成才的吉他手,但对西方乐理一无所知,因此决定编写一些代码来搞懂它. 本文用了大约200行Python代码来帮助我们理解西方音乐理论的基础知识. 我们将首先查看西方音乐理论中的音符 ...

  5. python换脸教程_教你如何用200行Python代码“换脸”教程

    原标题:教你如何用200行Python代码"换脸"教程 本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步 ...

  6. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  7. 20行python代码的入门级小游戏-200行Python代码实现的2048小游戏

    2048这个小游戏大家都不陌生,应该都玩过,之前已经在网上见过各个版本的2048实现了,有JAVA.HTML5等,今天我就给大家来一个我自己在 实验楼 学到的python版2048.所有代码加起来才2 ...

  8. python200行代码_如何用200行Python代码“换脸”

    本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步: 检测面部标记. 旋转.缩放和转换第二张图像,使之与第一张图像相适应. 调 ...

  9. 人工智能换脸pythonapp_如何用小200行Python代码做一个换脸程序?

    今日不同往常,每周干货日,场主送出的不是成套的各类编程教学视频,而是一些轻应用实操.因为完成基本的理论学习之后,任何的呈现都在于如何应用及创新. 所以,在分享一系列教材类视频外,场主还会穿插着分享给大 ...

最新文章

  1. ext2文件系统 - mke2fs
  2. CVE-2017-0004相关lsass拒绝服务漏洞杂谈
  3. 树莓派学习笔记——交叉编译工具链
  4. 《互联网公司工程师图鉴》
  5. CC2540蓝牙开发二 OSAL系统
  6. Apache Airflow调度中心发布任务步骤
  7. 京东秒杀技巧有哪些(京东秒杀技巧大全)
  8. 为实施了IFD的Dynamics 365更换自签名的SSL证书以符合Chrome的要求
  9. Chrome谷歌浏览器插件的本地存放位置
  10. 物联网卡无法激活使用的原因
  11. Rationla Rose
  12. 浅谈屏幕拍摄泄密跟踪的检测技术
  13. windows虚机环境下,如何快速有效的删除大文件夹?
  14. android 对数标度 图库,如何排序水平堆积条形图JS(具有对数标度)
  15. Python 基础知识教程
  16. objc.io 3.1 图像是怎样绘制到屏幕的 (转)
  17. 如何获取股票的净利润、每股收益、主营营业收入
  18. 东南大学机械学院考研经验
  19. 高新技术企业研发费用怎么归集?
  20. 【数据结构与算法基础】模式匹配问题与KMP算法

热门文章

  1. 华为全栈人工智能-AI发展新趋势
  2. OGRE3D 使用CMake + MinGW Make源码编译安装
  3. 摄影测量后方交会-前方交会(C#)
  4. 6.3-Django第三天
  5. K9F1208U0M(64M nand flash)手册阅读以及相关驱动程序分析
  6. 转载---编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议41~46)...
  7. 嵌入式Linux下基于FFmpeg的视频硬件编解码
  8. 你觉得什么样的程序员才算真正的大神?我今天想说两句!
  9. 家庭网络组网技术介绍
  10. micropython stm32f405_STM32F405RGT6核心板兼MicroPython开发板的电路方案设计(原理图+完整工程)...