玩過電腦游戲的同學對於外掛肯定不陌生,但是你在用外掛的時候有沒有想過如何做一個外掛呢?(當然用外掛不是那么道義哈,呵呵),那我們就來看一下如何用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一小會兒。