天天看點

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

【按鍵精靈學習記錄】以DOTA2人機為例

  • 一、寫在前面
  • 二、準備工作
    • 1.環境準備
    • 2.需求分析
    • 3.流程圖
  • 三、代碼實作
    • 1.指令分析
    • 2.代碼實作
      • 狀态判斷
      • 主循環
      • 英雄選擇
      • 遊戲中
    • 3.實測
  • 四、總結

一、寫在前面

有人說按鍵精靈無所不能,有人說這就是個連點器,且讓我來研究一番,看看隻在學校學過c語言的我能不能用上它。

二、準備工作

1.環境準備

安裝按鍵精靈并不複雜,直接搜尋按鍵精靈,在官網下載下傳即可,我用的是按鍵精靈pc端。(不同版本的指令似乎有所不同)

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

2.需求分析

咱首先得知道需求是什麼,要實作什麼。用按鍵精靈當然是要解放雙手啦,以DOTA2人機為例那就是全自動,自動找比賽自動選英雄,自動刷錢打架買裝備放技能,然後打完了自動下一把…太複雜的估計我這一時半會也實作不了,那麼小目标就是不被系統判挂機就行。

3.流程圖

目标明确了,我們就要去實作它,而一個好的流程圖,會給你很大的幫助。

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結
【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結
【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結
【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

三、代碼實作

1.指令分析

我一看就知道現在該開始比對或者是該選英雄,但是電腦它不知道,要想讓腳本“自動”起來,咱得讓他知道目前是個什麼狀态,來看指令庫:

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

遊戲中大部分東西是動态的,不太好判斷,但是必然有一些東西可以作為某個狀态獨一無二的标志,比如:

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

又比如:

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

是以我選擇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
           

我們把狀态判斷放到一個單獨的函數裡,便于調用,函數指令在指令清單的控制指令中。

要獲得想要的點的坐标,用按鍵精靈自帶的抓抓工具:

【按鍵精靈學習記錄】以DOTA2人機為例一、寫在前面二、準備工作三、代碼實作四、總結

獲得了坐标後,用按鍵精靈自帶的指令列印出指定點顔色(或許有更友善的方法,可是我沒找到),代碼如下:

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 指令大全

繼續閱讀