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

 

 

 

 圖片的存放路徑:

 

 

 

 

找點后的圖片:

 

 

 

 

 

 

未完。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM