1.关于本文
仙侠道自动拔剑工具是为了节省仙侠道的拔剑时间而设计的自动化工具。虽然有非常好用的《仙仙助手》辅助工具,但该辅助工具被系统检测到后会锁定玩家体力,因此我用按键精灵制作了一个拔剑工具,自动拔剑以节省时间。本工具通过识别画面指定点位的颜色来确定应不应该拔剑,今天(2014年5月28日)的仙侠道版本是R38,如果要使用本工具,复制代码后请仔细校对一遍计算出的各点坐标。
2.实现自动拔剑的方法
下图是剑山拔剑的一张图,取左上角的剑字中的一个像素为原点,计算出其他点的偏移量。每次拔剑都从高到低扫描,遇到能拔的剑就直接拔起,延迟一段时间后开始下一轮扫描。
剑字原点的寻找方法如下图所示(x:50 y:144 的那张,颜色为405D69)
在游戏中的拔剑规则为:第一次拔剑从败亡铁剑开始,每次拔一把剑,每次拔剑中,有小概率可以在下次拔更高等级的剑,否则下次能且只能拔败亡铁剑。
本脚本的拔剑策略为:每次拔剑从最高等级的剑向最低等级的剑扫描,拔等级最高的剑(也就是遇到的第一个能拔的剑)。等级最高的可拔剑上方会有黄色标记,通过该标记判断当前哪个剑可拔。
3.相关控件
刚进入程序的时候需要先单击“寻找坐标”,系统自动搜索到“剑”字的原点,并确定拔各个剑需要判断的点位。
4.脚本源码
'神仙道 剑山拔剑 自动脚本
'标记点:该拔到哪个剑时,该剑上面的标记颜色 x,y
'从1-5依次是 铁阔魔宝神 五种类型的剑
Dim signx1, signx2, signx3, signx4, signx5
Dim signy1, signy2, signy3, signy4, signy5
Dim drawx1, drawx2, drawx3, drawx4, drawx5
Dim drawy1, drawy2, drawy3, drawy4, drawy5
'事件:单击“寻找坐标”按钮
Event frmDraw.btnSearch.Click
'“剑”字左上角,撇横之间的一个暗色
Dim x, y
'找到颜色为 "405D69" 的点
FindColor 0, 0, 1000, 500, "405D69", x, y
'再次确认点(x,y)就是要找的点
If GetPixelColor(x - 2, y) <> "060606" Then
MsgBox "定位失败"
Exit Event
End If
If GetPixelColor(x + 1, y) <> "79B1C9" Then
MsgBox "定位失败"
Exit Event
End If
'MoveTo x, y
'败亡铁剑
signx1 = x + 85
signy1 = y + 327
drawx1 = x + 94
drawy1 = y + 371
'败亡阔剑
signx2 = x + 220
signy2 = y + 254
drawx2 = x + 216
drawy2 = y + 317
'败亡魔剑
signx3 = x + 339
signy3 = y + 194
drawx3 = x + 323
drawy3 = y + 258
'败亡宝剑
signx4 = x + 97
signy4 = y + 144
drawx4 = x + 112
drawy4 = y + 206
'败亡神剑
signx5 = x + 201
signy5 = y + 5
drawx5 = x + 208
drawy5 = y + 81
MsgBox "坐标寻找完毕,可以开始拔剑了"
'坐标寻找完毕,可以开始拔剑了
'下面这句话要写两次,具体原因我也不知道。。。
frmDraw.btnDraw.Enabled = True
frmDraw.btnDraw.Enabled = True
'初始化随机数生成器
Randomize
End Event
'事件:单击“开始拔剑”按钮
Event frmDraw.btnDraw.Click
Dim counter
counter = frmDraw.ipbCount.Text
'开始拔剑,次数由输入框 frmDraw.ipbCount 指定
Do
'从高级剑开始检测,如果哪个剑上方有黄色标识则拔起该剑
If GetPixelColor(signx5, signy5) = "00C7FA" Then
MoveTo drawx5, drawy5
LeftClick 1
Goto COMPLETE
End If
If GetPixelColor(signx4, signy4) = "00C7FA" Then
MoveTo drawx4, drawy4
LeftClick 1
Goto COMPLETE
End If
If GetPixelColor(signx3, signy3) = "00C7FA" Then
MoveTo drawx3, drawy3
LeftClick 1
Goto COMPLETE
End If
If GetPixelColor(signx2, signy2) = "00C7FA" Then
MoveTo drawx2, drawy2
LeftClick 1
Goto COMPLETE
End If
If GetPixelColor(signx1, signy1) = "00C7FA" Then
MoveTo drawx1, drawy1
LeftClick 1
Goto COMPLETE
End If
Rem COMPLETE
'延时一个随机的时间(1-2秒)
Delay 1000 + Int((1000 * Rnd) + 1)
counter = counter - 1
Loop Until counter = 0
MsgBox "拔剑完毕!"
End Event
END