Python製作回合制手遊外掛簡單教程(中)

來源:互聯網
上載者:User

接著上篇的博文,今天我們講如何?自動組隊刷道

 

引入:

自動組隊刷道的流程是先點擊刷道按鈕、再點擊前往按鈕、再點擊便捷組隊······

這些操作上篇博文已經告訴我們怎麼做了,利用picpick丈量座標,再用autopy類比滑鼠點擊

但是點擊過便捷組隊後如何?自動建立隊伍並匹配隊友呢?

這裡要用到文字識別

玩過問道的都知道,沒有隊友或者隊友數量沒到4的時候,隊伍會存在守護,如下

並且守護的位置是固定的,守護的優先順序是從左至右,例如,匹配到一個隊友,鬥闕長老就會消失(不會參戰);再匹配一個隊友,白骨長老就會消失(不會參戰)

我的思路是,隔一段時間對夜神模擬器,再對這張文字識別,判斷“鬥闕長老”和“白骨長老”是否存在於識別出的字串中。當然,也可以判斷長老數量是否小於等於2

因為玩過回合制的知道,隊伍達到三個人就可以發車了,做任務的過程中系統會自動匹配隊友,直到匹配滿為止

 

前期準備:利用PIL的ImageGrab

安裝PIL

pip install pillow

(pillow包裡包含了pil,pil目前已經停止維護了)

我這裡是用PyCharm直接安裝的依賴包

 

複製代碼,直接運行

#coding=utf-8import timeimport win32apiimport win32confrom PIL import ImageGrabtime.sleep(3)# 參數說明# 第一個參數 開始的x座標# 第二個參數 開始的y座標# 第三個參數 結束的x座標# 第四個參數 結束的y座標bbox = (391, 156, 1582, 853)im = ImageGrab.grab(bbox)# 參數 儲存檔案的路徑im.save('as.png')

 

直接運行,會發現在目前的目錄下有一個as.png的檔案

官方文檔對grab方法給出的解釋

這裡bbox = (x1,y1,x2,y2),意思是從螢幕座標(x1,y1)到(x2,y2)的一段地區

ImageGrab.grab(bbox) ⇒ image(New in 1.1.3) Take a snapshot of the screen, and return an “RGB” image. The bounding box argument can be used to copy only a part of the screen.

 

 

利用baidu-aip進行文字識別

我嘗試過pytesseract和pytesser的文字識別,經常會出現識別失敗,對中文的支援也不夠友好

所以我這裡選用baidu-aip進行文字識別

PyCharm開啟File->Settings->加號

 

搜尋baidu-aip,再點擊左下角Install Package

 

我們需要APPP_ID、API_KEY、SECRET_KEY,我們去百度雲申請

登入百度雲,百度雲端硬碟和百度貼吧帳號可以直接使用,沒有的話申請一個百度帳號

找到文字識別

 

 點擊建立應用

 

完成建立,個人使用者一天可以免費識別600次

 

需要識別文字的圖片用

 

複製代碼,運行

#coding=utf-8from aip import AipOcrimport re#百度文字識別APPP_ID = 'APP_ID'API_KEY = 'APP_KEY'SECRET_KEY = 'SECRET_KEY'client = AipOcr(APPP_ID,API_KEY,SECRET_KEY)i = open(r'E:\python_project\test\imageIdentification\helpedName1.png','rb')img = i.read()message = client.basicGeneral(img);for i in message.get('words_result'):    print(i.get('words'))

 可以看到結果

 

開始製作外掛:

和上篇部落格一樣,先丈量座標,座標根據解析度不同而不同,我這裡是1920*1080

 刷道按鈕的座標是(809,222)

 

 前往按鈕的座標是(1101,646)

 

便捷組隊的座標是(1449,730)

 

 建立隊伍按鈕(998,799)

 

 開始匹配(1232,794)

 

丈量座標完畢後,調用文字識別,判斷“鬥闕長老”和“白骨長老”是否存在於識別的字串中

如果兩位長老都不存在,說明隊伍裡已經有三人。此時關閉刷道視窗,點擊陸壓真人,對話,開始刷道

設定十輪刷道時間,十輪刷道任務結束後開始新的一輪刷道

 

詳細代碼如下:

imageGrabUtil.py(工具)

#coding=utf-8from PIL import ImageGrab# 參數說明# 第一個參數 開始的x座標# 第二個參數 開始的y座標# 第三個參數 結束的x座標# 第四個參數 結束的y座標def screenshot(x1,y1,x2,y2,filename):    bbox = (x1, y1, x2, y2)    im = ImageGrab.grab(bbox)    # 參數 儲存檔案的路徑    im.save('E:\\python_project\\Asktao_Automation\\resource\\'+filename+'.png')

 

baiduAipUtil.py(文字識別工具)

我這裡百度雲的APPP_ID、API_KEY、SECRET_KEY儲存在config.ini

#coding=utf-8from aip import AipOcrimport re#百度文字識別# !/usr/bin/env python# -*- coding:utf-8 -*-import ConfigParserimport osos.chdir("E:\python_project\Asktao_Automation\util")cf = ConfigParser.ConfigParser()cf.read("config.ini")secs = cf.sections()APPP_ID = cf.get("baiduAip","APPP_ID")API_KEY = cf.get("baiduAip","API_KEY")SECRET_KEY = cf.get("baiduAip","SECRET_KEY")client = AipOcr(APPP_ID,API_KEY,SECRET_KEY)def characterRecognition(filePath):    i = open(filePath,'rb')    img = i.read()    message = client.basicGeneral(img);    #print(message.get('words_result'))    string = '';    for i in message.get('words_result'):        print(i.get('words'))        string += i.get('words')    return string

 

config.ini

[baiduAip]APPP_ID = APPP_ID 
API_KEY = API_KEY  

SECRET_KEY = SECRET_KEY

 

shuaDao.py

#coding=utf-8import autopyimport timeimport win32apiimport win32confrom imageGrabUtil import screenshotfrom baiduAipUtil import characterRecognitionimport sysdefaultencoding = 'utf-8'if sys.getdefaultencoding() != defaultencoding:    reload(sys)    sys.setdefaultencoding(defaultencoding)#刷道(隊長模式)#time.sleep(5)win32api.keybd_event(18,0,0,0)  #alt鍵位碼是18win32api.keybd_event(9,0,0,0)  #tab鍵位碼是9time.sleep(0.5)win32api.keybd_event(13,0,0,0)  #enter鍵位碼是13win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #釋放按鍵win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)time.sleep(2)def mousemove_click(x,y):    autopy.mouse.smooth_move(x, y)    autopy.mouse.click()mousemove_click(809,222)#移動到刷道按鈕mousemove_click(1101,646)#點擊前往time.sleep(10)#從其他地圖走到軒轅廟陸壓真人處花費10smousemove_click(1449,730)#點擊便捷組隊mousemove_click(998,799)#點擊建立隊伍mousemove_click(1121,781)#點擊開始匹配for i in range(1,10,1):    teamFileName = 'judgeTeamCount'    time.sleep(3)    screenshot(391, 156, 1582, 853,teamFileName)#    judgeTeamStr = characterRecognition('E:\\python_project\\Asktao_Automation\\resource\\'+teamFileName+'.png')#文字識別    #每個人守護順序不一樣,按需修改    if '鬥闕長老' not in judgeTeamStr and '白骨長老' not in judgeTeamStr: #這兩個守護不在,說明隊伍已有三人,開始刷道        mousemove_click(1524,234) #點擊關閉按鈕        mousemove_click(809, 222)  # 移動到刷道按鈕        mousemove_click(1101, 646)  # 點擊前往        mousemove_click(1446, 661)#點擊【伏魔】我這就去        break    time.sleep(600)#休息十分鐘後再次查看是否組到人#刷道十輪之後的操作for j in range(1,10,1):    time.sleep(780)#平民伏魔一般780s之內,土豪伏魔有300s的,按需修改    taskFileName = 'judgeTaskAccomplish'    time.sleep(3)    screenshot(500, 164, 1701, 866,taskFileName)    judgeTaskStr = characterRecognition('E:\\python_project\\Asktao_Automation\\resource\\'+taskFileName+'.png')    if '【伏魔】我這就去' in judgeTaskStr:        mousemove_click(1446, 661)  # 點擊【伏魔】我這就去    else:        time.sleep(60) #防止780s內還沒有完成伏魔操作,再等60s,以防萬一        mousemove_click(1446, 661)  # 點擊【伏魔】我這就去

 

 

效果如下:

鑒於部落格園只能上傳10MB以下的GIF,所以我沒有上傳完整的

親測可用,大概十分鐘左右可以匹配到三個人,就開始刷道

10輪刷道為一組,組數可以自己將迴圈數設大一點,我這裡設的是10

有的時候匹配不到人,比如像白天就比較難匹配到人。可以把判斷長老是否存在的那部分,多迴圈幾次

 

再次強調,My Code不一定在你的電腦上可以運行,我的電腦解析度是1920*1080,模擬器的位置是預設的放在中央,模擬器移動的話丈量的座標都不一樣

製作外掛最重要的是思想方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.