Skip to content

cpruan/enjoyself.wechathop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

enjoy-self

做点小东西
正在学习Python萌新一枚,跳一跳有点火,在看了几篇相关的辅助程序的思路后,想自己写一个简易版本试一试。 棋子指紫色小人,棋盘指下一个要到达的平台。

WechatHop (for Android)

本程序主要借鉴了 https://github.com/liuben/weixinhop 的思路,对其表示感谢。思路即:
1. 手机端利用adb截图并传输图片到电脑端;
2. 电脑端通过识别图片,计算触摸时间;
3. 通过adb控制手机端操作。

识别图片,计算时间:

1. 识别图片中的“棋子”与“棋盘”,利用“棋子”、“棋盘”的像素与背景有色差,且“棋子”颜色固定,亮度较低等特征,找到“棋子”、“棋盘”的左上首个像素。
2. 找到“棋子”的中心位置、“棋盘”的中心位置,计算“棋子”和“棋盘”的横坐标之差△X。
3. 无论向左跳向右跳,由于棋子运动的路线与x轴的夹角是固定的,即△S = △X * arcsin(常数) = △X * 常数。就是说触摸时间与目标横坐标之差△X成正比。 4. △T(触摸时间) = K * △X(横坐标之差)。知道了成正比,我们只要找到这个常数K就好说了。恰巧开始游戏的第一幅图,位置总是固定的,所以可以用来尝试出这个常数K。以我的尝试结果,△T = 723ms时中圆心概率最大,此时△X = 455 (for 1080p) 或者 607 (for 1440 * 2560)。So, K = △T/△X = 723/455 or 723/607

(啰嗦的)使用说明:

1. 手机端准备:由于依赖ADB工具,所以本方法只适用于Android手机,需要打开调试模式,连接电脑,可能需要确认“是否允许计算机调试?”的弹窗通知。根据手机分辨率,设置程序里的初始设置。
2. 电脑端准备:需要安装手机相应驱动,我的办法是手机开调试连接电脑,打开豌豆荚之类的手机助手,如果豌豆荚连接成功,那就基本没问题了;即使没有驱动,豌豆荚也能自动下载驱动的。
3. 设置基本参数:用IDE打开程序,参数在程序最下面,包括:

  • 预期跳多少步,默认70,如果发现步数跳玩了还没Game Over的话,可以让程序再跑一遍,“棋子”会继续跳的。
  • 手机分辨率,默认2k: 1440 * 2560
  • 手机截图存储路径,默认/storage/emulated/0/test/
  • 电脑端图片存储路径,默认C:\Users\Administrator\test<br>

4. 运行辅助程序:手机进入跳一跳游戏界面,电脑端用IDE执行.py程序即可。
也可在CMD窗口输入python C:\Users\Administrator...\Wechathop v1.0.py(注意补充完整路径),或者在CMD窗口输入python ,再将.py文件拖入CMD窗口,回车即可。 5. 程序中包含Debug模块,用于检测采集的像素点是否正确,会生成采集点位置的截图用于判断,默认改成注释了,有兴趣可启用看看效果。

还有三句:

1. 得分:我跑过3200左右,但分数不很稳定,平均能跑1000+。如果100就挂的就多试几次吧,10003000问题不大 2. 准确率:从Debug结果来看,识别还算是准确的,目测99%以上能准确识别“棋子”与“棋盘”位置,但仍然不能保证永远跳下去,分析原因有二:

  • 该算法不一定能准确定位“棋子”与“棋盘”的中心左边,稍有偏差在后面的跳跃中可能消除也可能累积。
  • 累积的原因在,“棋子”跳跃方向与X轴的夹角并不是完美固定的,“棋子”的起点不全是正中心,而游戏团队设定的目标点却是下一个“棋盘”的中心,导致跳跃方向总有些微的摆动,累积起来,“棋子”就可能挂掉,难以避免。不过如果“棋子”刚好在中心,那么下一次跳中心的概率也比较大。

3. (吐槽)效率:我尝试过优化,目前跳一步需要的时间平均在5s左右,依次分为三部分:adb截图、时间计算、adb触摸操作,用时依次约为2s、0.5s、1.7s。
然后我就发现优化不动了......除非去开发个Android APP,操作全在手机端会更快......那还得去学JAVA......捡个鼠标垫配台电脑系列......Orz
“时间计算”部分优化前大约费时2~2.5s,看来还是有效果的,只是数算还没看全,写出来的算法也只算造了个bug。
此外,我还在adb触摸操作后加了个time.sleep(1),以防“棋子”刚落地,图片未稳定就被“adb截图”了。sleep 1s其实仍可能有跳到正中心激起的光圈影响(毕竟基于对截图的像素颜色分析嘛),不过还好,似乎不太影响识别成功率。

再胡扯一下

4. 微信团队似乎新增了一些反作弊的措施,很多次分数甚至低分都不被记录排行了......我分析可能的屏蔽机制有这么几种:

  • 你被腾讯老大哥盯上了,得的分数大概率被无视。
  • 进步速率,比如下一次分数不能超过上一次分数的百分之多少,否则不记录。
  • 触摸位置,我不清楚微信是否能获取用户的触摸位置,如果用辅助(无论物理辅助or程序辅助),触摸位置容易被忽视,往往固定不变。则有可能触摸位置不变化的高分会不被记录。
  • 触摸频率,如果用辅助(无论物理辅助or程序辅助),触摸频率往往比较固定,且比人操作偏慢,因此可能对触摸频率固定的高分不记录。

About

Python + adb 玩“跳一跳”小游戏

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages