用python玩跳一跳

时间:2023-01-22 23:35:36

微信跳一跳被同学说是淘宝买的,委屈巴巴,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查找。