微信跳一跳
2017 年 12 月 28 日下午,微信发布了 6.6.1 版本,加入了「小游戏」功能,并提供了官方 DEMO「跳一跳」。这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人」跳跃的距离。分数越高,那么在好友排行榜更加靠前。
辅助脚本
wechat_jump_game(https://github.com/wangshub/wechat_jump_game)是一个python2编写的辅助外挂。操作简单,易于配置,支持Windows和Mac平台,通过移植也可以跑在Linux平台。辅助通过Python的图片操作库分析手机实时的截图,通过图像识别获取棋子位置和棋盘的位置,从而通过ADB模拟点击操作完成自动操作。
下面是辅助脚本工作的视频:
辅助工作原理
将手机点击到《跳一跳》小程序界面
用 ADB 工具获取当前手机截图,并用 ADB 将截图 pull 上来
计算按压时间
手动版:用 Matplotlib 显示截图,用鼠标先点击起始点位置,然后点击目标位置,计算像素距离;
自动版:靠棋子的颜色来
识别棋子,靠底色和方块的色差来识别棋盘;
用 ADB 工具点击屏幕蓄力一跳
思路以及代码分析
核心:我们这次讲解以最常用最好用的自动脚本为例。每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标,根据两个点的距离乘以一个时间系数获得长按的时间
1.首先脚本会检测ADB的可用性,并获取当前手机型号,分辨率等信息。
获取手机分辨率
注意re.serarch是正则表达式操作,目的是从ADB输出中提取出屏幕分辨率的两个数字。
调用配置文件
这段函数实际的操作是通过获取的屏幕大小获取之前已经调试好的数据,包括根据屏幕大小测算好的二分之一的棋子底座高度,棋子的宽度,长按的时间系数(后文会继续说明)等等。
2.截图以及从手机拉取到PC
3.关键步骤:寻找棋子坐标和下一跳棋盘坐标
识别棋子:靠棋子的颜色来识别位置,通过截图发现最下面一行大概是一条直线,就从上往下一行一行遍历,比较颜色(颜色用了一个区间来比较)找到最下面的那一行的所有点,然后求个中点,求好之后再让 Y 轴坐标减小棋子底盘的一半高度从而得到中心点的坐标
这段代码的核心是Python的PIL库操作,如果不了解请自行Google学习。
这段代码开始搜寻棋子底端近似一条直线的特征,通过一个近似的RGB颜色区域来判断是否是棋子,当程序搜寻到最后一行的时候,计算这一行所都X坐标的平均值记做中点X值,然后将Y坐标向上移动一半棋子底盘高度的值,也就是定位到棋子底面中心,以此确定最终棋子的确切位置
识别棋盘
上述代表根据棋子坐标确定下一跳棋盘的开始结束坐标
这时候从边界最上方一行一行扫描,由于圆形的块最顶上是一条线,方形的上面大概是一个点,所以就用类似识别棋子的做法多识别了几个点求中点,这时候得到了块中点的 X 轴坐标,这时候假设现在棋子在当前块的中心,从上顶点往下 +274 的位置开始向上找颜色与上顶点一样的点,为下顶点,取两者平均则是棋盘上平面中心点Y坐标。另外,如果上一跳命中中间,则下个目标中心会出现 r245 g245 b245 的白点,寻找这个白点可以直接找到棋盘上平面的中心点Y坐标
中心点如图:
274像素的寻找方式:
4.测算两点距离和点按时间确定
两点距离计算
距离的求法很简单,和初中直角坐标系下两点距离公式一致:
通过距离推算按压时间
上述代码提及了press_coefficient也就是上文提到的长按的时间系数,这个量与屏幕大小有关,作者通过大量的调试数据为我们提供了这个比例系数,在脚本初始化时,脚本会根据屏幕分辨率(个别手机需要单独考虑)来读取各自的config文件,获取这个系数,下面是1080*1920分辨率屏幕的config文件:
从github里这么多分辨率的适配config可以看出,这不是一个人的工作,包括一些特殊机型的适配文件,这些都是Github上众多开发者共同协作的结果,这就是开源精神。
通过ADB模拟点按操作
其本质是通过adb命令,给手机模拟按压事件
其中 x 和 y 是屏幕坐标, time 是触摸时间,单位ms。在代码中可以参见jump()函数。以上就完成了一次完整的操作。
5.整体循环逻辑和防和谐
以上是完整的主函数循环逻辑,其中还为了防止微信官方屏蔽特意加入了“喘息时间”的机制,即一定步数之后休眠一定时间,还是很机智的呀。
仍然存在的问题
由于实现的方法还存在漏洞,程序还存在以下问题:
1.该算法对所有纯色平面和部分非纯色平面有效,对高尔夫草坪面、木纹桌面、药瓶和非菱形的碟机(好像是)会判断错误,若上一跳由于某种原因没有跳到正中间,而下一跳恰好有无法正确识别花纹,则有可能游戏失败,由于花纹面积通常比较大,失败概率较低
2.还没有智能识别唱片机等加分物件。
总结
领取专属 10元无门槛券
私享最新 技术干货