微信跳一跳被同学说是淘宝买的,委屈巴巴,jpg。为了证明清白,把实现过程写下来。
游戏人物跳跃的距离是由按压时间决定的,所以基本原理是
1.利用adb的adb shell screencap -p/**/**/的命令进行截屏
2.将截下来的图pull到电脑上
3.点击当前位置和要跳位置,计算距离
4.计算按压时间
5.模拟按压
由于我没有mac,没办法对苹果进行模拟控制,只能用adb实现对安卓手机的控制。
直接贴代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from PIL import Image
import math
import time
import os
os.chdir(r'C:\Users\zhu\platform-tools') #改变当前工作路径
fig = plt.figure()index = 0cor = [0, 0]pull_screenshot()img = np.array(Image.open('1.png')) #将图片转化为numpy的array数组
update = Trueclick_count = 0 #计算点击次数,需要两次distancesave = []
def pull_screenshot():
os.system('adb shell screencap -p /sdcard/1.png')
os.system('adb pull /sdcard/1.png .')def jump(distance): press_time = distance * 1.3 #计算按压时间,机型不同,系数不同。 press_time = int(press_time) #强制转化 cmd = 'adb shell input swipe 320 410 320 410 ' + str(press_time) # 控制按压时间。这个为滑动命令,由于滑动前后的点都为320,410.所以相当于长按一点 print(cmd) os.system(cmd) #利用adb控制手机按压
def update_data(): return np.array(Image.open('1.png'))im = plt.imshow(img, animated=True)def updatefig(*args): #更新函数 global update if update: time.sleep(1) #停一秒 pull_screenshot() im.set_array(update_data()) update = False return im,def onClick(event): global update global ix, iy global click_count global distancesave # next screenshot ix, iy = event.xdata, event.ydata #记录点击的坐标 coords = [] coords.append((ix, iy)) cor.append(coords) #添加坐标到列表中 click_count += 1 if click_count > 1: #点击两下才开始工作 click_count = 0 #清零 cor1 = distancesave.pop() #取出坐标 cor2 = distancesave.pop() distance = (cor1[0][0] - cor2[0][0]) ** 2 + (cor1[0][1] - cor2[0][1]) ** 2 distance = distance ** 0.5 #计算坐标距离 #print #'distance = ', distance jump(distance) update = Truefig.canvas.mpl_connect('button_press_event', onClick)ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True) plt.show()
有大佬已写出自动运行程序,可以在github查找。