Python简单实现阴阳师挂机脚本

Posted 榕霖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python简单实现阴阳师挂机脚本相关的知识,希望对你有一定的参考价值。

参考大佬们的博客,凑出了阴阳师的简单挂机脚本,对各个博主进行感谢,鞠躬.jpg

实现原理:

对各个按钮等需要点击的地方进行截图,然后对整个屏幕截屏,通过模板匹配得到截图在截屏中的坐标位置,进行点击

实现方法:

对整个屏幕进行截图,并保存

 1 ####截图方法1####
 2 import win32gui
 3 import win32ui
 4 import win32con
 5 import win32api
 6 def Printscreen():
 7     # 获取桌面
 8     hdesktop = win32gui.GetDesktopWindow()
 9 
10     # 分辨率适应
11     width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
12     height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
13     left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
14     top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
15     # width=1920  # 因为用win32api.GetSystemMetrics获取的分辨率不对,于是我直接手输入进去的
16     # height=1080
17 
18     # 创建设备描述表
19     desktop_dc = win32gui.GetWindowDC(hdesktop)
20     img_dc = win32ui.CreateDCFromHandle(desktop_dc)
21 
22     # 创建一个内存设备描述表
23     mem_dc = img_dc.CreateCompatibleDC()
24 
25     # 创建位图对象
26     screenshot = win32ui.CreateBitmap()
27     screenshot.CreateCompatibleBitmap(img_dc, width, height)
28     mem_dc.SelectObject(screenshot)
29 
30     # 截图至内存设备描述表
31     mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)
32 
33     # 将截图保存到文件中
34     screenshot.SaveBitmapFile(mem_dc, \'yuan.png\')
35 
36     # 内存释放
37     mem_dc.DeleteDC()
38     win32gui.DeleteObject(screenshot.GetHandle())
39 
40 # 测试
41 Printscreen()
 1 ####截图方法2####
 2 from  PIL import Image
 3 from PIL import ImageGrab
 4 
 5 def Printscreen():
 6     # 截图坐标 左上角 ,右下角
 7     size = (0, 0,1920,1080)
 8     img = ImageGrab.grab(size)
 9     # 保存截图
10     img.save("yuan.png")
11     print(\'截图进行了一次刷新\')
12     # 打开截图
13     # img.show() 
14 
15 # 测试
16 Printscreen()

 

通过模板匹配得到截图的坐标位置

模板匹配参考博客

图像筛选参考博客

注:模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。所以打开阴阳师后不要进行放大或缩小。

 1 import cv2
 2 import numpy as np
 3 from matplotlib import pyplot as plt
 4 import math 
 5 
 6 ###图像匹配###
 7 def Image_Discern(imgone,imgtwo):
 8     # 1.模板匹配
 9     # 大图
10     img = cv2.imread(imgone)
11     img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
12 
13     # 小图
14     template = cv2.imread(imgtwo, 0)
15     h, w = template.shape[:2]  # rows->h, cols->w
16     img2 = img.copy()
17     
18     # 对比图像
19     res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF_NORMED) 
20 
21     # 返回坐标
22     min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
23     top_left = min_loc
24     bottom_right = (top_left[0] + w, top_left[1] + h)
25 
26     # 计算中心坐标
27     a1, a2 = top_left
28     b1, b2 = bottom_right
29     c1 = (a1 + w/2)*0.8  # 0.8匹配屏幕分辨率(因为分辨率原因这里乘0.8用于适应平复分辨率坐标位置)
30     c2 = (a2 + h/2)*0.8  
31     e1 = math.ceil(c1)
32     e2 = math.ceil(c2)
33     d1 = (e1, e2)
34     # print(\'中心坐标为:\' , d1)
35    
36     ###测试图像匹配,弹出图像显示匹配位置###
37     # 在匹配点画小圆心
38     # cv2.circle(res, top_left, 10, 0, 2)
39     # cv2.imshow("res", res)
40 
41     # # 画矩形
42     # cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)
43     # cv2.imshow("img2",img2)
44     # cv2.waitKey(0)
45     
46     # 两张图片是否匹配
47     # print(\'各个参数为:\',min_val, max_val, min_loc, max_loc)
48 
49     ###进行图像筛选###
50     if min_val <= 0.03:
51         # print(\'图片匹配\')
52         return(d1)
53     else:
54         # print(\'图片不匹配\')
55         return(0)
56         
57 
58 # 测试
59 # Image_Discern(\'e1.png\',\'a2.png\') # (大图,小图)匹配图像

 

通过坐标位置进行点击

鼠标点击参考博客

 1 import win32api
 2 import win32con
 3 import win32gui
 4 import time
 5 import random
 6 
 7 def xunzhao():
 8         
 9     wdname = u\'阴阳师-网易游戏\'
10     # 取得窗口句柄
11     hwnd = win32gui.FindWindow(0, wdname)
12     if not hwnd:
13         print("窗口找不到,请确认窗口句柄名称:【%s】" % wdname )
14         exit()
15     # 窗口显示最前面
16     win32gui.SetForegroundWindow(hwnd)
17 
18 def move_click(x, y, t=0):  # 移动鼠标并点击左键
19     suiji1 = random.randint(0,10)
20     suiji2 = random.randint(0,10)
21     
22     # print(\'鼠标抖动随机数为:+\',suiji2,\'  +\',suiji1)
23     win32api.SetCursorPos((x+suiji1, y+suiji2))  # 设置鼠标位置(x, y),设置随机数,以防被封
24     time.sleep(0.1)
25     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
26     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 点击鼠标左键
27     # print(\'模拟点击\')
28     return 0
29 
30 # 测试
31 # while True :
32 #     suiji = random.randint(0,5) #获得随机数
33 #     xunzhao() #游戏顶置,获得句柄
34 #     time.sleep(suiji) #间隔时间
35 #     move_click(1280, 685) #坐标点击

一个简陋的实例

有基本的方法后,然后就可以写代码进行挂机了。

贴一个自己刷探索的代码,其中click模块为鼠标模拟点击,printscreen模块为截屏,image_discern模块为模板匹配

 1 import click
 2 import printscreen
 3 import image_discern
 4 import time
 5 
 6 ###进行图标点击###
 7 def Identify_Click(little): 
 8     a = 0.1
 9     click.xunzhao()
10     time.sleep(a) # 间隔秒数
11     printscreen.Printscreen() # 截图
12     time.sleep(a)
13     b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比
14     for i in range(1,10):
15         if b1 == 0:
16             print(\'准备再次寻找第\',i,\'\')
17             time.sleep(a) 
18             click.xunzhao()
19             time.sleep(a) 
20             printscreen.Printscreen()
21             time.sleep(a)
22             b1 = image_discern.Image_Discern(\'yuan.png\', little)
23         else:
24             time.sleep(a)   
25             printscreen.Printscreen() # 截图
26             b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比
27             a1, a2 = b1 #地址赋值
28             click.move_click(a1, a2) #模拟点击
29             time.sleep(a)
30             break
31 
32 ###寻找场景内是否有相应图标###
33 def Identify_Click_Seek(little):
34     a = 0.1
35     click.xunzhao()
36     time.sleep(a) # 间隔秒数
37     printscreen.Printscreen() # 截图
38     time.sleep(a)
39     b1 = image_discern.Image_Discern(\'yuan.png\', little) #图像对比
40     if b1 == 0:
41         # print(\'没有相应图标\')
42         return(False)
43     else:
44         # print(\'找到相应图标\')
45         return(True)

上面那代码块为identify_click模块

 1 import time
 2 import identify_click
 3 import random
 4 
 5 def Tansuo():
 6 
 7     b=0
 8     while True:
 9         a = (\'-----------------\') 
10         ##判断体力是否足够##
11         if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo13.png\'):
12             print(a)
13             print(\'体力不足\')
14             break #结束循环
15         ###组队结束战斗###
16         if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo17.png\'):
17             print(a)
18             print(\'战斗结束,回到组队页面\')
19             break #结束循环
20         ##判断是否结束##
21         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo12.png\'):
22             print(a)
23             print(\'探索结束!!\')
24             break
25         ##判断战斗结束##
26         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo04.png\'):
27             identify_click.Identify_Click(\'./png/tansuo/tansuo04.png\')
28             print(a)
29             print(\'战斗结束\')
30             continue #跳出本次循环
31         ##判断准备按钮##
32         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo08.png\'):
33             identify_click.Identify_Click(\'./png/tansuo/tansuo08.png\')
34             print(a)
35             print(\'战斗开始\')
36             while True:
37                 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo15.png\'):
38                     identify_click.Identify_Click(\'./png/tansuo/tansuo15.png\')
39                     break 
40                 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo04.png\'):
41                     identify_click.Identify_Click(\'./png/tansuo/tansuo04.png\')
42                     break
43                 elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo16.png\'):
44                     identify_click.Identify_Click(\'./png/tansuo/tansuo16.png\')
45                 else:
46                     time.sleep(0.1)
47             if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo15.png\'):
48                 print(\'!!!!!!!!!!!\')
49                 print(\'!战斗失败,中止脚本!\')
50                 print(\'!!!!!!!!!!!\')
51                 break
52             continue #跳出本次循环
53         ##BOSS##
54         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo07.png\'):
55             print(a)
56             print(\'发现BOSS\')
57             identify_click.Identify_Click(\'./png/tansuo/tansuo07.png\') 
58             continue
59         ##小怪##
60         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo03.png\'):
61             print(a)
62             print(\'发现小怪\')
63             identify_click.Identify_Click(\'./png/tansuo/tansuo03.png\')
64             continue
65         ##奖励宝箱##
66         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo09.png\'):
67             identify_click.Identify_Click(\'./png/tansuo/tansuo09.png\')
68             time.sleep(random.randint(1,2))
69             while True:
70                 if identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo10.png\'):
71                     identify_click.Identify_Click(\'./png/tansuo/tansuo11.png\') 
72                     break
73                 else:
74                     time.sleep(2)
75             print(a)
76             print(\'领取奖励宝箱\')
77             continue
78         ##进行走动##
79         elif identify_click.Identify_Click_Seek(\'./png/tansuo/tansuo05.png\'): 
80             print(a)
81             print(\'进行走动\')
82             b = b+1
83             if b < 5:
84                 identify_click.Identify_Click(\'./png/tansuo/tansuo05.png\')
85                 print(\'向右\')
86                 time.sleep(random.randint(3,4)) #间隔3~4秒
87                 continue
88             else:
89                 identify_click.Identify_Click(\'./png/tansuo/tansuo06.png\')
90                 print(\'向左\')
91                 time.sleep(random.randint(3,4)) #间隔3~4秒  
92                 continue
93         
94         time.sleep(0.5) #间隔3~4秒
95     return(True)
96 
97 # 测试
98 Tansuo()

当中的图片

 

这些是最近东拼西凑的代码,简单的代替了下无聊的手点鼠标环节。

还有一个简单实现的方法,运用pyautogui库,进行鼠标点击、截屏等操作,pyautogui库使用方法参考博客

最后再次感谢各位大佬的博客

以上是关于Python简单实现阴阳师挂机脚本的主要内容,如果未能解决你的问题,请参考以下文章

我竟然用python玩阴阳师?

Python模拟鼠标点击——如何正确的肝阴阳师

阴阳师按键精灵脚本

图像识别学习项目-python搭配opencv搞定阴阳师集市闹市999次活动

基于Python的阴阳师后台全平台辅助

OpenCV实现桌面版阴阳师自动御魂和觉醒双开突破业原火御灵等功能