python遊戲輔助工具庫
玩過電腦遊戲的同學對於外掛肯定不陌生,但是你在用外掛的時候有沒有想過如何做一個外掛呢?(當然用外掛不是那麼道義哈,呵呵),那我們就來看一下如何用python來製作一個外掛。。。。
我打開了4399小遊戲網,點開了一個不知名的遊戲,唔,做壽司的,有材料在一邊,客人過來後說出他們的要求,你按照選單做好端給他便好~ 為啥這麼有難度?8種菜單記不清,點點就點錯,滑鼠還不好使肌肉勞損啥的傷不起啊……
首先要宣告,這裡的遊戲外掛的概念,和那些大型網遊裡的外掛可不同,不能自動打怪,不能喝藥不能躲避GM…… 那做這個外掛有啥用?問的好,沒用,除了可以浪費你一點時間,提高一下程式設計技術,增加一點點點點點點的做外掛的基礎以外,毫無用處,如果您是以製作一個驚天地泣鬼神不開則已一開立刻超神的外掛為目標過來的話,恐怕要讓您失望了,請及早繞道。我的目的很簡單,就是自動玩這款小遊戲而已。
工具的準備
需要安裝autopy和PIL以及pywin32包。autopy是一個自動化操作的python庫,可以模擬一些滑鼠、鍵盤事件,還能對螢幕進行訪問,本來我想用win32api來模擬輸入事件的,發現這個用起來比較簡單,最厲害的是它是跨平臺的,請搜尋安裝;而PIL那是大名鼎鼎了,Python影象處理的No.1,下面會說明用它來做什麼;pywin32其實不是必須的,但是為了方便(滑鼠它在自己動著呢,如何結束它呢),還是建議安裝一下,哦對了,我是在win平臺上做的,外掛大概只有windows使用者需要吧?
截圖和影象處理工具
截圖是獲取遊戲影象以供分析遊戲提示,其實沒有專門的工具直接Print Screen貼上到影象處理工具裡也可以。我用的是PicPick,相當好用,而且個人使用者是免費的;而影象處理則是為了獲取各種資訊的,我們要用它得到點菜影象後儲存起來,供外掛分析判斷。我用的是PhotoShop… 不要告訴Adobe,其實PicPick中自帶的影象編輯器也足夠了,只要能檢視影象座標和剪貼圖片就好餓了,只不過我習慣PS了~
編輯器
這個我就不用說了吧,寫程式碼得要個編輯器啊!俺用VIM,您若願意用寫字板也可以……
原理分析
外掛的歷史啥的我不想說啦,有興趣請谷歌或度娘(注:非技術問題儘可以百度)。
看這個遊戲,有8種菜,每種菜都有固定的做法,顧客一旦坐下來,頭頂上就會有一個圖片,看圖片就知道他想要點什麼菜,點選左邊原料區域,然後點選一下……不知道叫什麼,像個竹簡一樣的東西,菜就做完了,然後把做好的食物拖拽到客戶面前就好了。
顧客頭上顯示圖片的位置是固定的,總共也只有四個位置,我們可以逐一分析,而原料的位置也是固定的,每種菜的做法更是清清楚楚,這樣一來我們完全可以判斷,程式可以很好的幫我們做出一份一份的佳餚並奉上,於是錢滾滾的來:)
autopy介紹
github上有一篇很不錯的入門文章,雖然是英文但是很簡單,不過我還是摘幾個這次用得到的說明一下,以顯示我很勤勞。
移動滑鼠
1 2 3 |
import autopy
autopy.mouse.move( 100 , 100 ) # 移動滑鼠
autopy.mouse.smooth_move( 400 , 400 ) # 平滑移動滑鼠(上面那個是瞬間的)
|
這個命令會讓滑鼠迅速移動到指定螢幕座標,你知道什麼是螢幕座標的吧,左上角是(0,0),然後向右向下遞增,所以1024×768螢幕的右下角座標是……你猜對了,是(1023,767)。
不過有些不幸的,如果你實際用一下這個命令,然後用autopy.mouse.get_pos()獲得一下當前座標,發現它並不在(100,100)上,而是更小一些,比如我的機器上是(97,99),和解析度有關。這個移動是使用者了和windows中mouse_event函式,若不清楚api的,知道這回事就好了,就是這個座標不是很精確的。像我一樣很好奇的,可以去讀一下autopy的原始碼,我發現他計算絕對座標演算法有問題:
1 |
point.x * = 0xFFFF / GetSystemMetrics(SM_CXSCREEN);
|
這裡先做除法再做乘法,學過一點計算方法的就應該知道對於整數運算,應該先乘再除的,否則就會產生比較大的誤差,如果他寫成:
1 |
point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);
|
就會準多了,雖然理論上會慢一點點,不過我也懶得改程式碼重新編譯了,差幾個畫素,這裡對我們影響不大~咱要吸取教訓呀。
點選滑鼠
1 2 3 4 5 6 |
#引入autopy模組
# ***
import autopy
autopy.mouse.click() # 單擊
autopy.mouse.toggle( True ) # 按下左鍵
autopy.mouse.toggle( False ) # 鬆開左鍵
|
這個比較簡單,不過記得這裡的操作都是非常非常快的,有可能遊戲還沒反應過來呢,你就完成了,於是失敗了…… 所以必要的時候,請sleep一小會兒。