使用Python實(shí)現(xiàn)跳一跳自動(dòng)跳躍功能
1. OpenCV:模板匹配。 獲得小跳棋中心位置
2. OpenCV:邊緣檢測(cè)。 獲得下一方塊中心位置
Python+ADB+OpenCv,實(shí)現(xiàn)「 跳一跳 」自動(dòng)化。
/ 01 / ADB
ADB工具即Android Debug Bridge(安卓調(diào)試橋) tools。
ADB 是一個(gè)命令行窗口,用于通過電腦端與模擬器或者真實(shí)設(shè)備交互。
與之前小F接觸過的Appium有點(diǎn)相似。
ADB的安裝很簡(jiǎn)單,就是將安裝包解壓后,將路徑添加到系統(tǒng)的環(huán)境變量中即可。
然后使用Python的os模塊執(zhí)行ADB命令。
def get_screenshot(): # 截取手機(jī)的屏幕 os.system('adb shell /system/bin/screencap -p /sdcard/screencap.png') # 把模擬器里面的文件或文件夾傳到電腦上 os.system('adb pull /sdcard/screencap.png screencap.png') def jump(distance): # 設(shè)置按壓時(shí)間,系數(shù)為1.35 press_time = int(distance * 1.35) # 生成隨機(jī)手機(jī)屏幕模擬觸摸點(diǎn),防止成績(jī)無效 # 生成隨機(jī)整數(shù)(0-9),最終數(shù)值為(0-90) rand = random.randint(0, 9) * 10 # adb長(zhǎng)按操作,即在手機(jī)屏幕上((320-410),(410-500))坐標(biāo)處長(zhǎng)按press_time毫秒 cmd = ('adb shell input swipe %i %i %i %i ' + str(press_time)) % (320 + rand, 410 + rand, 320 + rand, 410 + rand) # 輸出adb命令 print(cmd) # 執(zhí)行adb命令 os.system(cmd)
本次涉及到的ADB命令,就只有三個(gè),不多。
一個(gè)截屏,一個(gè)推送手機(jī)截圖到電腦上,最后模擬長(zhǎng)按手機(jī)屏幕。
/ 02 / 跳動(dòng)實(shí)現(xiàn)
先檢測(cè)游戲結(jié)束畫面。
判斷是否需要結(jié)束游戲程序。
# 游戲結(jié)束的模板圖像 temp_end = cv2.imread('end.jpg', 0) def game_over(img): """ 模板匹配,檢測(cè)是否要將程序結(jié)束 """ # 如果在游戲截圖中匹配到帶"再玩一局"字樣的模板,則循環(huán)中止 res_end = cv2.matchTemplate(img, temp_end, cv2.TM_CCOEFF_NORMED) if cv2.minMaxLoc(res_end)[1] > 0.95: print('Game over!') return True
模板匹配原理圖如下。
當(dāng)返回的最大矩陣值大于0.95時(shí),則認(rèn)為原始圖像中肯定出現(xiàn)了再玩一局字樣。
則游戲結(jié)束,程序也隨之結(jié)束。
小跳棋的模板匹配代碼如下。
主要是獲取小跳棋的位置,即「跳一跳」起點(diǎn)位置參數(shù)。
# 讀取小跳棋模板圖像 temple = cv2.imread('temple.png', 0) # 獲取小跳棋模板圖像的高和寬 th, tw = temple.shape[:2] def get_start(img): """ 模板匹配,獲取跳一跳起點(diǎn)的位置參數(shù)(小跳棋) """ # 使用標(biāo)準(zhǔn)相關(guān)系數(shù)匹配,1表示完美匹配,-1表示糟糕的匹配,0表示沒有任何相關(guān)性 result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED) # 使用函數(shù)minMaxLoc,確定匹配結(jié)果矩陣的最大值和最小值(val),以及它們的位置(loc) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 得到小跳棋的中心位置參數(shù) return max_loc[0] + 47, max_loc[1] + 208
得到結(jié)果如下。
下面通過OpenCV的邊緣檢測(cè)獲取「跳一跳」的終點(diǎn)位置。
def get_end(img): """ 邊緣檢測(cè),獲取跳一跳終點(diǎn)的位置參數(shù)(方塊) """ # 高斯模糊 img_rgb = cv2.GaussianBlur(img, (5, 5), 0) # 邊緣檢測(cè) canny_img = cv2.Canny(img_rgb, 1, 10) # 獲得邊緣檢測(cè)圖像的高和寬 H, W = canny_img.shape # 第一個(gè)頂點(diǎn)的高度 y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400 # 第一個(gè)頂點(diǎn)的寬度 x_top = int(np.mean(np.nonzero(canny_img[y_top]))) # 跳過小白圈,然后遍歷 y_bottom = y_top + 80 for row in range(y_bottom, H): if canny_img[row, x_top] != 0: y_bottom = row break # 得到方塊的中心點(diǎn) x_center, y_center = x_top, (y_top + y_bottom) // 2 return x_center, y_center
邊緣檢測(cè)原理圖如下。
最后便是主程序啦。
# 循環(huán)直到游戲失敗結(jié)束 for i in range(10000): # 將安卓手機(jī)上的截圖移到電腦當(dāng)前文件夾下 get_screenshot() # 讀取截圖圖像 img = cv2.imread('screencap.png', 0) # 游戲結(jié)束 if game_over(img): break # 得到起點(diǎn)位置參數(shù) x_start, y_start = get_start(img) # 獲取終點(diǎn)位置參數(shù) x_end, y_end = get_end(img) # 將起點(diǎn)位置繪制出來,一個(gè)圓 cv2.circle(img, (x_start, y_start), 10, 255, -1) # 將終點(diǎn)位置繪制出來,一個(gè)圓 img_end = cv2.circle(img, (x_end, y_end), 10, 255, -1) # 保存圖片 cv2.imwrite('end.png', img_end) # 計(jì)算起點(diǎn)和終點(diǎn)的直線距離,勾三股四弦五 distance = (x_start - x_end) ** 2 + (y_start - y_end) ** 2 distance = distance ** 0.5 # 根據(jù)獲得的距離來設(shè)置按壓時(shí)長(zhǎng) jump(distance) time.sleep(1.3)
下面就來看一下「跳一跳」自動(dòng)跳躍的視頻。
輕輕松松得分,毫無問題。
/ 03 / 總結(jié)
相關(guān)工具及代碼已上傳網(wǎng)盤,公眾號(hào)回復(fù) 「跳一跳」 即可獲取。
安裝好ADB工具,然后通過數(shù)據(jù)線將安卓手機(jī)和電腦連接。
最后運(yùn)行代碼, 親測(cè)有效。
當(dāng)然代碼還是有待優(yōu)化的,如下圖~
一方面是得分不高,另一方面就是會(huì)被檢測(cè)到作弊...
總結(jié)
以上所述是小編給大家介紹的使用Python實(shí)現(xiàn)跳一跳自動(dòng)跳躍功能 ,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python利用PyAutoGUI模塊實(shí)現(xiàn)控制鼠標(biāo)鍵盤
PyAutoGUI是一個(gè)簡(jiǎn)單易用,跨平臺(tái)的可以模擬鍵盤鼠標(biāo)進(jìn)行自動(dòng)操作的python庫。本文將詳細(xì)講講它是如何實(shí)現(xiàn)控制鼠標(biāo)鍵盤的,感興趣的可以了解一下2022-06-06python 發(fā)送郵件的示例代碼(Python2/3都可以直接使用)
這篇文章主要介紹了python 發(fā)送郵件的示例代碼,并且Python2/3都可以直接使用,感興趣的朋友可以參考下2020-12-12PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù)
這篇文章主要介紹了PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù),在本次的分類任務(wù)當(dāng)中,我們使用的數(shù)據(jù)集是 Mnist 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集大家都比較熟悉,需要的朋友可以參考下2023-03-03Python實(shí)現(xiàn)多子圖繪制系統(tǒng)的示例詳解
這篇文章主要介紹了如何利用python實(shí)現(xiàn)多子圖繪制系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問題
這篇文章主要介紹了python 解決pycharm運(yùn)行py文件只有unittest選項(xiàng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09dataframe設(shè)置兩個(gè)條件取值的實(shí)例
下面小編就為大家分享一篇dataframe設(shè)置兩個(gè)條件取值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04解決python os.mkdir創(chuàng)建目錄失敗的問題
今天小編就為大家分享一篇解決python os.mkdir創(chuàng)建目錄失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10Django框架 Pagination分頁實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Django框架 Pagination分頁實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python實(shí)現(xiàn)生活常識(shí)解答機(jī)器人
今天教大家如何用Python爬蟲去搭建一個(gè)「生活常識(shí)解答」機(jī)器人.思路:這個(gè)機(jī)器人主要是依托于“阿里達(dá)摩院發(fā)布的語言模型PLUG”,通過爬蟲的方式,發(fā)送post請(qǐng)求(提問),然后返回json數(shù)據(jù)(回答),需要的朋友可以參考下2021-06-06