wechat-jump
偶然看了简书上大牛的文章,就实现了一下,当然,由于大牛很多地方写得太高深,就自己重写了主要的逻辑和关键的几个步骤。
image.png简介
微信跳一跳小脚本,没有测过上限,但是基本玩太嗨是要没朋友的。
比较悲剧的是过700 基本就会被抓作弊,暂时没想到比较好的优化。
心情复杂,。
这里又尝试了逐步提高成绩,可是这距离我上三千分实在有点遥远。
image.png
环境
- python2.7和相关py的依赖,
- 安卓adb驱动
- 自行下载并配置环境
配置说明
- path: adb对手机截图后回传到计算机的文件名,默认就好
- screenshot_backup_dir: debug 截图文件的目录
- swipe: 手指按压点:最好按照真实习惯设置
- gameMaxCount: 最大游戏次数
- press_lambda: 压力系数,建议不要改,改了可能会跳的太远,这个主要是乘以距离用的
- maxStep: 最大步数,限制一下一次游戏最大的步数,后面还会进行高斯分布,这只是个大概值
- maxScore: 最大分数,限制游戏最大分数,防止分数太高被认为作弊,同样是个大概值,会进行高斯分布
- sigma: 正态分布的参数,决定了最大步数和最大分数的发散程度,越大越发散
实现思路
主流程
- 用adb 获取屏幕截图
- 分析图片,获取棋子位置和目标块的位置,获取当前分数(非必需)
- 计算棋子和目标块的距离,据此算出按压时间(这个可以多次调试出来)
- 用adb发送按压命令
adb参考命令
- 扫描并推送到计算机指定目录
adb shell screencap /sdcard/screen.png
abd pull /sdcard/screen.png
- 模拟点击
adb shell input tap 540 1584
- 模拟按压(x1,y1,x2,y2,time)
adb shell input swipe 500 1500 572 1600 800
分析图片
得到棋子的位置
从1/3高度开始分析,这边要先用ps采集一下棋子的颜色,然后分析是对比颜色找到棋子的位置
image.png
大概在中间1/3的位置扫描就好了
取色的话,大概取下面的
把所有和这个颜色相似的点都取到,取均值得到下面的中点,然后向上平移一点,得到棋子的中心
得到目标块的位置
-
从1/3高度开始逐个像素分析,得到第一个和背景不一样的点,就是目标块的上顶点
然后沿着竖直方向找到下面的顶点,就可以得到中心
image.png
图像中数字识别
-
分数识别:先截取一下图片,分析发现每个数字一样大小。分析图片建议用FW或PS
image.png - 保存一套0-9的样本,这边我是先写个脚本截图,然后转为黑白图存到本地,也就是我项目中map文件夹里的文件。这边做黑白图处理要注意噪点问题。
-
得到map文件后,每次需要对比,就先加载一下图片,转为向量。然后把要比较的图片也转为向量,计算向量的距离。因为是高度一致的,所以距离为0的就是那个数字。
-
在我的代码中,图像中分数的识别主要在imgSeek.py中实现
感谢
参考了大牛(神奇的战士)的文章:https://zhuanlan.zhihu.com/p/32452473
程序相关
本人联系邮箱:siriusing.cc@qq.com
github:https://github.com/siriusprofessor/jump
想法
没有深奥的技术,简单的代码就可以实现。事实上这里不需要什么机器学习啥啥的,画个图算一下坐标就好了。
当然,图像中数字识别,一开始真的打算训练个k-mean来做,或者逻辑回归的人工神经网络,不过想想就觉得没必要,把图像转为向量,那就是两个向量的距离问题,而且是绝对一致的k类。所以分析问题很重要。
网友评论