一船惨、梳理
跳一跳的游戲可以細(xì)分為兩步驟:距離判斷 + 按壓模擬,這兩步都有下面這些解決方案:
1祷舀、距離判斷:
● 簡(jiǎn)單方案:像素點(diǎn)判斷
● 進(jìn)階方案:OpenCV 圖像分析
2、按壓模擬:
● 簡(jiǎn)單方案:adb/wda 指令
下面逐一介紹這里的實(shí)現(xiàn)方法儡首,非常有意思。
1. 像素點(diǎn)判斷
該方法采用自目前最火的跳一跳小游戲「輔助程序」:wechat_jump_game蔬胯。
如上圖所示,我們先定義了「棋子」和「棋盤」位他,需要找到的兩個(gè)目標(biāo)點(diǎn)用橙色點(diǎn)標(biāo)注氛濒,首先針對(duì)棋子的目標(biāo)點(diǎn)的判斷,可以這么做:
相關(guān)代碼:
而針對(duì)棋盤中心點(diǎn)的確認(rèn)的思路則是這樣的:
當(dāng)然還有一些其他方法來盡量縮小棋盤中心點(diǎn)的檢測(cè)區(qū)域鹅髓,這里簡(jiǎn)單介紹下:
當(dāng)然舞竿,如果恰好跳到中心點(diǎn),下一個(gè)棋盤中間會(huì)有白色點(diǎn)窿冯,則可以直接匹配中心點(diǎn)的色值骗奖,得到棋盤中心點(diǎn),這種情況基本百發(fā)百中:
相關(guān)代碼:
但棋盤種類比較多醒串,形狀也各異执桌,而且棋盤表面并非純色,還有其他顏色芜赌,所以即使像素判斷的代碼里增加了很多特殊 case仰挣,依舊不能做到非常完美:
總結(jié)一下,目前這個(gè)方案基本沒有太大問題缠沈,但如果跳一跳游戲把背景改成了非線性漸變膘壶,或隨機(jī)飄落一些物體,或棋盤表面更加復(fù)雜洲愤,那這里的算法就基本不可用了颓芭。
2. OpenCV 圖像分析
基于像素點(diǎn)的判斷低效而且不夠健壯,而利用 OpenCV 計(jì)算機(jī)視覺庫則可以從圖像分析層面進(jìn)一步簡(jiǎn)化判斷邏輯提升效率柬赐,首先采用該方法的跳一跳小游戲「輔助程序」來自 wechat_jump_jump亡问。它是這么得到棋子的位置的:
相關(guān)代碼:
接下來找棋盤的中心點(diǎn),假如下一個(gè)棋盤存在白色的示意點(diǎn)躺率,同樣采用上面的模板匹配方法進(jìn)行匹配玛界,若匹配不上(匹配值小于某閾值万矾,也許下個(gè)棋盤本身就是白色悼吱,所以灰度圖分辨不出),則采用第二種方案:
這里是否準(zhǔn)確的精髓就在于高斯濾波去除圖像噪音的臨界點(diǎn)以及 Canny 函數(shù)中閾值的設(shè)定良狈,需要不斷調(diào)整參數(shù)到最優(yōu)狀態(tài)后添。
相關(guān)代碼:
1. adb/wda 指令
這兩個(gè)分別是針對(duì) Android 和 iOS 的命令行工具薪丁,可以將手機(jī)和電腦連接起來遇西,并通過命令行發(fā)送指令馅精,指令中就包含了屏幕的截圖和按壓模擬。不過 iOS 配置起來稍微麻煩一點(diǎn)粱檀,具體操作指引可以參考 這里洲敢。其核心的命令有:
當(dāng)然,如果嫌配置麻煩茄蚯,還可以通過 Android 的 AirDrop App 或 iOS 的 QuickTime 把手機(jī)屏幕投到電腦中压彭,然后通過 Python 的 Pillow 庫來截取投屏的內(nèi)容,再做進(jìn)一步的圖像識(shí)別工作渗常。
還有一點(diǎn)值得一提壮不,按壓時(shí)間這部分還是有優(yōu)化的空間,前面提到了跳躍距離和按壓時(shí)間基本是線性關(guān)系皱碘,但越到后面可以越發(fā)現(xiàn)询一,距離并非和按壓時(shí)間絕對(duì)成線性比例,因?yàn)橛螒虮旧聿皇且粋€(gè)純 2D 的平面場(chǎng)景(2.5D)癌椿,所以我們測(cè)量到的直線距離在 2.5D 場(chǎng)景中是有變化的健蕊,雖然影響不大,但在游戲后期棋盤越來越小踢俄,距離越來越大時(shí)绊诲,容易凸現(xiàn)出問題來,所以關(guān)于距離的計(jì)算有幾種不同的解決:
擬合函數(shù)的細(xì)節(jié)可以參考:
1)https://github.com/metowolf/JumpJumpHelper
2)https://github.com/wangshub/wechat_jump_game/issues/744
3)https://github.com/wangshub/wechat_jump_game/pull/841
反對(duì)一切使用外掛行為掂之!
反對(duì)一切使用外掛行為!
反對(duì)一切使用外掛行為脆丁!
通過對(duì)外掛程序源碼的研讀世舰,學(xué)習(xí)到了非常多創(chuàng)新的思維,這也算是外掛留給代碼世界的果實(shí)槽卫。