用Python實(shí)現(xiàn)陰陽(yáng)師自動(dòng)結(jié)界突破

把我家御饌津當(dāng)封面OwO

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è)人結(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)寮突破的界面,如圖:

陰陽(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)擊

簡(jiǎn)單來(lái)說(shuō)就是點(diǎn)擊“挑戰(zhà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í)別到黃圈的部分就可以了,然后隨便按一下。
但如果輸了的話,我個(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。。。
  1. 首先是界面的識(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
  1. 然后是隨機(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
  1. 識(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)按
  1. 對(duì)于“勝利”“失敗”和一不小心點(diǎn)到頭像的情況和上面識(shí)別“挑戰(zhàn)”都是差不多的
    #前面的代碼和上面的是一樣的
    # 判斷是否出現(xiàn)這樣的畫(huà)面
    if (res >= threshold).any():
        # 點(diǎn)按或者返回某個(gè)值,例如:(配合主程序的條件語(yǔ)句)
        return 1
  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:  # 贏的話
                lib.ats.tap(x1, y1)
                break  # 僅僅是退出這個(gè)小循環(huán)
            elif lose(judge) == 1:  #輸?shù)脑?                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í)別圖像后還要返回位置的話
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í)別圖像的話
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í)話個(gè)人突破的那個(gè)九宮格其實(shí)還是相當(dāng)麻煩的,因?yàn)殄冀Y(jié)界突破后會(huì)直接掉到后面去,也就是說(shuō)界面上一的都是沒(méi)被突破的,但個(gè)人結(jié)界就不是這個(gè)情況QAQ
東西也放到Github了哦,同樣有什么問(wèn)題記得回復(fù)QWQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 想法 突然想搞一個(gè)FGO的腳本,但還是決定先從陰陽(yáng)師開(kāi)始入手畢竟現(xiàn)在版本官方已經(jīng)有了自動(dòng)御魂、覺(jué)醒和探索的腳...
    Meowcolm024閱讀 4,924評(píng)論 2 2
  • 如果可以接受自己也不那么完美,就不用忙著去粉飾了;如果可以承認(rèn)自己并不那么偉大,就不用急著去證明;如果可以放棄自己...
    喻豆豆閱讀 198評(píng)論 0 1
  • 沉默是黎明的死亡 孤零揉碎寂靜草塘 我飄在,黑碾壓的云上 冥燈照亮棺楯的結(jié)角 看不見(jiàn)的便是最終方向 那里,沒(méi)有曙光...
    南船北海閱讀 221評(píng)論 0 1
  • 第一家 總之不知是運(yùn)氣還是新公司缺人,我已經(jīng)進(jìn)過(guò)兩家新公司了。新公司呢顧名思義就是新開(kāi)的,并且傳媒行業(yè)發(fā)展得如火如...
    陳苡安閱讀 795評(píng)論 2 0

友情鏈接更多精彩內(nèi)容