Python + 新手 制作“跳一跳”辅助程序

刚开始学习Python,萌新总有一颗渴望做实践享受成就感的心,最近“跳一跳”比较火,在看了一些前辈的辅助程序教程后,我就也想写一个自己版本的辅助(for Android)。

写辅助程序的起因就是这样啦,我觉得写“跳一跳”的辅助比玩“跳一跳”更有趣,所以对于那些被辅助程序伤到的“跳一跳”玩家,我表达一下歉意~

另外也希望把我的思路分享给大家,代码挂在这里,供大家各取所需,自娱自乐~

enjoyself.wechathop

下面就聊一聊这个程序的细节啦,首先是实现原理,萌新版本的原理当然很简单啦。由于很多的知识不太懂(比如os库、Image库、ADB操作等),不懂的部分我就试着套教程、或者照搬别人的轮子。我主要借鉴的是 @霍雍 在下面这篇文章里的程序结构,只是修改了其中的算法。

霍雍:人人都能看懂的“跳一跳”平民算法

程序中最主要的部分都集中在“jump_one函数”(基本是copy了@霍雍 的部分),每一次跳跃的实现主要分为五个步骤:

def jump_one(filename):
    os.system('adb shell screencap ' + phonePath + filename)                  #第一步
    os.system('adb pull ' + phonePath + filename + " " + imgPath + filename)  #第二步
    os.system('adb shell rm ' + phonePath + filename)                         #第三步
    swipetime = timecalculate(filename)                                       #第四步
    os.system('adb shell input swipe 300 1500 300 1500 ' + str(swipetime))    #第五步

    time.sleep(1)
    return swipetime

第一步,通过ADB截屏,命名为x.png,存储到手机

第二步,通过ADB将x.png从手机复制到电脑

第三步,通过ADB删除手机上的x.png

第四步,根据filename调用对应命名的截图,计算触摸时间

第五步,根据所算时间,通过ADB执行原位滑屏操作

容易看到,五步中有四步是通过os.system()函数控制ADB完成的(导致效率不高,时间都花在ADB操作上...T-T),比较简单就略过了,核心部分在时间计算上。

PS:我称跳动的小人为“棋子(chessman)”,下一个落脚的物体为“棋盘(chessboard)”。

时间计算 → 距离计算 → △X计算

有个隐藏信息是,触摸时间与跳跃距离成正比,因此我们算出需要跳跃的距离,就能得到时间。

另一个隐藏信息是,跳跃方向都是斜着的,但倾斜角度“基本是”固定的(实际有少许偏移),因此我们只需计算 △X 或者 △Y 即可。

最后一个隐藏信息是,游戏初始时的“棋子”和“棋盘”位置总是固定的,因此可以反复测试初始游戏时的 触摸时间init_time 与 距离init_X 的关系,得到这个常数比值K后,后续计算就简单了:

△T = △X * K = △X * (init_x / init_time)
跳跃思路

△X计算 → 找特征像素的坐标

如何找“棋子”与“棋盘”的△X 呢?我看到的帖子,大家有用像素识别的,有用深度学习图像识别的,有用OpenCV提取图像边缘再识别的......我......我...我会的少,只能用笨办法的“像素识别”了...

即找到“棋子”左上角的第一个像素(x, y),再计算该行属于“棋子”像素的个数n,从而X = x + n//2,即可得到“棋子”的横坐标 X 啦,“棋盘”同理。原理示意图如下:


识别特征像素

找特征像素的坐标 → 像素识别

识别利用的特征包括:“棋子”顶部像素颜色稳定,亮度较低,与背景像素色差较大;“棋盘”顶部像素颜色不稳定、亮度不稳定,但亮度一定比“棋子”高,且与背景像素有一定色差(并且总与“棋子”的第一像素保持一定距离,用于寻找位置较为靠近的“棋盘”)。

利用上述特征,for循环逐个对截图像素进行判断,即可筛选出特征像素啦,效果如下:

识别“棋子”
识别“棋盘”

从结果来看,识别的成功率还不错~然并卵,并不能保证“棋子”不跑偏,我觉得可能的原因包括像素识别误差的累积(比如并非所有“棋盘”的中心都在其顶点的正下方,如“硬盘”物体)、ADB操作的延迟等等。

逐渐跑偏

大家可以看到“棋子”逐渐越跳越偏的过程,其原因就在于存在细小偏差,不能保证每次都落在中心这就意味着,棋子容易“中心 → 中心 → 中心”连中多元,也容易“歪一点 → 再歪一点 → 扑街”。不过,“棋子”其实并非是沿固定方向跳跃,而是以“棋子”中心与下一个“棋盘”中心构成的直线的方向跳跃,视情况这种偏差可能会相互抵消,回到正轨。(暂时无图...)

在上述本征不稳定性的基础上呢,大家可能需要多试几次才能拿到理想的分数,测试大概平均能拿到1000+,基本上1000~3000问题不大,我最高拿过3179。

最好成绩

程序的效率并太高,优化后平均跳一次需要4.5~5s,经过测试,约4s的时间花在ADB的操作上了...

...┐(‘~`;)┌ ...

如果开发个APP,所有操作都在手机上进行会不会快一些...

使用说明:

我用Python3写的,在Windows 7上测试跑得很欢,Linux上没有试。

由于使用了ADB工具,所以是针对Android手机的,手机需要打开“USB调试”,电脑端需要安装好手机驱动(或者让手机助手如豌豆荚连一下手机,再退出豌豆荚)。

建议打开cmd命令行,用“cd”命令,进入ADB工具所在路径,输入“adb”,检测adb是否正常使用。

运行.py文件前,建议用IDE打开,调整一下基本参数(在程序最下面):

  • 预期跳多少步,默认70
  • 分辨率,默认1440 * 2560 (for Samsung S6)
  • init_x,经过我的测试,填607 (for 1440 * 2560)或455 (for 1080 * 1920, 1080p),效果比较好,默认607
  • init_time,经过我和 @霍雍 各自测试,最后不约而同认为723比较好,默认723
  • phonePath,手机上临时存储截图的路径,建议新建一个,默认/storage/emulated/0/test/
  • imgPath,电脑端存储截图的路径,建议新建一个,默认C:\Users\Administrator\test\

开始游戏:

  1. 手机连接电脑,可能有“是否允许该计算机调试”之类的弹窗,点允许调试。
  2. 手机进入“跳一跳”界面后,电脑端运行.py文件即可。

运行.py文件的方式有两种,用Python的IDE打开并执行;或者用cmd命令执行“python + .py文件的路径”指令,如:

python c:\users\administrator\test\wechathop.py

也可以在cmd窗口输入:"python"+“ ”(空格),
然后把wechathop.py文件拖入cmd窗口,按回车执行即可。

萌新上路,胆大粗心,很多代码写法以及程序使用方法上不严谨、不标准,本程序也仅供娱乐,请其他萌新们谨慎参考,大佬们多指导~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容