跳一跳python辅助软件思路及图像识别源码解析

本文将梳理github上最火的wechat_jump_game的实现思路,并解析其图像处理部分源码

首先废话少说先看效果

核心思想

获取棋子到下一个方块的中心点的距离
计算触摸屏幕的时间
点击屏幕

重要方法

计算棋子到下一个方块中心点的距离

  • 使用 adb shell screencap -p 命令获取手机当前屏幕画面
  • 再通过图像上的信息找出棋子的坐标和下一个方块中心点的坐标
  • 然后通过两点间距离公式计算出距离

计算触摸屏幕的时间

  • T=A * S
    其中S为上步算出的像素距离,T为按压时间(ms),A为一个系数这个系数会随着屏幕分辨率的变化而变化,在1920*1080的屏幕下这个系数为1.35,在2560*1440的屏幕下这个系数为1.475

点击屏幕

  • adb shell input swipe x y x y time(ms)
    这条命令能够点击手机屏幕x,y位置time(ms)

图像处理部分源码解析

图像处理部分代码都在 find_piece_and_board(im) 方法中

通过输入的图像im计算出棋子的坐标点以及下一个方块中心的坐标点

在find_piece_and_board的方法中一进来就是下面的两个嵌套在一起的for循环:

    for i in range(int(h / 3), int(h * 2 / 3), 50):last_pixel = im_pixel[0, i]for j in range(1, w):pixel = im_pixel[j, i]# 不是纯色的线,则记录 scan_start_y 的值,准备跳出循环if pixel[0] != last_pixel[0] or pixel[1] != last_pixel[1] or pixel[2] != last_pixel[2]:scan_start_y = i - 50breakif scan_start_y:break

这段代码的作用就是从屏幕2/3的位置向下寻找不是纯色的线。并将找到位置的纵坐标-50作为,寻找棋子和方块的起始坐标。这样可以简化以后搜索的工作量,因为在这个横坐标以上是没有东西的。

接下来是查找棋子坐标的代码

# 查找棋子坐标# piece_x_sum 横坐标总量 piece_x_c 点的个数 piece_y_max 纵坐标最大值# 从 scan_start_y 开始往下扫描,棋子应位于屏幕上半部分,这里暂定不超过 2/3for i in range(scan_start_y, int(h * 2 / 3)):for j in range(scan_x_border, w - scan_x_border):  # 横坐标方面也减少了一部分扫描开销pixel = im_pixel[j, i]# 根据棋子的最低行的颜色判断,找最后一行那些点的平均值,这个颜色这样应该 OK,暂时不提出来if (50 < pixel[0] < 60) and (53 < pixel[1] < 63) and (95 < pixel[2] < 110):piece_x_sum += jpiece_x_c += 1piece_y_max = max(i, piece_y_max)if not all((piece_x_sum, piece_x_c)):return 0, 0, 0, 0# 平均横坐标piece_x = int(piece_x_sum / piece_x_c)# 纵坐标最大值-底座一半的高度piece_y = piece_y_max - piece_base_height_1_2  # 上移棋子底盘高度的一半

查找棋子的重要依据就是棋子的颜色较为单一并且和方块的颜色有较大差距。如果一个像素点的RGB像素值在B(50, 60), G(53, 63), R(95, 110)范围内那么就认为这个像素点是属于棋子的。根据以上信息就能计算出棋子的平均横坐标,以及最大的纵坐标值。

所以不难计算出棋子坐标(棋子平均横坐标, 棋子最大纵坐标 - 底座一半的高度)其中底座一半的高度因手机分辨率而异。需要提前配置好。

最后是查找下一个方块中心点的坐标的代码

# 寻找最高的棋盘# 棋盘不会和棋子在同一侧# 限制棋盘扫描的横坐标,避免音符 bugif piece_x < w / 2:board_x_start = piece_xboard_x_end = welse:board_x_start = 0board_x_end = piece_xfor i in range(int(h / 3), int(h * 2 / 3)):last_pixel = im_pixel[0, i]if board_x or board_y:breakboard_x_sum = 0board_x_c = 0for j in range(int(board_x_start), int(board_x_end)):pixel = im_pixel[j, i]# 下一个棋盘紧贴着棋子# 修掉脑袋比下一个小格子还高的情况的 bugif abs(j - piece_x) < piece_body_width:continue# 修掉圆顶的时候一条线导致的小 bug,这个颜色判断应该 OK,暂时不提出来if abs(pixel[0] - last_pixel[0]) + abs(pixel[1] - last_pixel[1]) + abs(pixel[2] - last_pixel[2]) > 10:board_x_sum += jboard_x_c += 1if board_x_sum:# 最高棋盘的平均横坐标board_x = board_x_sum / board_x_clast_pixel = im_pixel[board_x, i]

代码开头通过棋子所在的屏幕位置限制搜索的宽度,如果棋子在屏幕左边那么就在屏幕右边搜索方块,反之亦然。因为方块和棋子不会在屏幕同一侧。

然后就是自上而下得搜索方块的上顶点。
方块上顶点坐标( 平均横坐标,当前行的纵坐标)

然后再往下纵坐标+247的位置开始向上找颜色与上顶点一样的点,为下顶点。
当然此方法有一点局限性对于纯色的平面效果很好但是对于非纯色的平面。可能会判断出错。

如果上一跳命中中间,则下个目标中心会出现 r245 g245 b245 的点,利用这个属性弥补上一段代码可能存在的判断错误
若上一跳由于某种原因没有跳到正中间,而下一跳恰好有无法正确识别花纹,则有可能游戏失败,由于花纹面积通常比较大,失败概率较低

可改进方案

首先是目前方案对于多分辨率需要多个配置文件来记录不同分辨率下的系数以及棋子底盘一半的高度。随机测试了6台手机其中有两台手机因没有配饰而无法正常运作

首先是系数A,观察方程T=A * S,A就是一个可训练量,利用机器学习框架比如TensorFlow,对这个一元一次方程进行拟合。

观察棋子底盘一半的高度在代码中的作用。不难发现是为了求出棋子底盘中心的纵坐标。而棋子底盘中心的位置恰恰是棋子最宽的地方。所以可以通过找出棋子最宽处的纵坐标的方式找到棋子底盘中心的纵坐标。这样就摆脱了对配置文件的依赖,能让代码在任何手机上正常运行。

其次是对于方块中心坐标位置的判断方法出错率较高,虽然有中心白点可以弥补但是在大量跳跃的过程中还是会出现错误。3太手机不停运行了一下午,最高分只有2009分。

现方法出错率高的原因是使用纯颜色方法判断,但是在实际游戏中颜色丰富的方块也不少。如果想改变就不能依赖颜色方法判断,而应该通过几何图像的形状来计算方块的位置。不难发现游戏中方块只有棱形和圆形两种形状。

首先通过canny或其他轮廓查找算子提取出图像的轮廓,然后通过霍夫变换提取出圆形和棱形的中心坐标。

以上是我个人的一些见解。欢迎大家评论区一起探讨学习

跳一跳python辅助软件思路及源码解析相关推荐

  1. python辅助脚本教程_微信跳一跳python辅助脚本实例分享

    本文主要为大家整理了关于微信跳一跳的辅助脚本内容,这次我们给大家整理的是关于python的脚本内容,一起来学习下. 这段时间微信跳一跳这个游戏非常火爆,但是上分又非常的难,对于程序员来说第一个念头就是 ...

  2. python学法用法 自动刷分_微信跳一跳python辅助工具刷分教程详解

    随着身边不少小伙伴都加入了微信跳一跳挑战,朋友圈最近都被刷爆了,为了刷分,很多小伙伴都开始开挂了,Github大神wangshub分享了一个针对该游戏的开源项目,那微信跳一跳python怎么刷分呢,下 ...

  3. python 解包_【源码解析】python解包操作一文完全理解

    解包是如何操作? >>> a, b = [1, 2] # 以下为此解包操作的字节码 0 LOAD_CONST 1 (1) 2 LOAD_CONST 2 (2) 4 BUILD_LIS ...

  4. 手把手教你Python+selenium爬虫百度文库源码+解析

    免费资源猫-爱分享的猫. 最近小编在弄python爬虫项目,可能大家一听爬虫,就觉得高大上,其实爬虫并没有多难,只要你稍微研究一下,掌握了基础的东西,后续爬虫就是重复利用的事情了.今天给大家来一下普及 ...

  5. MyBatis3源码解析(6)TypeHandler使用

    简介 在上几篇中,介绍了MyBatis3对参数和结果的解析转换,对于常规数据类型,默认的处理已经足够应付了,但日常开发中会有一些特殊的类型,就可以通过TypeHandler来进行处理 示例准备 本篇文 ...

  6. Spring 之 @Cacheable 源码解析(上)

    一.@EnableCaching 源码解析 当要使用 @Cacheable 注解时需要引入 @EnableCaching 注解开启缓存功能.为什么呢?现在就来看看为什么要加入 @EnableCachi ...

  7. 跳一跳python源码下载_Python玩跳一跳【简】

    准备环境: Windows 10: [有] 安卓手机 [有] python(版本建议3以上) adb驱动 依赖安装包 Python下载安装[官网下载并安装] 详情参见 pip安装 pip用于安装依赖包 ...

  8. python手机小游戏刷分器_Python跳一跳刷分辅助下载|python跳一跳刷分安卓版下载V1.0(暂未上线)_预约_飞翔下载...

    python跳一跳刷分辅助是一款专为微信跳一跳制作的免费刷分工具,绝对是从根源上找到高分技巧,通过源代码完成高分获取.用户可以通过这款软件轻松在线免费刷分,分分钟刷取最高分不是问题.该软件性能安全稳定 ...

  9. 跳一跳python刷分_【Python跳一跳刷分辅助】iPhone版_Python跳一跳刷分辅助Ios最新版下载_Python跳一跳刷分辅助v1.0.1苹果版免费下载 - 九酷苹果网...

    Python跳一跳刷分辅助工具免费提供了,绝对是从根源上找到高分技巧,通过源代码完成高分获取,喜欢这类小游戏的你不要错过了这款辅助了~ Python跳一跳刷分辅助原理: 原理说明 将手机点击到< ...

最新文章

  1. 4月第4周全球域名商TOP15:万网第四 增势减弱
  2. A02 创建实验环境快照
  3. 下载服务器文件到本地
  4. 【ORACLE】20道Oracle运维常见面试题
  5. Vulnhub靶机渗透之 AI: Web: 1
  6. ie8.0 不能用document.all兼容IE7模式
  7. 【机器学习】那些决定模型上限的操作
  8. heightForRow
  9. VS 中PageLayout 属性设置
  10. visual studio安装dlib
  11. Linux下更改目录及其下的子目录和文件的访问权限
  12. 翼次元空间:智协云店通+BitCOO的4WiN.io全球互贸链 | Fund++
  13. 小程序https本地服务器,微信小程序搭建自己的Https服务器
  14. zoj 2476 Total Amount
  15. 悼念博客专家雷霄骅七律诗一首
  16. 【Multisim仿真】NE555电路三角波、方波、正弦波发生器
  17. 挖掘机技术到底哪家强?这个问题终于有答案了!!
  18. 关于互联网“毕业“的一些思考
  19. Hadoop学习(1)--Hadoop介绍
  20. 专业创造奇迹 彩票行业进入数据分析时代

热门文章

  1. CSS3中的transition和transform属性
  2. 四川大学计算机专业调剂,四川大学计算机学院(软件学院)2019考研调剂信息
  3. 送大家一个圣诞节挂件小程序,微信头像可以戴圣诞帽了
  4. AT89S52之(定时器2)Timer2
  5. 程序员面试官何苦为难程序员!
  6. html轮播图水平传送带,12款 jquery轮播插件
  7. viper4android顶级脉冲,ViPer4android. FX顶级音效!
  8. Python实现钉钉/企业微信自动打卡
  9. httpqyl.php,php使用base64加密解密图片示例分享_PHP
  10. 【python练习】羊车门问题