zoukankan      html  css  js  c++  java
  • 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库使用方法参考博客

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

  • 相关阅读:
    oracleI基础入门(6)sql语句Substring Crazy
    oracleI基础入门(7)table约束 Crazy
    oracleI基础入门(7)table视图 Crazy
    SQL附加分离数据库(命令)
    双截棍 C语言版 (超搞笑)
    AspNetPage分页(repeater),自己做的例子基本代码
    记录
    RegularExpressionValidator控件中正则表达式用法
    20 个经典的 Ajax + CSS 表格
    GridView各个事件中,怎样获取主键值
  • 原文地址:https://www.cnblogs.com/ananing/p/python.html
Copyright © 2011-2022 走看看