“跳一跳”游戏外挂原理详析(自动版)

“跳一跳”外挂自动化

前言

在上一篇“跳一跳”游戏外挂原理详析(手动版)中,讨论了跳一跳外挂编写的原理,以及手动版的实现,但是在文章最后提到了不足,就是手动太累了,这篇文章通过图像处理的方法,实现棋子和棋盘的定位,从而实现自动化跳跃。如果大家对原理不清楚,可以去看手动版。

第一节

小曲折

以上图为例,主要是确定红色部分的位置:棋子的位置和下一个物体中心。

对棋子的识别,一开始的思路是使用模板匹配,因为棋子的形状和颜色没有变化,具体做法就是将图中的棋子截图下来作为模板,然后使用opencv的模板匹配函数,可以直接匹配出棋子的位置,为了降低依赖,我没有使用opencv,这需要配置环境,而是使用了Python中的skimage图像识别库,anaconda环境中自带这个包,识别代码截图如下(但是我最终放弃了这种做法):

知道左上角坐标,然后还知道棋子模板的长宽,自然也就求出来了棋子所有位置。

但是这个识别真心有点慢。。。最后我抛弃了这种做法,虽然最后也能跑的很高

之后我参考了https://github.com/wangshub/wechat_jump_game,这个开源项目中图像识别的部分 ,发现写的真心不错,不需要依赖很多库,仅仅使用pillow库,最后我移植它图像处理的代码到手动版中。下面我给大家讲解一下它的思路,真心简单。。。

第二节

棋子的识别

棋子的识别主要是靠颜色,棋子的颜色一直没变。

第一步:确定棋子的扫描范围,为了识别快速,我们必须缩小棋子的位置。

棋子的位置是位于图像 h/3 和2h/3之间,棋子颜色和背景颜色有明显的区别,在扫描的过程中,如果发现颜色突变,就意味着快要找到棋子的位置了。这是一个粗调的过程。

代码截图如下:

第二步:从上一步获取的棋子大致位置,接着往下扫描,棋子的颜色RGB:50<R<60,53<G<63,95<B<110,只要是在这个区间的,就是棋子。代码截图如下:

经过这段代码,最后确定的位置是下图红点所示的地方,我们就把这个地方,当做跳跃的起点。

第三节

棋盘的识别

比较复杂的是棋盘的识别,主要是规避一些bug,

第一步:依然是缩小扫描区域,当棋子在图像左半部分时,那棋盘就在右半部分,当棋子在图像右半部分时,那棋盘就在左半部分,从而确定大致的范围。代码截图如下:

这样做的好处,不仅仅是缩小了扫描范围,同时也可以规避音符bug,大家跳到音乐盒上时,会出现音符

第二步:首先确定棋盘的上顶点,其识别方式和识别棋子的差不多,从上到下扫描,棋盘的上顶点和背景颜色差别很大,发现颜色突变,就认为找到了上顶点。代码截图如下:

有两个问题需要注意:1.当出现棋子比棋盘高的时候,会先扫描到棋子,这就会出现bug;2.当棋盘是圆形的时候,顶部是一条线,所以多采集几个点求平均。

第三步:最后确定棋盘的下顶点,知道上下两个顶点,中心点也就确定了。采取的方法比较粗暴,就是从上一步中获取的上顶点下方,向上扫描,发现颜色和上顶点相近的点,就认为是下顶点。我选的是从上顶点+274处,开始往上扫描。代码截图如下:

有时候会出现误判,尤其出现有花纹的棋盘时。对于这种误判,我们可以采取进一步的拯救措施,不知道大家发现了没有,当你一次命中棋盘中心,下一次的棋盘中心,会出现白点,我们可以通过判断白点的位置进行位置修正。白点的RGB为:245,245,245。

最后确定了下顶点 ,在和上顶点一结合,中心也就出来了。

通过勾股定理,就算出棋子到棋盘的距离了。

第四节

代码与演示

源码:https://github.com/qiyeboy/LuLunZi

大家按照手动版那篇文章的方法,将手机通过USB调试模式,连接到手机,并启动跳一跳,运行 python main.py,就可以尽情的刷分了(太高会清空)。

第五节

最后的福利

第一种方案:有很多朋友,问我ios该怎么办,最后给大家推荐这个开源项目:https://github.com/wangshub/wechat_jump_game

不仅有android,ios,还有很多屏幕的适配,很强大。

第二种方案:关注下面的二维码:回复3,就会有跳一跳的教学视频,以及辅助

第六节

小插曲

大家肯定注意到我之前发的http://fankehui.cn/t/t.php,大家一点击就会调到支付宝中自动领取红包,后台朋友让我分享一下原理,其实原理很简单,利用微信浏览器的WeixinJSBridge功能,跳到默认浏览器,接着再唤醒支付宝app,从而实现红包领取。现在android版微信,这个功能已经被腾讯封了,ios版这样做依然可以。大家如果想了解具体的代码,百度一下 微信唤醒支付宝,代码一大堆。。。

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2018-01-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

理解音频焦点 (第 3/3 部分):三个步骤实现音频聚焦

3064
来自专栏PPV课数据科学社区

从0到1掌握R语言网络爬虫

引言 网上的数据和信息无穷无尽,如今人人都用百度谷歌来作为获取知识,了解新鲜事物的首要信息源。所有的这些网上的信息都是直接可得的,而为了满足日益增长的数据需求,...

3014
来自专栏数据派THU

教你在Tableau中绘制蝌蚪图等带有空心圆的图表(多链接)

本文将通过分享多种方法,包括成功的与失败的尝试,来讲解如何在Tableau中创建蝌蚪图等带有空心圆的图表。

1244
来自专栏Python入门

python可视化神器——pyecharts库

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常...

3725
来自专栏超智能体

超智能体M01:7分钟入门线性代数+微积分

2285
来自专栏BestSDK

从苹果按钮说起,交互设计中的那些小细节

苹果说,不论移动或电脑设备,行动按钮(Action button)都放在右边,也就是说*确定按钮放在右边*: ? 苹果的移动设备 ? 苹果的电脑设备 微软说,除...

2725
来自专栏desperate633

comsol快速入门教程

我自己参照官网的教程,写了个比较通俗易懂的入门教程,字多图多慎看(大三的时候写的)。

732
来自专栏张善友的专栏

C#数学计算包 Math.NET

Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂...

2205
来自专栏玉树芝兰

如何用Python提取中文关键词?

本文一步步为你演示,如何用Python从中文文本中提取关键词。如果你需要对长文“观其大略”,不妨尝试一下。

982
来自专栏玉树芝兰

如何用Python处理自然语言?(Spacy与Word Embedding)

本文教你用简单易学的工业级Python自然语言处理软件包Spacy,对自然语言文本做词性分析、命名实体识别、依赖关系刻画,以及词嵌入向量的计算和可视化。

721

扫码关注云+社区