0x00. 前期準備

除了一台能運行的電腦,你還需要以下三樣東西:

  1. 安裝好Py與依賴的 Pycharm(Python3 + opencv & numpy)
  2. 配置好環境變數的 ADB
  3. 能開機的 Android 手機

0x01. 實現思路

使用 ADB 與 OpenCV ,分別完成控制手機與生成解法兩個任務,基本步驟如下:

  1. 使用 ADB 命令截屏並傳回本地

adb shell screencap -p /sdcard/{ImgName}
adb pull /sdcard/{ImgName} .

  1. 使用 OpenCV 識別目標定位關鍵點

res = cv2.matchTemplate(image, template, method, result, mask) # 匹配模式圖片
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最匹配位置

  1. 通過定點拾色,讀取遊戲地圖
  2. 使用 DFS,搜索解法
  3. 通過 ADB 點擊命令,輸入解答

adb shell input tap x y

為了能夠達到無人監守自動遊戲的效果,我們還需要程序可以 自動進入下一關關閉遊戲獎勵窗口。所以,我們設計了四種不同的狀態:Game StateNext StateClose StateError State,分別對應著進行遊戲、進入下一關、關閉彈出窗口、等待過渡動畫四種功能。

執行的過程中,使用識別 關鍵目標物 的方式,來判斷當前處於哪種狀態並執行對應任務。

最後還有一個問題需要考慮:隨著關卡變難,遊戲方塊大小會逐漸變小。由於,我們掃描地圖使用的是定點拾色的辦法,方格尺寸變小會大大影響我們的地圖掃描準確性,所以我們需要讓程序能夠智能地匹配遊戲方塊的大小。

實現方法也很簡單,設定 [0.9, 1.1] 為遊戲方塊的變化區間,當掃描的地圖出現問題(遊戲無解)或者不存在遊戲方塊的時候,我們就按照 0.01 為步長循環調整遊戲方塊的大小,直到能夠地圖掃描轉換功能正常為止。另外,每次遊戲啟動的時候,也會先自動調整遊戲方塊大小,如圖 ( 圖中的 Map Error: %f 就是程序正在調整遊戲方塊大小,出現白邊時為匹配)。

視頻封面

00:11自動調整方塊尺寸

0x02. 使用方法

  1. 配置好 所有環境
  2. 在 Github 上給項目點贊,順手下載代碼,地址:WNJXYK/AutoWechatGames
  3. [重要] 使用 Pycharm 打開項目,打開根目錄下 ./Super_Link/AI.py,根據手機的屏幕解析度修改第二行 SIZE 值。(米8解析度:2248*1080, SIZE設置為 1.0)
  4. 連接手機,打開手機開發者模式,勾選USB調試,勾選運行ADB模擬點擊
  5. 進入遊戲頁面,運行PY,準備起飛!

視頻封面

00:23測試

所有操作僅在本地測試完成(MBP + Mi 8),附上 Bilibili 視頻鏈接。

https://www.bilibili.com/video/av44383086/?

www.bilibili.com


推薦閱讀:

相关文章