ATX 用技术人员的思路玩微信小游戏《跳一跳》

codeskyblue · 发布于 2017年12月31日 · 最后由 afantishui 回复于 2018年01月05日 · 2362 次阅读
本帖已被设为精华帖!

微信跳一跳实在是好玩。下面说下一个思路,如何通过目前的技术去自动点击。可能不是太具体,仅仅是思路,仅供参考。(实际操作的时候有点不是很准,可能是模型选错了)

  1. 第一需要一个精确控制点击时间的代码
  2. 识别出小人的位置
  3. 根据数据预测出要点击的时间

具体实现见下文

精确的点击时间

使用了openstf开源的minitouch功能,安装minitouch的部分我先跳过,具体可以参考minitouch的首页https://github.com/openstf/minitouch

# Launch minitouch
$ adb forward tcp:1100 localabstract:minitouch
$ adb shell /data/local/tmp/minitouch

使用python连接minitouch

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 1100))
print(s.recv(512))

# touch for 500ms
def touch(msecs):
    s.send('\n'.join(['d 0 500 500 50', 'c', 'w %d' % msecs, 'u 0', 'c\n']))

点击时间估算

猜测小人距离目标点的距离,与点击的时间成线性关系。

  • 小人距离目标点的距离:m
  • 需要长按的时间: s

s = m*x + y

使用图像匹配获取小人的高度,如下代码使用了最简单的模版图像匹配。先用uiautomator2截一张图片 search.jpg

import uiautomator2 as u2

u = u2.connect()
u.screenshot('search.jpg')

用电脑中的图片编辑软件,进行裁剪,仅保留小人的下半部分。

获取小人的高度。

# reference: https://docs.opencv.org/trunk/d4/dc6/tutorial_py_template_matching.html
import cv2
import numpy as np
import uiautomator2 as u2

u = u2.connect() # connect to android device

# 获取当前屏幕图像(opencv格式)
pil_image = u.screenshot() # PIL.Image object
pil_image = pil_image.convert('RGB')
cv2_image = np.array(pil_image)
background = cv2.cvtColor(cv2_image, cv2.COLOR_RGB2GRAY)

# 读取search.jpg
search = cv2.imread('search.jpg', cv2.IMREAD_GRAYSCALE) # read grayscale

# 图片定位
res = cv2.matchTemplate(background, search, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# top_left = max_loc

# 起始点的坐标
h, w = search.shape[:2]
start = max_loc[0]+w/2, max_loc[1]+h
print("start:", start)

一阶线性回归预测模型

from sklearn.linear_model import LinearRegression
xtrain = np.array([1, 2, 3, 4, 5])
ytrain = np.array([2, 3, 4, 5, 7])

X = xtrain.reshape(len(xtrain), 1)
Y = ytrain.reshape(len(ytrain), 1)

linear_model = LinearRegression(normalize=True)

# Fit the OLS model to the data
linear_model.fit(X, Y)
print linear_model.intercept_
print linear_model.coef_

xtest = 5
yfit = linear_model.predict(np.array([[xtest]], dtype=np.float))
predict_ms = yfit[0][0] # 预测出的点击时间

先人工点击了很多很多次,预测预测出来的线性模型。
横轴是小人离目标点的像素距离,纵轴是点击时间(ms)

计算出的系数是 x = 5.4859, y = -31

s = m*x + y

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 17 条回复
110 Lihuazhang 将本帖设为了精华贴 12月31日 21:13
3165

好思路马克一下!

5081

👍 跟着热点,这个也是楼主的吗 https://github.com/faceair/youjumpijump

04af48

昨天我也搞了个程序
大概思路就是 ADB截图----计算距离-----用距离算点击力度
刷了1000多分 嘻嘻
程序员的世界 魅力无穷

6853
5081silly 回复

不是我写的,我就是好奇心来了,做下研究

771f9f

刷了2000分,让那些费劲打了300分的人感到绝望,😁

5512

好像还少了判断逻辑,比如遇到音乐盒,井盖,商店要停上5秒,有加分

771f9f

@0x88 现在技术上不能识别音乐盒,井盖,商店,在每一个盒子上都停留5秒就可以了

167d23

徒手刷到490。看到有几个用脚本的 凌晨清理分数了

Ee76af

徒手刷的人要绝望了

1519a5
771f9fzhuzhu_mx 回复

具体要怎么刷?😅

771f9f

@xizeng 按照教程的步骤走就行了,如果你有基础的话,😄

1519a5
771f9fzhuzhu_mx 回复

不是很懂,哈哈

6853
167d23Innocence 回复

徒手500以上的都是大神

167d23
6853codeskyblue 回复

差4分。。大圣可否尝试下用树莓派模拟点击

1519a5
771f9fzhuzhu_mx 回复

adb push ./youjumpijump-android /data/local/tmp/ && adb shell
这个命令正确?

5bd32c
1519a5xizeng 回复

push命令 电脑路径 手机路径
比如:adb push c:/youjumpijump-android /data/local/tmp/ && adb shell

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册