1. 程式人生 > >碧藍航線-傳頌之物腳本(部分)

碧藍航線-傳頌之物腳本(部分)

雙手 screens input 距離 我希望 swipe 功能 exec color

碧藍航線新出的聯動圖SP4

由於這遊戲過於的肝 想要解放自己的雙手 所以想寫一段電腦自己操作的腳本進行自己代掛

代碼本身理解十分簡單 整個過程只是比較繁瑣 後面一段時間因為自己的原因有事情而未全部完成

希望下次如果有這種比較簡單的機制的活動時 你也能解放自己雙手

該代碼需要adb(百度一下 很簡單的連接) 網易mumu模擬器 屏幕為:1440 x 810(其他的也行 需要知道連接代碼 比如我用的mumu:"adb connect 127.0.0.1:7555") 還需要一張結算圖和一張boss圖進行結算和攻擊的匹配

上代碼分析:

import os
import random
import time import cv2 import numpy as np import win32api #這些包用pycharm安裝分分鐘的事 #連接mumu模擬器 首先先斷開服務再執行連接 def Connection(): cmd = adb kill-server tmp = os.popen(cmd).readlines() cmd = adb connect 127.0.0.1:7555 tmp = os.popen(cmd).readlines() print(tmp) #模擬點擊 這個是代碼的核心 也是繁瑣的根源
def Click(x,y): cmd = adb shell input tap {x1} {y1}.format(x1 = x,y1 = y) print(cmd) os.system(cmd) #模擬滑動 最後一關boss並未在我切換2隊的頁面 所以得滑動一段固定的距離讓boss關出現在我切換2隊後的頁面 def Slide(x,y,x3,y3): cmd = adb shell input swipe {x1} {y1} {x2} {y2}.format(x1=x, y1=y,x2=x3,y2=y3) print(cmd) os.system(cmd)
#通過adb進行截圖 讓後面圖片的匹配有基準 def Screenshot(): os.system(adb shell screencap -p /sdcard/loading.png) os.system(adb pull /sdcard/loading.png) return "loading.png" #boss關的位置匹配 def BossCde(BossMap): img = cv2.imread(BossMap,0) template = cv2.imread(boss.png,0)#分別加載boss和當前場景的圖片 res = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED) threshold = 0.80#匹配精確度 gps = [] loc = np.where(res >= threshold) for pt in zip(*loc[::-1]): gps.append(pt)#將匹配到的位置添加到gps列表中 return gps #打開mumu自動登錄時到登錄界面進行匹配 因為每次更新都會換登錄界面 當然如果你手動登上去了這就不需要了 def Identification1(loading): img = cv2.imread(loading,0) img_gray = cv2.cvtColor(img,cv2.COLOR_BAYER_BG2GRAY) template = cv2.imread("lon.png",0) res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) threshold = 0.9 print(res) if res[0] > threshold: Click(400,400) else: print("需要更新版本") #關卡結算匹配 def Identification2(loading): img = cv2.imread(loading,0) img_gray = cv2.cvtColor(img,cv2.COLOR_BAYER_BG2GRAY) template = cv2.imread("Atk2.png",0)#與結算界面進行匹配 res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) threshold = 0.7 if res[0] > threshold: time.sleep(1) Click(1225,680) time.sleep(2) Click(1225, 680) time.sleep(4) Click(1225, 680) time.sleep(2)#因為結算完了這幾次點擊返回到地圖界面這幾次點擊中每點一次就會出現一點延遲 如何不加sleep()回出現代碼跑完但結算不出 return 1 #自動啟動mumu模擬器 這是我的電腦上mumu 的位置 def Lon(): win32api.ShellExecute(0, open, F:\\emulator\\nemu\\EmulatorShell\\NemuPlayer.exe, ‘‘, ‘‘, 1) time.sleep(25) Connection() Click(216,117) #登錄總流程 def LonIn(): Lon() time.sleep(25) Identification1(Screenshot()) Click(760,345) #開始我們的自動(需要進入到四個選擇sp界面執行) def Activity(): Click(733, 418) time.sleep(1) Click(1040,543) time.sleep(3) Click(1195,700) time.sleep(3) Click(860,665) time.sleep(5) Click(556,552) time.sleep(3) Attack() time.sleep(3) Click(700, 440) time.sleep(3) Attack() time.sleep(3) Click(830, 350) time.sleep(3) Attack() time.sleep(3) Click(985, 420) time.sleep(3) Attack() time.sleep(3) Click(1143, 551) time.sleep(3) Attack() time.sleep(3) Click(1067, 756) time.sleep(1) Click(713, 183)#這一步是存在問題 因為這個點的關卡是隨機刷的 很可能未刷出來 導致程序一直卡在結算界面 需要完善(進行更多的判斷) time.sleep(3) Attack() time.sleep(3) Slide(1210, 166, 1210, 676) p = BossCde(Screenshot()) print(p) Click(p[0][0] + 50, p[0][1] + 50) time.sleep(7) Attack() time.sleep(4) #攻擊結算匹配 到出擊界面後執行即可完成關卡的結算 def Attack(): n = 0 Click(1200,720) for i in range(1,180): if n >= 65: TF = Identification2(Screenshot()) if TF == 1: break time.sleep(10)#曾經用過一秒一秒的刷 但是發現內存是個問題 適自己的隊打的普遍時間定 n += 1 else: n += 1 time.sleep(1) Connection()#首先連接上mumu Activity()#從四張sp圖中自動選擇 並執行代掛流程

總結:

    代碼瑕疵比較多,因為是半成品很多地方需要進行完善,比如中途出現紫皮船及new回出現少點擊一下而卡在結算界面出不來、當打完接到了緊急委托(尤其是晚上)將無法進行識別也會導致代碼功能錯亂、當船塢滿了的時候也會出現匹配選擇問題、還有代碼中提及的倒數第二關的判斷等,這些就是主要的問題,我希望讀者能以我這個案列為例下次給自己寫一個好點的腳本代碼,因為代碼本身思想很簡單所以簡單關卡實現起來並不是很難。養養肝吧。233

碧藍航線-傳頌之物腳本(部分)