最近热门的跳一跳小游戏,可我玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机。。闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多分,细看后觉得原理并不复杂,就索性花了一个晚上,参考大神的实现方法,在他的基础上删减了一些代码,也用Python写了个脚本。接下来进行原理和代码分析。
图1.跳一跳启动界面
原理
配置adb环境变量,在我的电脑–》属性–》高级系统设置–》环境变量–》Path上添加adb.exe所在的路径。
打开手机的usb调试模式,并连接电脑,打开跳一跳,然后通过adb工具获取当前手机截图,具体指令如下所示:
adb shell screencap -p /sdcard/1.png
adb pull /sdcard/1.png
在程序中的具体代码实现如下所示:
def screenshot():
cmd = 'adb shell screencap -p /sdcard/1.png'
os.system(cmd)
cmd = 'adb pull /sdcard/1.png'
os.system(cmd)12345
查找棋子的位置,通过颜色来识别棋子,通过将棋子底盘所在行的所有点的x轴坐标相加,然后取平均值获得X轴坐标,将Y轴坐标取最低点减去棋子底盘高度的一半。具体代码实现如下:
#开始查找棋子的坐标,从start_y开始据目测棋子不会位于屏幕底部1/3处for i in range(start_y, int(height * 2 / 3)): for j in range(border_x, width - border_x): #删除周围空白部分,加快程序运行速度
next_point = im[j,i] # 根据棋子的颜色判断,求所有点的和然后求平均值
if (50
x1_temp += j #点求和
x1_num += 1 #点的个数
y1_max = max(i, y1_max)if not all((x1_temp,x1_num)): return 0,0,0,0x1 = x1_temp / x1_num
y1 = y1_max - piece_height/2 # 棋子Y轴坐标上移到底盘高度的一半1234567891011121314
欢迎点击链接加群【Python学习交流】:https://jq.qq.com/?_wv=1027&k=5gxuQv3或者加QQ 群176955390,我们一起来学习吧
第二种是本文使用的,从上往下一行一行扫描,找到块中点的X轴坐标,然后通过截图中两个具体的棋盘获取的固定的角度,即正切值来推出中点的 Y坐标。 具体代码如下:
#查找下一个棋盘的位置for i in range(start_y, height * 2 / 3):
start_point = im[0, i] if x2 or y2: break
x2_temp = 0
x2_num = 0
for j in range(width):
next_point = im[j,i] if abs(j - x1)
# 棋盘为圆
if abs(next_point[0] - start_point[0]) + abs(next_point[1] - start_point[1]) + abs(next_point[2] - start_point[2]) > 10:
x2_temp += j
x2_num += 1
if x2_temp:
x2 = x2_temp / x2_num# 按实际的角度通过tan值来算计算下一个棋盘的中心点的Y轴坐标y2 = y1 - abs(x2 - x1) * abs(sample_y1 - sample_y2) / abs(sample_x1 - sample_x2)if not all((x2, y2)): return 0, 0, 0, 0123456789101112131415161718192021222324
根据棋子的位置跟下一个棋盘的位置求得两点的具体,推算出长按时间。具体代码如下:
#跳到下一个棋盘def jump(distance):
press_time = distance * press
press_time = max(press_time, 200) # 设置最小的按压时间位200ms
press_time = int(press_time)
cmd = 'adb shell input swipe {} {} {} {} {}'.format(swipe_x1, swipe_y1, swipe_x2, swipe_y2, press_time)
print(cmd)
os.system(cmd)12345678
结果展示
通过运行脚本,能够轻松上分到400+,由于时间原因并没有继续测试,下图为测试时截的动态gif,以及控制台窗口运行结果。
领取专属 10元无门槛券
私享最新 技术干货