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真的是强大,这个库用一下,那个库用一下,就可以把问题解决掉。

猜你喜欢

转载自blog.csdn.net/qq_38650545/article/details/81052184