【按鍵精靈學習記錄】以DOTA2人機為例
- 一、寫在前面
- 二、準備工作
-
- 1.環境準備
- 2.需求分析
- 3.流程圖
- 三、代碼實作
-
- 1.指令分析
- 2.代碼實作
-
- 狀态判斷
- 主循環
- 英雄選擇
- 遊戲中
- 3.實測
- 四、總結
一、寫在前面
有人說按鍵精靈無所不能,有人說這就是個連點器,且讓我來研究一番,看看隻在學校學過c語言的我能不能用上它。
二、準備工作
1.環境準備
安裝按鍵精靈并不複雜,直接搜尋按鍵精靈,在官網下載下傳即可,我用的是按鍵精靈pc端。(不同版本的指令似乎有所不同)
2.需求分析
咱首先得知道需求是什麼,要實作什麼。用按鍵精靈當然是要解放雙手啦,以DOTA2人機為例那就是全自動,自動找比賽自動選英雄,自動刷錢打架買裝備放技能,然後打完了自動下一把…太複雜的估計我這一時半會也實作不了,那麼小目标就是不被系統判挂機就行。
3.流程圖
目标明确了,我們就要去實作它,而一個好的流程圖,會給你很大的幫助。
三、代碼實作
1.指令分析
我一看就知道現在該開始比對或者是該選英雄,但是電腦它不知道,要想讓腳本“自動”起來,咱得讓他知道目前是個什麼狀态,來看指令庫:
遊戲中大部分東西是動态的,不太好判斷,但是必然有一些東西可以作為某個狀态獨一無二的标志,比如:
又比如:
是以我選擇IfColor指令,當那幾個點顔色判斷成功,就認為它是相應的狀态。
其他指令我們主要用到while、if、function、Global等,還有一些按鍵指令,都很簡單,指令清單内都有舉例說明。
2.代碼實作
狀态判斷
代碼如下:
//主菜單判斷
IfColor 1550, 1020, "497A44", 0 Then
IfColor 1600,1050,"415833",0 Then
IfColor 1820,1020,"50844A",0 Then
status_flag=1
Exit Function
End If
End If
End If
//尋找比賽判斷
IfColor 1843, 1034, "020639", 0 Then
IfColor 1830,1034,"223FA6",0 Then
IfColor 1860,1050,"191E60",0 Then
status_flag=2
Exit Function
End If
End If
End If
//接受比賽判斷
IfColor 860, 520, "4C5C3C", 0 Then
IfColor 960,520,"596E44",0 Then
IfColor 1030, 520, "51623E", 0 Then
status_flag=3
Exit Function
End If
End If
End If
我們把狀态判斷放到一個單獨的函數裡,便于調用,函數指令在指令清單的控制指令中。
要獲得想要的點的坐标,用按鍵精靈自帶的抓抓工具:
獲得了坐标後,用按鍵精靈自帶的指令列印出指定點顔色(或許有更友善的方法,可是我沒找到),代碼如下:
i = 0
While i = 0
GetColor = GetPixelColor(135, 600)
Msgbox GetColor
Delay 1000
Wend
主循環
解決了判斷狀态的問題,我們就可以來建構主循環了,用慣了c語言的while(1),按鍵精靈這個死循環看着好尬。主循環架構如下:
i = 0
While i = 0
Call status() //判斷狀态,調用狀态判斷函數
//當處于主菜單時,點選開始DOTA 需預先選擇好比對的模式
If status_flag=1 Then
MoveTo 1600, 1050 //開始DOTA
Delay 200
LeftClick 1
Delay 1000
LeftClick 1
End If
//當正在尋找比賽中
If status_flag = 2 Then
//什麼都不需要做
End If
//當比對到了等待接受
If status_flag = 3 Then
Delay 200
MoveTo 960, 520 //接受比賽
Delay 200
LeftClick 1
End If
//選擇英雄階段
If status_flag=4 Then
//調用選擇英雄函數
End If
//如果在遊戲中
If status_flag=5 Then
//調用遊戲中函數
gaming_tick=gaming_tick+1//遊戲中計時節拍數
End If
//如果在遊戲結束界面
If status_flag = 6 Then
MoveTo 960, 900//“繼續”
Delay 200
LeftClick 1
gaming_tick=0//清零遊戲計時節拍數
End If
Delay 6000//主節拍 6s
Wend
實際上用switch-case應該更好一點(哦不對,在這裡應該叫select-case),但是我還是習慣用if,無限if它不香嗎。
英雄選擇
英雄選擇部分代碼如下:
If choice_flag = 0 Then //優先選擇幽鬼
MoveTo 975, 455//幽鬼
Delay 200
LeftClick 1
MoveTo 1440, 820//确認
Delay 200
LeftClick 1
ElseIf choice_flag = 1 Then //沒有幽鬼選宙斯
MoveTo 415, 653//
Delay 200
LeftClick 1
MoveTo 1440, 820
Delay 200
LeftClick 1
Else //沒有宙斯選先知
MoveTo 206,651 //
Delay 200
LeftClick 1
MoveTo 1440, 820
Delay 200
LeftClick 1
End If
choice_flag=choice_flag+1
我這裡是按照優先級選英雄,高優先級的沒選到才會選次優先級的英雄,如果有需要也可以寫成随機選擇預設好的英雄。當然,選擇英雄之後應該給一個标記,标記選擇了什麼英雄,以便後續遊戲中放技能的判斷。
遊戲中
遊戲中部分是本程式的核心所在,也是最自由的地方,在這裡你可以盡情的發揮你的想象,要做什麼都可以,你甚至可以給每一個預設的英雄一套獨立的行為方式,唯一的限制就是不要被判!挂!機!
英雄幽鬼的部分活動代碼如下:
If gaming_tick = 0 Then
//如果是剛進入遊戲,把要購買的裝備添加到快速購買
MoveTo 1750, 1050//移動到商店
Delay 170
LeftClick 1
Delay 281
MoveTo 1690, 126//移動到更新物品
Delay 212
LeftClick 1
Delay 256
KeyDown 17, 1//按下ctrl
Delay 102
KeyDown 16, 1//按下shift
Delay 112
MoveTo 1600, 220//假腿
Delay 34
LeftClick 1
Delay 142
MoveTo 1645, 190//系帶
Delay 26
LeftClick 1
Delay 89
MoveTo 1840, 365//刃甲
Delay 46
LeftClick 1
Delay 138
MoveTo 1841,577//三十
Delay 56
LeftClick 1
Delay 117
MoveTo 1890, 225//戰鼓
Delay 56
LeftClick 1
Delay 117
MoveTo 1600, 440//紫苑
Delay 46
LeftClick 1
Delay 92
KeyUp 17, 1//彈起ctrl
Delay 37
KeyUp 16, 1//彈起shift
Delay 244
ElseIf gaming_flag < 100 Then //遊戲前十分鐘左右對線時間
call on_up_line() //調用占上路線函數
Else //遊戲十分鐘後
call farm_1() //調用第一套打野動作
End If //可以再加一段時間後推塔結束比賽的動作
//每次循環嘗試買裝備
MoveTo 1690, 970//快速購買 //可以使用快速購買鍵
Delay 47
RightClick 1
Delay 22
RightClick 1
Delay 37
MoveTo 1890,1050//信使
Delay 59
LeftClick 1 //信使運送物品
Delay 59
MoveTo 960, 120//随便點一下關閉商店
Delay 59
LeftClick 1
//每次循環檢查血量,血量不健康直接tp
IfColor 841, 1031, "11291E", 0 Then //檢查是否殘血
MoveTo 1313, 1045//tp
Delay 46
LeftClick 1
Delay 17
LeftClick 1
Delay 35
End If
//每次循環檢測是否可以更新技能,優先級由高到低
IfColor 1075, 925, "B5E6F5", 0 Then //
MoveTo 1075, 925//大招
Delay 46
LeftClick 1
Delay 35
End If
IfColor 960, 925, "5498AD", 0 Then
MoveTo 960, 925//3
Delay 46
LeftClick 1
Delay 35
End If
IfColor 900, 925, "5293A7", 0 Then
MoveTo 900, 925//2
Delay 46
LeftClick 1
Delay 35
End If
IfColor 850, 925, "5193A7", 0 Then
MoveTo 860, 925//1
Delay 46
LeftClick 1
Delay 35
End If
//每輪按一下大招,有大就放
KeyPress 71, 1//G
其中占線和打野該怎麼活動是個見仁見智的問題,其中代碼大多重複且冗長,我就不貼出來束縛各位的想象力了。
3.實測
經連續兩小時實測,以上代碼能夠運作在1920/1080分辨率的電腦上,能夠實作自動人機,我們的小目标可以說基本達成。之是以說是基本,因為其中沒有異常處理部分,比如:
1.彈窗,QQ消息等擋住了判定狀态的關鍵部分,導緻判斷不出狀态,無限空循環。
2.被人針對,打野路線上野怪全被隊友封了,如果超過五分鐘沒有察覺,很容易被判挂機。
……
四、總結
1.通過本次學習,我們可以發現按鍵精靈幾乎不需要任何語言基礎,它可以支援中文堆積木式程式設計,是以會不會用,完全在于你想不想用。
2.在每兩次按鍵操作之間必須要加入delay延時,連續的操作幾乎都不會成功,延時太短也不行。
3.需要寫一部分類似看門狗的代碼,用于處理異常狀态,當然意外總是出人意料,長時間運作的腳本總是需要定時檢查,說不定什麼時候程式他就挂了呢。
4.本文僅用于記錄按鍵精靈學習過程,不作他用。
參考文獻
https://zhuanlan.zhihu.com/p/46733717 按鍵精靈随機數
https://wenku.baidu.com/view/c6881d84852458fb760b5622.html 按鍵碼
http://zy.anjian.com/?action-model-name-qmdn-itemid-248 指令大全