一、写在前面
有人说按键精灵无所不能,有人说这就是个连点器,且让我来研究一番,看看只在学校学过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 命令大全