歡迎光臨
每天分享高質量文章

Python製作回合遊戲自動完成任務輔助指令碼,進階篇

引入:

'''
作者:Rest探路者
源自:http://www.cnblogs.com/Java-Starter/p/9588829.html?utm_source=tuicool&utm;_medium=referral
'''

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

這些操作上篇博文已經告訴我們怎麼做了,利用picpick丈量坐標,再用autopy模擬滑鼠點選

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

這裡要用到文字識別

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

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

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

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

前期準備:

利用PIL的ImageGrab截圖

安裝PIL

pip install pillow

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

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

#coding=utf-8
import time
import win32api

import win32con
from PIL import ImageGrab

time.sleep(3)
# 引數說明
# 第一個引數 開始截圖的x坐標
# 第二個引數 開始截圖的y坐標
# 第三個引數 結束截圖的x坐標
# 第四個引數 結束截圖的y坐標
bbox = (3911561582853)
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.3Take 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-8
from aip import AipOcr

import 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-8

from 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-8
from aip import AipOcr

import re

#百度文字識別
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import ConfigParser
import os

os.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-8
import autopy
import time
import win32api
import win32con
from imageGrabUtil import screenshot
from baiduAipUtil import characterRecognition
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
    reload(sys)
    sys.setdefaultencoding(defaultencoding)


#刷道(隊長樣式)
#time.sleep(5)
win32api.keybd_event(18,0,0,0)  #alt鍵位碼是18
win32api.keybd_event(9,0,0,0)  #tab鍵位碼是9
time.sleep(0.5)
win32api.keybd_event(13,0,0,0)  #enter鍵位碼是13

win32api.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)#從其他地圖走到軒轅廟陸壓真人處花費10s

mousemove_click(1449,730)#點選便捷組隊

mousemove_click(998,799)#點選建立隊伍

mousemove_click(1121,781)#點選開始匹配

for i in range(1,10,1):
    teamFileName = 'judgeTeamCount'
    time.sleep(3)
    screenshot(3911561582853,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(809222)  # 移動到刷道按鈕
        mousemove_click(1101646)  # 點選前往
        mousemove_click(1446661)#點選【伏魔】我這就去
        break

    time.sleep(600)#休息十分鐘後再次檢視是否組到人

#刷道十輪之後的操作
for j in range(1,10,1):
    time.sleep(780)#平民伏魔一般780s之內,土豪伏魔有300s的,按需修改
    taskFileName = 'judgeTaskAccomplish'
    time.sleep(3)
    screenshot(5001641701866,taskFileName)
    judgeTaskStr = characterRecognition('E:\\python_project\\Asktao_Automation\\resource\\'+taskFileName+'.png')

    if '【伏魔】我這就去' in judgeTaskStr:
        mousemove_click(1446661)  # 點選【伏魔】我這就去
    else:
        time.sleep(60#防止780s內還沒有完成伏魔操作,再等60s,以防萬一
        mousemove_click(1446661)  # 點選【伏魔】我這就去

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

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

贊(0)

分享創造快樂