码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-06-13 10:43:21      阅读:1919      评论:0      收藏:0      [点我收藏+]

标签:map   代码   通过   rom   中心   des   对象   atp   脚本   

参考大佬们的博客,凑出了阴阳师的简单挂机脚本,对各个博主进行感谢,鞠躬.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简单实现阴阳师挂机脚本

标签:map   代码   通过   rom   中心   des   对象   atp   脚本   

原文地址:https://www.cnblogs.com/ananing/p/python.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!