zoukankan      html  css  js  c++  java
  • Python 帝国霸略 辅助工具 自动打野 测试版1

    pip安装时,注意一下windows的权限,我系统是win10,安装的时候提示文件夹没有权限无法写入,我重新跟文件夹设置过权限的,先更改文件夹的所有者,然后改的权限

    pip安装:

    1、首先

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywin32
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow

    2、然后,升级一下pip,然后再安装pyHook

      pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

    python -m pip install --upgrade pip
    pip install pyHook-1.5.1-cp37-cp37m-win_amd64.whl

    3、接着

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyuserinput

     优化:

      用一张模板来匹配,正确率不是很高,准备改为用一个数据集(多张模板)来进行多次匹配,然后对匹配到的坐标进行去重(去相似点)

      截图:以前的截图方法不知道怎么的在win10上很慢,并且有时候打开是黑屏图片,所以就换了一个

    版本一 实现的功能:

      目前仅做了自动刷野,且不完善,后期继续完善

      大致流程是:截取当前屏幕,自动识别野地,自动点击攻击,自动选择预设方案,自动攻击野地

    后期再完善其他的吧,现在只是个demo而已

    截屏代码:

    from PIL import ImageGrab
    
    im = ImageGrab.grab() #可以添加一个坐标元组进去
    im.save('1.jpg')

    代码-2020-01-19

    import os
    import cv2
    import time
    import numpy as np
    import win32gui, win32ui, win32con
    from matplotlib import pyplot as plt
    from ctypes import windll
    from PIL import Image
    from pymouse import PyMouse
    from PIL import ImageGrab
    
    
    
    
    
    
    
    
    
    
    
    # 遍历模板数据集
    # 获取匹配到的点(坐标)
    # 去相似坐标
    
    
    # 注意:不同屏幕分辨率下 按钮的位置
    #   用图形识别按钮 + 缓存位置实现
    
    
    
    
    
    # 全局变量
    attackMonsterJpg='./template/btn/attackMonster.jpg'
    armyAttackJpg='./template/btn/armyAttack.jpg'
    armyPresetJpg='./template/btn/armyPreset.jpg'
    
    
    
    
    
    
    # 图片识别返回坐标 参数:大图路径 小图路径 相似度(阈值)
    def getPointByImg(bigImgPath, smartImgPath, threshold):
        arr=[]
        
        # 1. 读入大图(被搜索的图片) 和 小图(模板)    
        img_rgb=cv2.imread(bigImgPath)    
        img_gray=cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
        template=cv2.imread(smartImgPath, 0)    
        
        h, w=template.shape[:2]
    
        # 归一化平方差匹配
        res=cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)    
    
        # 返回res中值大于0.8的所有坐标
        # 返回坐标格式(col,row) 注意:是先col后row 常用的是(row,col)!!!
        loc=np.where(res >= threshold)
    
        # loc:标签/行号索引 常用作标签索引
        # iloc:行号索引
        # loc[::-1]:取从后向前(相反)的元素
        # *号表示可选参数
        for pt in zip(*loc[::-1]):
            right_bottom=(pt[0] + w, pt[1] + h)
            cv2.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)
            # 中心点
            center_point=(int(pt[0]+w/2), int(pt[1]+h/2))
            arr.append(center_point)       
            left2=(center_point[0]-2,center_point[1]-2)
            right2=(center_point[0]+2,center_point[1]+2)
            cv2.rectangle(img_rgb, left2, right2, (0, 255, 0), 2)
            
        # 保存处理后的图片
        cv2.imwrite('img_screenshots_res.png', img_rgb)
        
        # 显示图片 参数:(窗口标识字符串,imread读入的图像)
        #cv2.imshow("test_image", img_rgb)
        return arr
    
    
    
    
    # 判断坐标是否相似
    def isLike(arr, obj):
        val=7
        for item in arr:
            if (abs(item[0]-obj[0])<val) and (abs(item[1]-obj[1])<val):
                return True
        return False
    
    
    
    # 获取不相似的点
    def getDiffPoint(arr,arr_res):
        for item in arr:
            if isLike(arr_res, item)==False:
                # 转换为真实坐标
                #x=item[0]+left_top[0]
                #y=item[1]+left_top[1]
                #arr_res.append((x,y))
                arr_res.append(item)
        return arr_res
    
    
    
    # 描点
    def paintPoint(bigImgPath, saveResImgPath, arr):
        # 1. 读入原图和模板    
        img_rgb=cv2.imread(bigImgPath)    
        img_gray=cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)    
        for center_point in arr:                     
            w=4
            left2=(center_point[0]-w,center_point[1]-w)
            right2=(center_point[0]+w,center_point[1]+w)
            cv2.rectangle(img_rgb, left2, right2, (0, 255, 0), 2)        
        # 保存处理后的图片
        cv2.imwrite(saveResImgPath, img_rgb)
        
    
    
    # 获取单个点
    def getSinglePoint(smartImgPath):
        bigImgPath='temp-single.jpg'
        threshold=0.7
        # 截屏
        im = ImageGrab.grab()
        im.save(bigImgPath)
        arr_res=[]
        arr=getPointByImg(bigImgPath, smartImgPath, threshold)# 匹配点
        if len(arr)==0:
            print('未匹配到相应的图形:'+smartImgPath)
            return None
        arr_res=getDiffPoint(arr, arr_res)# 取相似    
        return arr_res[0]
    
    
    
    
    # 获取单个点(会自动寻找30次) 
    def getSinglePointForLongTime(smartImgPath):
        for i in range(30):
            print('继续找点 当前次数 '+str(i+1))
            time.sleep(0.5)
            point=getSinglePoint(smartImgPath)
            if point!=None:
                return point
        print('长时间未找到点')
        return None
      
        
     
     
     # 模拟点击
    def clickPoint(arr):
        m = PyMouse()
        for point in arr:
            print(point)
            time.sleep(1)
            
            # 点击野地
            print('准备 点击野地')     
            m.click(point[0], point[1])
            
            # 点击攻击
            print('准备 点击攻击')
            point_attack=getSinglePointForLongTime(attackMonsterJpg)
            if point_attack!=None:
                m.click(point_attack[0], point_attack[1])        
                
                # 点击预设
                print('准备 点击预设')
                point_armyPreset=getSinglePointForLongTime(armyPresetJpg)
                if point_armyPreset!=None:
                    m.click(point_armyPreset[0], point_armyPreset[1])
                    
                    # 点击预设界面的攻击
                    print('准备 点击预设界面的攻击')
                    point_armyAttack=getSinglePointForLongTime(armyAttackJpg)
                    if point_armyAttack!=None:
                        m.click(point_armyAttack[0], point_armyAttack[1])
                
           
                
    
     
     
     
    # 找到点
    def findPoint():    
        arr_res=[]
        path = "./template/monster/"
        files = os.listdir(path)
        bigImgPath='img_screenshots.jpg'
        saveResImgPath='img_screenshots_res.png'
        
        # 截图
        im = ImageGrab.grab()
        im.save(bigImgPath)
        
        for filename in files:
            threshold=0.6# 阈值
            smartImgPath=path+filename# 文件路径
            arr=getPointByImg(bigImgPath, smartImgPath, threshold)# 匹配点
            arr_res=getDiffPoint(arr, arr_res)# 取相似
        paintPoint(bigImgPath, saveResImgPath, arr_res)# 描点
        print(len(arr_res))
        print(arr_res)
        if len(arr_res)==0:
            print('未找到野')
            
        clickPoint(arr_res)
    
    
    
    
    
    
    print('start')
    try:
        #time.sleep(5)
        findPoint()    
        
        # test, find point, result pic: img_screenshots_res.png
        # 需要打开相应的测试图片
        #point=getSinglePoint(attackMonsterJpg)
        #point=getSinglePoint(armyPresetJpg)
        #point=getSinglePoint(armyAttackJpg)
        #print(point)
        
    except Exception as e:
        print(e)
        f=open('1.txt','w')
        f.write(str(e))
        f.close()
    
    
    
    
    print('10秒后自动关闭')
    time.sleep(10)
    
    
    
    # 窗口等待任意键盘按键输入 0为一直等待 其他数字为毫秒数
    cv2.waitKey(0)
    
    # 销毁窗口 退出程序
    cv2.destroyAllWindows()
    View Code

     图片的存放路径:

     

    找点后的图片:

    未完。。。

  • 相关阅读:
    [读书笔记]子查询
    [读书笔记]SQL约束
    [转载]NoSQL数据库的基础知识
    利用C#实现对excel的写操作
    [转载]SQL Server内核架构剖析
    利用花生壳和IIS发布网页过程
    [读书笔记]ASP.NET的URL路由引擎
    [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)
    [正则表达式]基础知识总结
    CF623E Transforming Sequence
  • 原文地址:https://www.cnblogs.com/guxingy/p/12206908.html
Copyright © 2011-2022 走看看