1. 程式人生 > >用Python編寫微信小遊戲“跳一跳”的執行指令碼

用Python編寫微信小遊戲“跳一跳”的執行指令碼

前言
更新了微信後發現了一款小遊戲跳一跳,但是玩了一下午最高才達到200,每次差點破紀錄後總是手抖就掛掉了,氣的想要砸手機。。閒來無事刷微博的時候正好看到有人分析如何編寫指令碼自動運行遊戲破了3000多分,細看後覺得原理並不複雜,就索性花了一個晚上,參考大神的實現方法,在他的基礎上刪減了一些程式碼,也用Python寫了個指令碼。接下來進行原理和程式碼分析。
這裡寫圖片描述
圖1.跳一跳啟動介面
原理

  1. 配置adb環境變數,在我的電腦–》屬性–》高階系統設定–》環境變數–》Path上新增adb.exe所在的路徑。

  2. 開啟手機的usb除錯模式,並連線電腦,開啟跳一跳,然後通過adb工具獲取當前手機截圖,具體指令如下所示:

    adb shell screencap -p /sdcard/1.png
    adb pull /sdcard/1.png

    在程式中的具體程式碼實現如下所示:

def screenshot():
    cmd = 'adb shell screencap -p /sdcard/1.png'
    os.system(cmd)
    cmd = 'adb pull /sdcard/1.png'
    os.system(cmd)
  1. 查詢棋子的位置,通過顏色來識別棋子,通過將棋子底盤所在行的所有點的x軸座標相加,然後取平均值獲得X軸座標,將Y軸座標取最低點減去棋子底盤高度的一半。具體程式碼實現如下:
#開始查詢棋子的座標,從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軸座標上移到底盤高度的一半
  1. 查詢下一個棋盤的位置,一般可以通過兩種方法實現。第一種是通過滑鼠點選下一個棋盤的位置,具體參考程式設計美麗寫的部落格。

http://blog.csdn.net/F0ED9cZN4Ly992G/article/details/78937011

第二種是本文使用的,從上往下一行一行掃描,找到塊中點的X軸座標,然後通過截圖中兩個具體的棋盤獲取的固定的角度,即正切值來推出中點的 Y座標。 具體程式碼如下:

#查詢下一個棋盤的位置
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. 根據棋子的位置跟下一個棋盤的位置求得兩點的具體,推算出長按時間。具體程式碼如下:
#跳到下一個棋盤
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.控制檯輸出資訊
下載連結:http://download.csdn.net/download/qq_22408539/10187952