Python编写微信小游戏“跳一跳”的运行脚本,分享给大家。
更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机。闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多分,细看后觉得原理并不复杂,就索性花了一个晚上,参考大神的实现方法,在他的基础上删减了一些代码,也用Python写了个脚本。接下来进行原理和代码分析。
图1.跳一跳启动界面
原理
配置adb环境变量,在我的电脑–》属性–》高级系统设置–》环境变量–》Path上添加adb.exe所在的路径。
打开手机的usb调试模式,并连接电脑,打开跳一跳,然后通过adb工具获取当前手机截图,具体指令如下所示:
adb shell screencap -p /sdcard/1.png
adb pull /sdcard/1.png
在程序中的具体代码实现如下所示:
1
2
3
4
5
|
def screenshot(): cmd = 'adb shell screencap -p /sdcard/1.png' os.system(cmd) cmd = 'adb pull /sdcard/1.png' os.system(cmd) |
查找棋子的位置,通过颜色来识别棋子,通过将棋子底盘所在行的所有点的x轴坐标相加,然后取平均值获得X轴坐标,将Y轴坐标取最低点减去棋子底盘高度的一半。具体代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#开始查找棋子的坐标,从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 < next_point[ 0 ] < 60 ) and ( 53 <next_point[ 1 ] < 63 ) and ( 95 < next_point[ 2 ] < 110 ): x1_temp + = j #点求和 x1_num + = 1 #点的个数 y1_max = max (i, y1_max) if not all ((x1_temp,x1_num)): return 0 , 0 , 0 , 0 x1 = x1_temp / x1_num y1 = y1_max - piece_height / 2 # 棋子Y轴坐标上移到底盘高度的一半 |
查找下一个棋盘的位置,一般可以通过两种方法实现。第一种是通过鼠标点击下一个棋盘的位置,具体参考编程美丽写的博客。
第二种是本文使用的,从上往下一行一行扫描,找到块中点的X轴坐标,然后通过截图中两个具体的棋盘获取的固定的角度,即正切值来推出中点的 Y坐标。 具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#查找下一个棋盘的位置 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) < body_width: continue # 棋盘为圆 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 , 0 |
根据棋子的位置跟下一个棋盘的位置求得两点的具体,推算出长按时间。具体代码如下:
1
2
3
4
5
6
7
8
|
#跳到下一个棋盘 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) |
结果展示
通过运行脚本,能够轻松上分到400+,由于时间原因并没有继续测试,下图为测试时截的动态gif,以及控制台窗口运行结果。
图2.真机运行
图3.控制台输出信息
下载链接:跳一跳python脚本
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/qq_22408539/article/details/78940417