1. 程式人生 > >python實現陰陽師自動刷御魂指令碼

python實現陰陽師自動刷御魂指令碼

寫在前面:

最近在想研究找實習的時候發現大家都推薦有一個部落格貼出自己做的專案,沒有大專案表示很慌,就找出來了之前自己學習時python寫的一個陰陽師指令碼貼出來。

簡介:

python作為一種膠水語言,提供了大量的庫,這個指令碼也是主要利用python的cv2庫裡的模板匹配函式,os對cmd命令操作,以及adb模擬安卓手機的截圖和點選實現的。

import cv2
import os
import os

cv2和adb庫需要在網上下載才可以用。

流程分析:

戰鬥過程就可以分解為以下幾個模組:

1.識別準備介面中的“挑戰”按鈕,並且點選它

a.挑戰按鈕   

b.準備介面

2.等待戰鬥

這一步要根據陣容選擇適當的時間。

3.跳過動畫

戰鬥結束有一小段動畫,可以點選螢幕跳過,我這裡選擇在一定時間內點選3次

4.匹配結束畫面,並點選

結束畫面需要點選一次才可以跳過。

a.結束模板


這裡選擇了一個結束介面中的影象塊作為模板

b.結束介面

根據以上流程一次御魂就刷完了。

原始碼:

原始碼一共有四個檔案

1.主函式main

呼叫流程分析裡的模組進行戰鬥

import y_functions2 as yf2
from settings import Settings

y_settings = Settings()
#匯入準備模板
t_start, t_end, n = yf2.begin()
#n為計劃刷御魂次數,通過begin函式輸入
for k in range(n):
    
    print('開始刷第{}次御魂'.format(k + 1))

    #檢測挑戰模板
    yf2.matchT(t_start, y_settings.start_x, y_settings.start_y)
    
    #等待戰鬥最後結尾點三下跳過動畫
    yf2.endclick(y_settings)
    print('結尾點選三次')

    #檢測結束模板
    yf2.matchT(t_end, y_settings.end_x, y_settings.end_y)
    
print('一共刷完了{}次御魂'.format(n))

2.y_functions2

儲存戰鬥模組

import y_functions as yf
import cv2
from settings import Settings

"""這個檔案作用是將y_function中的函式整合為幾個模組,
防止主程式中出現太多迴圈"""

#準備模組
#匯入模板,設定刷御魂次數模組
def begin():
    t_start = cv2.imread('D:\python_code\yys\yys1.1\img\start.png', 0)
    t_end = cv2.imread('D:\python_code\yys\yys1.1\img\end.png', 0)
    n = input("請輸入刷御魂次數:")
    n = int(n)
    return t_start, t_end, n

#匹配模組
#檢測模板,點選螢幕
def matchT(t, x, y):
    sd = 0
    while sd <15:
        img1 = yf.get_screen()
        res = yf.match(img1, t)
        if res > 0.97:
            break
        else:
             yf.get_randtime(0.8, 1.3)
        sd += 1
    sx, sy = yf.get_randxy(x, y)
    yf.get_randtime(0.5, 1)
    yf.click(sx, sy)
    print('匹配成功,共匹配{}次'.format(sd + 1))
    yf.get_randtime(4, 5)

#跳過動畫模組
#開始戰鬥後等待一段時間後點擊三下跳過動畫
def endclick(y_settings):
    print('等待戰鬥中......')
    yf.get_randtime(27, 29)
    for i in range(1, 4):
        #點選
        ex, ey = yf.get_randxy(y_settings.end_x, y_settings.end_y)
        yf.click(ex, ey)
        #等待
        yf.get_randtime(0.8, 1.5)

3.y_functions

儲存y_functions2裡用到的函式

import os
import cv2
import random
import time

def get_screen():
    #截圖口令
    cmd_get = 'adb shell screencap -p /sdcard/screen_img.png'
    #傳送圖片口令
    cmd_send = 'adb pull sdcard/screen_img.png D:\python_code\yys\yys1.1\img'
    #截圖和傳送操作
    os.system(cmd_get)
    os.system(cmd_send)
    img = cv2.imread('D:\python_code\yys\yys1.1\img\screen_img.png',0)
    return img

def match(img1, template):
    """img1代表待匹配影象, img2代表模板"""
    res = cv2.matchTemplate(img1,template,cv2.TM_CCOEFF_NORMED)
    maxres = res.max()

    return maxres

def get_randxy(x, y):
    """產生一個在x,y二維區域內的隨機位置,x,y為兩個元素的列表,變數範圍"""
    xc = random.randint(x[0], x[1])
    yc = random.randint(y[0], y[1])

    return xc,yc

def get_randtime(a, b):
    """產生a,b間的隨機時間延遲"""
    time.sleep(random.uniform(a, b))

def click(x, y):
    """輸入兩個二維列表,表示要點選的位置的x座標,y座標"""
    cmd_click = 'adb shell input tap {} {}'.format(x, y)
    os.system(cmd_click)

4.settings

儲存一些設定,一些改動可以通過只改裡面的引數實現,而不用改其它程式。

我的小米mix解析度是2040 * 1080,如果手機不同,需要調整settings裡的引數。

class Settings():
    """儲存所有陰陽師指令碼的設定類"""

    def __init__(self):
        
        #點選挑戰範圍
        self.start_x = [1402, 1578]
        self.start_y = [710, 779]
        #結束點選範圍
        self.end_x = [850, 1139]
        self.end_y = [677, 899]

寫在最後:

本來是打算用python寫一個可以刷各各種副本的完全體指令碼,函式和重要的匹配模組也寫好了,完成其它任務只需要找到對應的模板,用matchT函式匹配並點選即可。但是後來對陰陽師熱情沒那麼高,就擱置下了。

不過python真的是強大,這個庫用一下,那個庫用一下,就可以把問題解決掉。