1. 想法
陰陽(yáng)師作為一個(gè)過(guò)氣游戲纵势,非常識(shí)時(shí)務(wù)的給覺(jué)醒踱阿、御魂和探索加上了官方的腳本(壓了等級(jí),估計(jì)御靈也有)钦铁。但問(wèn)題就是软舌,結(jié)界突破官方并沒(méi)有加上腳本,而只有一個(gè)“鎖定陣營(yíng)”育瓜。所以就決定搞一個(gè)結(jié)界突破的腳本XD
2. 基本思路
我們先以個(gè)人結(jié)界突破為例子葫隙,如圖:
我們選定三個(gè)特征點(diǎn)(紅圈的位置),然后以這三個(gè)坐標(biāo)為基準(zhǔn)躏仇,基本上就可以搞定這九個(gè)結(jié)界的位置恋脚,在這里不多做贅述腺办。我們主要想實(shí)現(xiàn)的是陰陽(yáng)寮結(jié)界突破的腳本(寮突破加的經(jīng)驗(yàn)又少,還不消耗突破券糟描。多勛章或者是低等級(jí)的結(jié)界都有怀喉,簡(jiǎn)直是為我這種壓級(jí)的所準(zhǔn)備的XD)
好的,我們來(lái)看陰陽(yáng)寮突破的界面船响,如圖:
這里我們同樣選擇選擇三個(gè)特征點(diǎn)(紅圈)來(lái)定位躬拢。我們?nèi)缓笏愠鲞@三點(diǎn)坐標(biāo)的平均坐標(biāo),大致就位于畫(huà)面的中間位置见间,然后加上隨機(jī)函數(shù)聊闯,這樣大致模擬點(diǎn)按的就是綠色的區(qū)域。但這樣還是有問(wèn)題米诉,如果我們?nèi)说念^像就比較麻煩(這個(gè)我們后面在實(shí)現(xiàn)的時(shí)候會(huì)講到)
點(diǎn)按之后界面就會(huì)變成這樣菱蔬,我們要做的就是識(shí)別出“挑戰(zhàn)”這個(gè)按鈕的位置然后點(diǎn)擊
當(dāng)然我們要保證已經(jīng)鎖上了陣營(yíng),點(diǎn)擊“挑戰(zhàn)”之后這樣就不用手動(dòng)點(diǎn)開(kāi)始了
好的史侣,當(dāng)我們勝利之后拴泌,如果不進(jìn)行操作,最后會(huì)到這樣的位置:
這個(gè)地方很明顯有一個(gè)打開(kāi)的達(dá)摩(還是啥玩意兒orz)我們只有識(shí)別到黃圈的部分就可以了惊橱,然后隨便按一下蚪腐。
但如果輸了的話(huà),我個(gè)人認(rèn)為用“薙魂”這個(gè)圖標(biāo)會(huì)比較好税朴,不過(guò)旁邊的“式神強(qiáng)化”什么的也都可以啦OwO回季,然后隨便點(diǎn)一下就行了。
我在這里會(huì)考慮終止腳本(總不能一直輸吧掉房。茧跋。。不過(guò)倒也無(wú)所謂卓囚,陰陽(yáng)寮突破每小時(shí)只有6次233)
基本腳本的思路就是這樣的瘾杭,下面就來(lái)看怎么實(shí)現(xiàn)吧OwO
3. 實(shí)現(xiàn)
需要的模塊和模擬點(diǎn)按的實(shí)現(xiàn)什么的都在上一篇關(guān)于抽卡的腳本的文章里講了,這里就不再贅述了
有了基本的思路哪亿,然后我們照著這個(gè)思路來(lái)寫(xiě)代碼就可以了QWQ
- QAQ我還是加上我們要用的庫(kù)吧(經(jīng)某些同學(xué)提醒)粥烁,另外我們還要裝上adb(本來(lái)覺(jué)得上一篇提到過(guò)了就可以不提了orz)
import time # 延時(shí),例如戰(zhàn)斗完后會(huì)有一點(diǎn)動(dòng)畫(huà)效果
import cv2 # OpenCV的庫(kù)蝇棉,也就是我們圖像識(shí)別要用到的
import lib.ats # 自己建的XD里面放的是Android操作的函數(shù)(點(diǎn)按讨阻,滑動(dòng),截圖的操作篡殷,具體在我上一篇文章有提到)
import random # 隨機(jī)數(shù)钝吮,防封號(hào)用的
import numpy as np #這個(gè)嘛orz。。奇瘦。
- 首先是界面的識(shí)別
def base(sh):
img = cv2.imread(sh, 0)
template1 = cv2.imread('res/dorm_loc1.jpg', 0) # 我把所有的模板放到了Project里面的/res文件夾中
# 導(dǎo)入模板圖片棘催,還有template2 和template3 也是一樣的操作
res1 = cv2.matchTemplate(img, template1, cv2.TM_CCOEFF_NORMED)
# 這里是匹配率 res2 和 res3 也是相同的代碼
threshold = 0.75
pos1 = []
# 坐標(biāo)的數(shù)組(吧)pos2 和 pos3 也是一樣的操作
loc1 = np.where(res1 >= threshold)
for pt1 in zip(*loc1[::-1]): # 壓縮
pos1.append(pt1)
# 對(duì) pos2 和pos3 也是相同的操作
tapX = (pos1[0][0] + pos2[0][0] + pos3[0][0]) / 3
tapY = (pos1[0][1] + pos2[0][1] + pos3[0][1]) / 3
# 計(jì)算平均值,得出中心的坐標(biāo)
tap_loc = [tapX, tapY] # 中心的坐標(biāo)
return tap_loc
- 然后是隨機(jī)點(diǎn)按(一個(gè)目標(biāo))
def tap_range(org_loc):
orgX = org_loc[0]
orgY = org_loc[1]
# 隨機(jī)函數(shù)
tapX = orgX + random.uniform(-100, 600)
tapY = orgY + random.uniform(-300, 300)
# 真正點(diǎn)按的坐標(biāo)
tap_loc = [tapX, tapY]
return tap_loc
- 識(shí)別“挑戰(zhàn)”按鈕并點(diǎn)擊耳标,這里的代碼和前面的識(shí)別界面“特征點(diǎn)”的代碼并沒(méi)有什么區(qū)別
def start(sh):
# 導(dǎo)入截圖和模板
img = cv2.imread(sh, 0)
template = cv2.imread('res/start.jpg', 0)
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) # 匹配
threshold = 0.7
pos = []
loc = np.where(res >= threshold) # 找到高于threshold的坐標(biāo)
for pt in zip(*loc[::-1]):
pos.append(pt)
lib.ats.tap(pos[0][0], pos[0][1]) # 我們只取第一個(gè)醇坝,并點(diǎn)按
- 對(duì)于“勝利”“失敗”和一不小心點(diǎn)到頭像的情況和上面識(shí)別“挑戰(zhàn)”都是差不多的
#前面的代碼和上面的是一樣的
# 判斷是否出現(xiàn)這樣的畫(huà)面
if (res >= threshold).any():
# 點(diǎn)按或者返回某個(gè)值,例如:(配合主程序的條件語(yǔ)句)
return 1
- 我們把上面的函數(shù)按照順序在main里面依次調(diào)用就行了QWQ
def main():
for i in range(6): # 因?yàn)殄纪黄泼啃r(shí)只有6個(gè)所以用for就行了
sh = lib.ats.screenshot()
tap_base = base(sh)
# 這里選擇突破的目標(biāo)
tap_loc = tap_range(tap_base)
lib.ats.tap(tap_loc[0], tap_loc[1])
# 判斷是否錯(cuò)誤點(diǎn)按
while lib.ats.screenshot():
sh = lib.ats.screenshot()
if special(sh) == 1: # 如果剛好點(diǎn)到了人的頭像上次坡。呼猪。。
# 重新選擇突破的目標(biāo)
# 重新執(zhí)行上面選擇突破的目標(biāo)的代碼即可
else:
break
# 這里要再次截圖
start(sh) # 開(kāi)始突破
# 重復(fù)截圖砸琅,判斷戰(zhàn)斗是否結(jié)束
while lib.ats.screenshot():
time.sleep(1)
# 隨機(jī)設(shè)定x1和x2
judge = lib.ats.screenshot()
if win(judge) == 1: # 贏(yíng)的話(huà)
lib.ats.tap(x1, y1)
break # 僅僅是退出這個(gè)小循環(huán)
elif lose(judge) == 1: #輸?shù)脑?huà)
lib.ats.tap(x1, y1)
break
# 退出這個(gè)小循環(huán)之后還有終止整個(gè)大循環(huán)
orz又是基本把所有代碼都寫(xiě)出來(lái)了(不過(guò)還是省略了很多宋距,直接copy過(guò)去肯定是不行的XD)
4. 思考
寫(xiě)完這個(gè)腳本之后,發(fā)現(xiàn)這個(gè)腳本和之前的腳本都會(huì)頻繁的使用到cv2庫(kù)中的某幾個(gè)函數(shù)明棍,所以想了一下干脆把那他們打包成函數(shù)直接調(diào)用乡革,這樣應(yīng)該就省事很多OwO
# 如果我們識(shí)別圖像后還要返回位置的話(huà)
def location(sh, tmp, thd): # 分別是原圖片(路徑),模板(路徑)摊腋,和threshold
img = cv2.imread(sh, 0)
template = cv2.imread(tmp, 0)
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
threshold = thd
pos = []
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
pos.append(pt)
return pos
# 如果我們只要識(shí)別圖像的話(huà)
def check(sh, tmp, thd):
img = cv2.imread(sh, 0)
template = cv2.imread(tmp, 0)
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
threshold = thd
if (res >= threshold).any():
return 1
5. 總結(jié)
總體來(lái)說(shuō),這個(gè)腳本和上一個(gè)抽卡那個(gè)大同小異233
然后因?yàn)槿藨朽铱瑧械脤?xiě)個(gè)人寮突破的腳本(反正原理都是一樣的嘛OwO)
PS:說(shuō)實(shí)話(huà)個(gè)人突破的那個(gè)九宮格其實(shí)還是相當(dāng)麻煩的兴蒸,因?yàn)殄冀Y(jié)界突破后會(huì)直接掉到后面去,也就是說(shuō)界面上一的都是沒(méi)被突破的细办,但個(gè)人結(jié)界就不是這個(gè)情況QAQ
東西也放到Github了哦橙凳,同樣有什么問(wèn)題記得回復(fù)QWQ