您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么使用Python寫安卓游戲外掛的示例,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
本次我們選擇的安卓游戲?qū)ο蠼小皢卧~英雄”,大家可以先下載這個(gè)游戲。
游戲的界面是這樣的:
通過(guò)選擇單詞的意思進(jìn)行攻擊,選對(duì)了就正常攻擊,選錯(cuò)了就象征性的攻擊一下。玩了一段時(shí)間之后琢磨可以做成自動(dòng)的,通過(guò)PIL識(shí)別圖片里的單詞和選項(xiàng),然后翻譯英文成中文意思,根據(jù)中文模糊匹配選擇對(duì)應(yīng)的選項(xiàng)。
查找了N多資料以后開(kāi)始動(dòng)手,程序用到以下這些東西:
PIL:Python Imaging Library 大名鼎鼎的圖片處理模塊
pytesser:Python下用來(lái)驅(qū)動(dòng)tesseract-ocr來(lái)進(jìn)行識(shí)別的模塊
Tesseract-OCR:圖像識(shí)別引擎,用來(lái)把圖像識(shí)別成文字,可以識(shí)別英文和中文,以及其它語(yǔ)言
autopy:Python下用來(lái)模擬操作鼠標(biāo)和鍵盤的模塊。
安裝步驟(win7環(huán)境):
(1)安裝PIL,下載地址:http://www.pythonware.com/products/pil/,安裝Python Imaging Library 1.1.7 for Python 2.7。
(2)安裝pytesser,下載地址:http://code.google.com/p/pytesser/,下載解壓后直接放在
C:\Python27\Lib\site-packages下,在文件夾下建立pytesser.pth文件,內(nèi)容為C:\Python27\Lib\site-packages\pytesser_v0.0.1
(3)安裝Tesseract OCR engine,下載:https://github.com/tesseract-ocr/tesseract/wiki/Downloads,下載Windows installer of tesseract-ocr 3.02.02 (including English language data)的安裝文件,進(jìn)行安裝。
(4)安裝語(yǔ)言包,在https://github.com/tesseract-ocr/tessdata下載chi_sim.traineddata簡(jiǎn)體中文語(yǔ)言包,放到安裝的Tesseract OCR目標(biāo)下的tessdata文件夾內(nèi),用來(lái)識(shí)別簡(jiǎn)體中文。
(5)修改C:\Python27\Lib\site-packages\pytesser_v0.0.1下的pytesser.py的函數(shù),將原來(lái)的image_to_string函數(shù)增加語(yǔ)音選擇參數(shù)language,language='chi_sim'就可以用來(lái)識(shí)別中文,默認(rèn)為eng英文。
改好后的pytesser.py:
"""OCR in Python using the Tesseract engine from Google http://code.google.com/p/pytesser/ by Michael J.T. O'Kelly V 0.0.1, 3/10/07""" import Image import subprocess import util import errors tesseract_exe_name = 'tesseract' # Name of executable to be called at command line scratch_image_name = "temp.bmp" # This file must be .bmp or other Tesseract-compatible format scratch_text_name_root = "temp" # Leave out the .txt extension cleanup_scratch_flag = True # Temporary files cleaned up after OCR operation def call_tesseract(input_filename, output_filename, language): """Calls external tesseract.exe on input file (restrictions on types), outputting output_filename+'txt'""" args = [tesseract_exe_name, input_filename, output_filename, "-l", language] proc = subprocess.Popen(args) retcode = proc.wait() if retcode!=0: errors.check_for_errors() def image_to_string(im, cleanup = cleanup_scratch_flag, language = "eng"): """Converts im to file, applies tesseract, and fetches resulting text. If cleanup=True, delete scratch files after operation.""" try: util.image_to_scratch(im, scratch_image_name) call_tesseract(scratch_image_name, scratch_text_name_root,language) text = util.retrieve_text(scratch_text_name_root) finally: if cleanup: util.perform_cleanup(scratch_image_name, scratch_text_name_root) return text def image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True, language = "eng"): """Applies tesseract to filename; or, if image is incompatible and graceful_errors=True, converts to compatible format and then applies tesseract. Fetches resulting text. If cleanup=True, delete scratch files after operation.""" try: try: call_tesseract(filename, scratch_text_name_root, language) text = util.retrieve_text(scratch_text_name_root) except errors.Tesser_General_Exception: if graceful_errors: im = Image.open(filename) text = image_to_string(im, cleanup) else: raise finally: if cleanup: util.perform_cleanup(scratch_image_name, scratch_text_name_root) return text if __name__=='__main__': im = Image.open('phototest.tif') text = image_to_string(im) print text try: text = image_file_to_string('fnord.tif', graceful_errors=False) except errors.Tesser_General_Exception, value: print "fnord.tif is incompatible filetype. Try graceful_errors=True" print value text = image_file_to_string('fnord.tif', graceful_errors=True) print "fnord.tif contents:", text text = image_file_to_string('fonts_test.png', graceful_errors=True) print text
(6)安裝autopy,下載地址:https://pypi.python.org/pypi/autopy,下載autopy-0.51.win32-py2.7.exe進(jìn)行安裝,用來(lái)模擬鼠標(biāo)操作。
說(shuō)下程序的思路:
1. 首先是通過(guò)模擬器在WINDOWS下執(zhí)行安卓的程序,然后用PicPick進(jìn)行截圖,將戰(zhàn)斗畫面中需要用到的區(qū)域進(jìn)行測(cè)量,記錄下具體在屏幕上的位置區(qū)域,用圖中1來(lái)判斷戰(zhàn)斗是否開(kāi)始(保存下來(lái)用作比對(duì)),用2,3,4,5,6的區(qū)域抓取識(shí)別成文字。
計(jì)算圖片指紋的程序:
def get_hash(self, img): #計(jì)算圖片的hash值 image = img.convert("L") pixels = list(image.getdata()) avg = sum(pixels) / len(pixels) return "".join(map(lambda p : "1" if p > avg else "0", pixels))
圖片識(shí)別成字符:
#識(shí)別出對(duì)應(yīng)位置圖像成字符,把字符交給chose處理 def getWordMeaning(self): pic_up = ImageGrab.grab((480,350, 480+300, 350+66)) pic_aws1 = ImageGrab.grab((463,456, 463+362, 456+45)) pic_aws2 = ImageGrab.grab((463,530, 463+362, 530+45)) pic_aws3 = ImageGrab.grab((463,601, 463+362, 601+45)) pic_aws4 = ImageGrab.grab((463,673, 463+362, 673+45)) str_up = image_to_string(pic_up).strip().lower() #判斷當(dāng)前單詞和上次識(shí)別單詞相同,就不繼續(xù)識(shí)別 if str_up <> self.lastWord: #如果題目單詞是英文,選項(xiàng)按中文進(jìn)行識(shí)別 if str_up.isalpha(): eng_up = self.dt[str_up].decode('gbk') if self.dt.has_key(str_up) else '' chs1 = image_to_string(pic_aws1, language='chi_sim').decode('utf-8').strip() chs2 = image_to_string(pic_aws2, language='chi_sim').decode('utf-8').strip() chs3 = image_to_string(pic_aws3, language='chi_sim').decode('utf-8').strip() chs4 = image_to_string(pic_aws4, language='chi_sim').decode('utf-8').strip() print str_up, ':', eng_up self.chose(eng_up, (chs1, chs2, chs3, chs4)) #如果題目單詞是中文,選項(xiàng)按英文進(jìn)行識(shí)別 else: chs_up = image_to_string(pic_up, language='chi_sim').decode('utf-8').strip() eng1 = image_to_string(pic_aws1).strip() eng2 = image_to_string(pic_aws2).strip() eng3 = image_to_string(pic_aws3).strip() eng4 = image_to_string(pic_aws4).strip() e2c1 = self.dt[eng1].decode('gbk') if self.dt.has_key(eng1) else '' e2c2 = self.dt[eng2].decode('gbk') if self.dt.has_key(eng2) else '' e2c3 = self.dt[eng3].decode('gbk') if self.dt.has_key(eng3) else '' e2c4 = self.dt[eng4].decode('gbk') if self.dt.has_key(eng4) else '' print chs_up self.chose(chs_up, (e2c1, e2c2, e2c3, e2c4)) self.lastWord = str_up return str_up
2. 對(duì)于1位置的圖片提前截一個(gè)保存下來(lái),然后通過(guò)計(jì)算當(dāng)前畫面和保存下來(lái)的圖片的距離,判斷如果小于40的就表示已經(jīng)到了選擇界面,然后識(shí)別2,3,4,5,6成字符,判斷如果2位置識(shí)別成英文字符的,就用2解析出來(lái)的英文在字典中獲取中文意思,然后再通過(guò)2的中文意思和3,4,5,6文字進(jìn)行匹配,匹配上漢字最多的就做選擇,如果匹配不上默認(rèn)返回最后一個(gè)。之前本來(lái)考慮是用Fuzzywuzzy來(lái)進(jìn)行模糊匹配算相似度的,不過(guò)后來(lái)測(cè)試了下對(duì)于中文匹配的效果不好,就改成按漢字單個(gè)進(jìn)行匹配計(jì)算相似度。
匹配文字進(jìn)行選擇:
#根據(jù)傳入的題目和選項(xiàng)進(jìn)行匹配選擇 def chose(self, g, chs_list): j, max_score = -1, 0 same_list = None #替換掉題目里的特殊字符 re_list = [u'~', u',', u'.', u';', u' ', u'a', u'V', u'v', u'i', u'n', u'【', u')', u'_', u'W', u'd', u'j', u'-', u't'] for i in re_list: g = g.replace(i, '') print type(g) #判斷2個(gè)字符串中相同字符,相同字符最多的為最佳答案 for i, chsWord in enumerate(chs_list): print type(chsWord) l = [x for x in g if x in chsWord and len(x)>0] score = len(l) if l else 0 if score > max_score: max_score = score j = i same_list = l #如果沒(méi)有匹配上默認(rèn)選最后一個(gè) if j ==-1: print '1. %s; 2. %s; 3. %s; 4. %s; Not found choice.' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3]) else: print '1. %s; 2. %s; 3. %s; 4. %s; choice: %s' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3], chs_list[j]) for k, v in enumerate(same_list): print str(k) + '.' + v, order = j + 1 self.mouseMove(order) return order
3.最后通過(guò)mouseMove調(diào)用autopy操作鼠標(biāo)點(diǎn)擊對(duì)應(yīng)位置進(jìn)行選擇。
程序運(yùn)行的錄像:http://v.youku.com/v_show/id_XMTYxNTAzMDUwNA==.html
程序完成后使用正常,因?yàn)閳D片識(shí)別準(zhǔn)確率和字典的問(wèn)題,正確率約為70%左右,效果還是比較滿意。程序總體來(lái)說(shuō)比較簡(jiǎn)單,做出來(lái)也就是純粹娛樂(lè)一下,串聯(lián)使用了圖片識(shí)別、中文模糊匹配、鼠標(biāo)模擬操作,算是個(gè)簡(jiǎn)單的小外掛吧,源程序和用到的文件如下:
http://git.oschina.net/highroom/My-Project/tree/master/Word%20Hero
關(guān)于“怎么使用Python寫安卓游戲外掛的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。