碧蓝航线新出的联动图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图中自动选择 并执行代挂流程