【按键精灵学习记录】以DOTA2人机为例

一、写在前面

有人说按键精灵无所不能,有人说这就是个连点器,且让我来研究一番,看看只在学校学过c语言的我能不能用上它。

二、准备工作

1.环境准备

安装按键精灵并不复杂,直接搜索按键精灵,在官网下载即可,我用的是按键精灵pc端。(不同版本的命令似乎有所不同)按键精灵

2.需求分析

咱首先得知道需求是什么,要实现什么。用按键精灵当然是要解放双手啦,以DOTA2人机为例那就是全自动,自动找比赛自动选英雄,自动刷钱打架买装备放技能,然后打完了自动下一把…太复杂的估计我这一时半会也实现不了,那么小目标就是不被系统判挂机就行。

3.流程图

目标明确了,我们就要去实现它,而一个好的流程图,会给你很大的帮助。
主循环
状态判断
英雄选择
游戏中

三、代码实现

1.命令分析

我一看就知道现在该开始匹配或者是该选英雄,但是电脑它不知道,要想让脚本“自动”起来,咱得让他知道当前是个什么状态,来看命令库:
命令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 命令大全

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值