刷爆微信朋友圈的小游戏跳一跳辅助制作原理及代码分析!

灌水 海牛龙龙 ⋅ 于 2018-01-02 17:58:06 ⋅ 最后回复由 小菜牛 2020-07-27 22:28:30 ⋅ 4863 阅读

file

最近微信跳一跳火爆朋友圈,腾讯出这款小游戏貌似给各路编程大神提供了"炫技"的机会!
今天和大家分享一下微信跳一跳辅助制作原理及代码分析(python)!

下面我们来看下这款辅助的制作原理及代码分析:

这款辅助需要手机连接PC,PC通过adb命令对手机游戏界面截图,并保存在PC上。
PC端根据保存的图片进行处理(读取RGB值),获取棋子的位置,获取下一步棋盘的位置,然后利用"勾股定理"来计算出两点之间的距离,然后根据经验值计算出按压时间。
通过adb命令模拟按压时间即可实现棋子的跳跃。
部分代码如下:

通过adb命令截图,并复制到PC。

def pull_screenshot():
os.system('del autojump.png')
os.system('adb shell screencap -p /sdcard/autojump.png')
os.system('adb pull /sdcard/autojump.png .')

查找棋子的坐标

以50px步长,尝试探测scan_start_yfor i in range(under_game_score_y, h, 50):last_pixel = im_pixel[0, i]for j in range(1, w):pixel = im_pixel[j, i]# 不是纯色的线,则记录scan_start_y的值,准备跳出循环if pixel[0] != last_pixel[0] or pixel[1] != last_pixel[1] or pixel[2] != last_pixel[2]:scan_start_y = i - 50break if scan_start_y:breakprint("scan_start_y: ", scan_start_y)# 从scan_start_y开始往下扫描,棋子应位于屏幕上半部分,这里暂定不超过2/3for i in range(scan_start_y, int(h * 2 / 3)):for j in range(scan_x_border, w - scan_x_border): # 横坐标方面也减少了一部分扫描开销pixel = im_pixel[j, i]# 根据棋子的最低行的颜色判断,找最后一行那些点的平均值,这个颜色这样应该 OK,暂时不提出来if (50 < pixel[0] < 60) and (53 < pixel[1] < 63) and (95 < pixel[2] < 110):piece_x_sum += jpiece_x_c += 1piece_y_max = max(i, piece_y_max)if not all((piece_x_sum, piece_x_c)):return 0, 0, 0, 0piece_x = piece_x_sum / piece_x_cpiece_y = piece_y_max - piece_base_height_1_2 # 上移棋子底盘高度的一半

查找下一跳地盘的坐标

for i in range (int (h / 3), int (h 2 / 3)):last_pixel = im_pixel[0, i]if board_x or board_y:breakboard_x_sum = 0board_x_c = 0for j in range(w):pixel = im_pixel[j, i]# 修掉脑袋比下一个小格子还高的情况的 bugif abs(j - piece_x) < piece_body_width:continue# 修掉圆顶的时候一条线导致的小 bug,这个颜色判断应该 OK,暂时不提出来if abs(pixel[0] - last_pixel[0]) + abs(pixel[1] - last_pixel[1]) + abs(pixel[2] - last_pixel[2]) > 10:board_x_sum += jboard_x_c += 1if board_x_sum:board_x = board_x_sum / board_x_c# 按实际的角度来算,找到接近下一个 board 中心的坐标 这里的角度应该是30°,值应该是tan 30°, math.sqrt(3) / 3board_y = piece_y - abs(board_x - piece_x) math.sqrt(3) / 3if not all((board_x, board_y)):return 0, 0, 0, 0

利用勾股定理计算两点之间的距离

math.sqrt((board_x - piece_x) 2 + (board_y - piece_y) 2)

根据长度计算出按压时间

def jump(distance):press_time = distance * 1.35press_time = int(press_time)cmd = 'adb shell input swipe 320 410 320 410 ' + str(press_time)print(cmd)os.system(cmd)
微信跳一跳辅助制作原理及代码分析!

演示效果

file

源码下载地址如下:https://github.com/wangshub/wechat_jump_game

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-海牛龙龙,http://hainiubl.com/topics/261
回复数量: 1
暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter