阴阳师_御魂_贪嗔痴_卑弥呼脚本
19年12月19日
之前看了很多别人写的代码 但是大多数都存在功能不全的问题
而且最近游戏也进行了更新游戏界面的改变导致很多之前的代码都无法使用
所以决定自己写了一个脚本使用
话不多说直接上代码
import os
import cv2
import random
import time
'''
在游戏中进入挑战界面后运行代码可自动选择副本进行战斗 (输入数字进行选择即可)
如果选择的是御魂副本 会自动为玩家打开御魂加成 所以等待时间稍微长一些
此代码是闲暇时写来自己使用的 所以Settings中的范围都是我根据自己手机分辨率取的点 使用的工具是photoshop
运行代码需要安装cv2模块: pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ opencv-contrib-python
还需要安装adb调试工具:
一切准备就绪后使用数据线连接手机 手机打开开发者模式 usb调试
可在终端中使用adb devices查看手机是否与电脑连接成功
接下来的操作在文章结尾
'''
class Settings():
"""储存所有阴阳师脚本的点击范围的类"""
def __init__(self):
self.start_x = [1690, 1770]
self.start_y = [915, 1000]
self.end_x = [20, 1243]
self.end_y = [677, 899]
self.start_RLZY_x = [620, 680]
self.start_RLZY_y = [786, 890]
self.q_option_x = [94, 140]
self.y_option_y = [246, 400]
self.t_option_y = [496, 654]
self.b_option_y = [730, 880]
self.jc_outer_x = [640, 680]
self.jc_outer_y = [56, 110]
self.jc_in_x = [1180, 1280]
self.jc_in_y = [322, 340]
self.xs_x = [1250, 1310]
self.xs_y = [600, 660]
class Y_function(object):
def get_screen(self):
cmd_get = 'adb shell screencap -p /sdcard/screen_img.png'
cmd_send = 'adb pull sdcard/screen_img.png ./img'
os.system(cmd_get)
os.system(cmd_send)
img = cv2.imread('./img/screen_img.png', 0)
return img
def match(self, img1, template):
"""img1代表待匹配图像, template代表模板, 模板是小图"""
res = cv2.matchTemplate(img1, template, cv2.TM_CCOEFF_NORMED)
maxres = res.max()
return maxres
def get_randxy(self, 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(self, a, b):
"""产生a,b间的随机时间延迟"""
time.sleep(random.uniform(a, b))
def click(self, x, y):
"""输入两个二维列表,表示要点击的位置的x坐标,y坐标"""
cmd_click = 'adb shell input tap {} {}'.format(x, y)
os.system(cmd_click)
settings = Settings()
yf = Y_function()
class Click_sj(object):
def perform_click(self, x_range, y_range):
def click_range(x, y):
xc = random.randint(x[0], x[1])
yc = random.randint(y[0], y[1])
return xc, yc
xc, yc = click_range(x_range, y_range)
def click_event(x, y):
"""输入两个二维列表,表示要点击的位置的x坐标,y坐标"""
cmd_click = 'adb shell input tap {} {}'.format(x, y)
os.system(cmd_click)
click_event(xc, yc)
def gaibian_jiacheng(self):
self.perform_click(settings.jc_outer_x, settings.jc_outer_y)
yf.get_randtime(1.5, 3)
self.perform_click(settings.jc_in_x, settings.jc_in_y)
yf.get_randtime(1.5, 3)
self.perform_click(settings.q_option_x, settings.y_option_y)
yf.get_randtime(1.5, 3)
cl = Click_sj()
class Y_function2(object):
def begin(self):
t_start = cv2.imread('./img/start.png', 0)
t_RLZY_start = cv2.imread('./img/start_RL.png', 0)
t_end = cv2.imread('./img/end.png', 0)
n = input("请输入刷副本次数:")
n = int(n)
return t_start, t_end, n, t_RLZY_start
def YH_sleep(self, t, x, y):
time.sleep(random.uniform(40, 44))
def TCC_sleep(self, t, x, y):
time.sleep(random.uniform(65, 70))
def RLZY_sleep(self, t, x, y):
time.sleep(random.uniform(4, 5.5))
self.matchT(t, x, y)
time.sleep(random.uniform(60, 65))
def y_start(self):
cl.perform_click(settings.jc_outer_x, settings.jc_outer_y)
yf.get_randtime(1.5, 3)
cl.perform_click(settings.jc_in_x, settings.jc_in_y)
yf.get_randtime(1.5, 3)
cl.perform_click(settings.q_option_x, settings.y_option_y)
yf.get_randtime(1.5, 3)
def q_start(self, location_y):
cl.perform_click(settings.q_option_x, location_y)
yf.get_randtime(1.5, 3)
def judge_select(self, combat_option):
if combat_option == 1:
self.q_start(settings.y_option_y)
self.y_start()
underway = self.YH_sleep
return underway
elif combat_option == 2:
self.q_start(settings.t_option_y)
underway = self.TCC_sleep
return underway
elif combat_option == 3:
self.q_start(settings.b_option_y)
underway = self.RLZY_sleep
return underway
def matchT(self, 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)
if sd == 8:
cl.perform_click(settings.xs_x,settings.xs_y)
sd += 1
sx, sy = yf.get_randxy(x, y)
yf.get_randtime(0.1, 1.1)
yf.click(sx, sy)
print('匹配成功,共匹配{}次'.format(sd + 1))
yf.get_randtime(3, 4)
yf2 = Y_function2()
def all_begin():
combat_option = int(input('请输入要刷的副本: 1.御魂 2.贪嗔痴 3.日轮之陨: '))
xecutive_function = yf2.judge_select(combat_option)
t_start, t_end, n, t_RLZY_start= yf2.begin()
for k in range(n):
print('开始运行第{}次'.format(k + 1))
yf2.matchT(t_start, settings.start_x, settings.start_y)
xecutive_function(t_RLZY_start, settings.start_RLZY_x, settings.start_RLZY_y)
yf2.matchT(t_end, settings.end_x, settings.end_y)
if combat_option == 1:
yf2.y_start()
print('一共运行了{}次'.format(n))
if __name__ == '__main__':
all_begin()
检测开始的模板图片:

检测结束的模板图片:

检测卑弥呼战斗开始的模板图片:

在与代码平级的目录下创建img文件夹
将上面三个图片放到放到img文件夹中
都准备就绪就可以开始执行代码了
拿走了记得赞我
