python游戏自动化实战--游戏辅助软件冰山后的秘密
文章目錄
- 前言
- 游戲輔助常用方法總結
- 連續點擊腳本
- 實現思路
- 獲取窗口句柄
- 大漠插件
- 坐標獲取
- 編寫自動化腳本
- 最終效果
- 自動吃符咒
- 實現思路
- 符咒圖像截取
- 編寫自動化腳本
- 最終效果
- 人物是否移動
- 實現思路
- 編寫自動化腳本
- 最終效果
- 血量低自動吃藥
- 編寫自動化腳本
- 最終效果
- 總結
最終腳本 github:https://github.com/tdx1997tdx/kungfu_script
前言
本文記一次用python制作win10游戲輔助制作的實踐,總結一些制作輔助常用的手段。為啥做輔助去了?這要從周末打游戲的時候說起。終于升級到90級了,可以去“考古”了,然而考古的過程枯燥無味,基本上就是重復以下過程:
可以看到,考古的過程的固定的模式。受到工作中自動化測試的啟發,為什么不能將這一過程自動化呢?經過深思熟慮,總結了一下這個過程中可能遇到的難點:
面對考古出來極品神裝與元寶的誘惑,面對游戲輔助背后的秘密,面對擺在面前的“業余界難題”,強烈的好奇心讓我踏上探索的征程。
游戲輔助常用方法總結
經過查找資料與探索,要完成這一系列自動化操作,需要用到的技術點有:
連續點擊腳本
秉著業務驅動技術的思想,我們先從最簡單的需求開始。
需求:已知游戲界面如下,想要實現的需求,每隔1s重復打開關閉背包。
紅框地方是背包按鈕
實現思路
要想實現以上功能,需要以下幾步:
獲取窗口句柄
要想實現一邊瀏覽網頁一邊運行后臺腳本,就需要定位游戲所在的窗口句柄,所謂窗口句柄可以理解成窗口的uuid。
要獲取窗口句柄值,這邊用到了《按鍵抓抓輔助工具》
將其拖動到指定窗口就可以獲取到指定窗口的句柄值。
大漠插件
大漠綜合插件(dm.dll)采用vc6.0編寫,是一款集前后臺,文字識別,圖色,鍵鼠,窗口,內存,DX,Call等功能于一身的綜合插件。主要用于按鍵精靈、簡單游、易語言等輔助制作工具,具有識別速度超級快的特點! 采用COM接口編寫,適用于所有語言調用。
下載后注冊大漠插件,用于python調用
坐標獲取
《按鍵抓抓輔助工具》可以獲取窗口內背包的相對坐標
編寫自動化腳本
由《按鍵抓抓輔助工具》得到游戲窗口句柄值為2297008
可以用以下python代碼實現
BindWindow,MoveTo,LeftClick方法可以查詢大漠文檔獲取使用方法。
至此hello world需求就已經實現,展示效果如下
最終效果
自動吃符咒
需求:以下是游戲界面,紅框是符咒,具有雙倍經驗的加成,限時1小時,1小時過去后要使用f12快捷鍵吃符咒。
實現思路
要想實現以上功能,最簡單的方法就是sleep 1小時,但是這么實現存在問題就是腳本啟動的時候不知道是不是吃了符咒。比較優雅的實現方式是用圖像識別的方式實現:
符咒圖像截取
《按鍵抓抓輔助工具》自帶圖像截取的功能,我們先將符咒圖片截取保存下來作為基準圖片。
首先需要截取指定窗口
獲取到符咒圖像后保存
符咒圖像就保存下來了
編寫自動化腳本
import win32com.client import time# 窗口句柄值 hwnd = 2297008 # 準備大漠插件 dm = win32com.client.Dispatch('dm.dmsoft') # 綁定窗口 dm.BindWindow(hwnd, "dx2", "windows", "windows", 0) # 識別區域 x1, y1, x2, y2 = 800, 180, 1020, 650 # 相似度 sim = 0.9 while 1:time.sleep(0.5)is_ok, x, y = dm.FindPic(x1, y1, x2, y2, 'D:\software\按鍵抓抓\screen\\fuzhou.bmp', "000000", sim, 0)if is_ok == -1:print("符咒失效")# 按f12dm.KeyPress(123)print("吃符咒")用到的接口如下:
123是f12的虛擬鍵碼,具體見:https://www.cnblogs.com/del/archive/2007/12/07/987364.html
最終效果
人物是否移動
需求:判斷游戲中人物是否移動
實現思路
紅框是坐標數值,如果該區域,在指定的時間內(秒),圖像數據一直不變,就說明靜止,否則就為移動
編寫自動化腳本
由《按鍵抓抓輔助工具》得到游戲坐標區域左上角和右下角坐標為(948, 156),(1017, 169)
import win32com.client import time# 窗口句柄值 hwnd = 2297008 # 準備大漠插件 dm = win32com.client.Dispatch('dm.dmsoft') # 綁定窗口 dm.BindWindow(hwnd, "dx2", "windows", "windows", 0) # 坐標區域 x1, y1, x2, y2 = 948, 156, 1017, 169 while 1:time.sleep(0.1)is_ok = dm.IsDisplayDead(x1, y1, x2, y2, 1)if is_ok == 0:print("移動中")else:print("靜止中")用到的接口如下:
最終效果
血量低自動吃藥
需求:判斷游戲血量是否健康,如果不健康,自動按f1吃藥
這個需求難點就是如何判斷血量是否健康,這邊使用這種方法實現:
看見游戲左上角血條了嗎,假如血條的30%的地方顏色由紅色轉為灰色,那么我們認為她血量不健康。
另一種方法是使用cheat engine讀取血量的內存地址,找到基地址直接讀內存,這個難度較高,有興趣的同學可以讀一下這個文章:https://www.cnblogs.com/gd-luojialin/p/7789569.html
編寫自動化腳本
import win32com.client import time# 窗口句柄值 hwnd = 2297008 # 準備大漠插件 dm = win32com.client.Dispatch('dm.dmsoft') # 綁定窗口 dm.BindWindow(hwnd, "dx2", "windows", "windows", 0)# 是否需要吃藥,如果 def is_eat_drug(dm):col = dm.GetColor(107, 65)if col[0] != "6" or col[2] != "3" or col[4] != "3":return Truereturn Falsewhile 1:time.sleep(1)res = is_eat_drug(dm)if res:print("需要吃藥了")else:print("血量健康")如果血量健康,107, 65坐標返回的顏色值為,663f3f,一旦不健康,就不是這個值了。
如何獲取某一點的顏色值呢,強大的《按鍵抓抓輔助工具》就可以解決
最終效果
總結
大漠插件還有很多好玩的功能,具體可以看看文檔,這些功能配合多線程就可以弄出強大的自動化輔助工具,想體驗的同學可以試試呀!
最終腳本 github:https://github.com/tdx1997tdx/kungfu_script
總結
以上是生活随笔為你收集整理的python游戏自动化实战--游戏辅助软件冰山后的秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php object oriented,
- 下一篇: rfid在高速公路管理中的应用_RFID