前言
原标题为《三国高级辅助_v1.0》,按键精灵源代码可以在百度网盘(密码rrnx)下载到,可执行程序可以在百度网盘(密码v4gn)下载到,原1010说明文档已转移至wiki,此软件不再更新了,共有968次的下载,感谢。
《三国基础辅助_v1.0》转移至wiki,其代码可以在百度网盘(密码hovv)下载到,《三国基址完整版》转移至wiki,不再更新,共有904次的下载,感谢。
起因是我无聊又玩起了小时候没玩懂的QQ三国,真的是很古风很轻松的游戏,能让我完全放下戒备。到了一定等级之后,需要很好的装备才能刷野刷活动,于是开始氪金,然而发现这是个无底洞。三国提供了行脚的方式来发放三国币,没有那么多时间天天去跳行脚,所以用按键精灵写代码来跑,当然我没有修改任何数据,只是模拟键盘鼠标的操作而已。论坛可以参考的资料几乎为0,无从下手,终于得到了一些高人的指点才慢慢入门,我也把这些辛苦的宝贵经验和代码分享了出来,也得到了一些同学的肯定。
每次游戏更新都要耗费我大量的时间去重新找很多数据或者图像,在我暑假玩游戏兴趣正浓的时候没有感觉,当后面忙于学习之后,就发现这占用了我很多的时间和精力。由于只是个人娱乐性质,没有任何经济利益,当我不再想玩三国之后,每次更新都变成了一种煎熬……0.0.2.148版本之后,图形界面发生了很大变化,一些识图的代码需要重写,本来还策划了2.0,后来看看毕业设计的模型都还在Helloworld阶段,还有四个月就毕业了,能不能做出来还是个问号(当然我最后做出来了,效果还挺好),每天做梦都能梦见“还有两天考试啥都没复习”这种事情,于是就没再跟进了……然而会收到很多催更的邮件,包括实现一些其他功能,非常谢谢大家的关注,但是我真的无法把精力同时放在两边(我写毕设几乎每天10点30后才回寝室,而且跑的程序占满了CPU,风扇咔咔响,根本无法同时做其他事情),对于没有回复的同学说声抱歉。
前几天评论里又出现了催更,我准备最后再更新一次,但我发现vzl2.0已经不好用了,因为没有兴趣继续玩三国,所以也没有动力继续去寻找方法了。也许QQ三国会像之前超级好玩的防守浮空岛《英雄岛》一样,或者像充了很多个月粉钻养的即将在2018年9月15日停运的QQ宠物一样,在未来的某一天关服清数据,只能成为90后一代的美好回忆了吧。
在这里会保留之前的经验,基本原理是一样的,但是代码已经失效,再次重申,我没有修改任何数据,只是在本地模拟键盘鼠标的操作,和按键精灵的宗旨一样,而且没有赚取任何经济利益。欢迎关注我github上其他有趣的开源项目,比如用python爬取有用数据之类的东西,开源赛高~ 天涯未远,江湖再见。
交流代码和原理
找基址方法

在windows8下无法查看,但在windows XP SP3下能够查看一些数据,以0.0.2.130的登录基址为例吧:
【第1步】打开QQ三国,进入选线界面,用VZL附加三国进程
【第2步】找数值3(新扫描)
【第3步】随便选个线,进入输入帐号密码界面,找数值8(再次扫描)
【第4步】点“返回上层”返回选线界面,找数值3(再次扫描)
【第5步】只剩一个答案了,登录基址就是F76C10,吼吼~
又尝试了0.0.2.130版本的游戏基址,也能找了……
【第1步】附加进程
【第2步】去跳楼掉到半血
【第3步】搜寻血的数值,比如当前1000,那你就输入1003等血加到1003的瞬间开始搜索
【第4步】等血变化,“再次扫描”减少结果,发现只有这2个(或者3个)在随着血变化而变化
【第5步】选中第一个地址,点“↘Failed”将第一个地址拉下来,右键,“查找写入该地址的代码”
【第6步】发现和普通的+0c+338+8908不一样(其实这个地址也是能用的,不过要四级)
【第7步】重新拉第二个下来
【第8步】发现有了偏移量8908,那么谁存了esi=0X084BCA20的值呢?
【第9步】勾选HEX,搜寻值84BCA20
【第10步】拉取第一个,会发现同样不行(但其实可以,有兴趣自行探索),注意,从此以后右键选择的变成“查找访问该地址的代码”
【第11步】拉取第二个
【第12步】发现有了经典的+338,注意,从此以后右键选择的变成“查找访问该地址的代码”
【第13步】继续向前搜索,这次搜0X0621CDF8
【第14步】发现了06011C78,继续搜索0X06011C78
【第15步】发现了一个F开头的,而且右键“
以前用过的基址/内存地址及其查找方式(目前部分已失效!只是增加认识)
1、基址(游戏基址):F5FC74
说明
一般以F开头
查找方式
先去跳楼掉血,掉一半左右,然后在安全地方自动回血,不断地查找血数值改变的地址,直到找到一个地址有大量的关联地址,必为基地址。
2、登录基址:F6E140
查找方式
找变化数值:选线界面=3,输入帐号密码界面=8,验证码界面=9,选择角色=20,选中角色=15,进入游戏界面=21,退出保护等待=22
3、软件版本
4、读采集疲劳度
查找方式
挖矿时读取改变数值
Function 读采集疲劳度
读采集疲劳度 = dm.readint(hwnd, "[[[" & 基址 & "]+0xc]+0x338]+0xa8c0", 0)
End Function
5、读怪物ID
查找方式
记不太清了,好像有一个翠鸟的数值是21
Function 读怪物ID
读怪物ID=dm.readint(hwnd, "[[[[" & 基址 & "]+14]+a4]+8868]+0", 0)
End Function
6、读角色名字
查找方式
直接找找不到,我用的一个内存扫描软件搜索关键字找到的
Function 读角色名字
读角色名字 = dm.readString(hwnd, "[[["& 基址 &"]+c]+338]+8874",0,100)
End Function
7、读国家
Function 读国家
国 = dm.readint(hwnd, "[[[" & 基址 & "]+c]+338]+8918", 0)
If (国 = 1) Then
读国家 = "魏国"
ElseIf (国 = 2) Then
读国家 = "蜀国"
Else
读国家 = "吴国"
End If
End Function
8、读装备耐久
Function 读装备耐久(装备ID)
Dim 耐久偏移
If (装备ID = 1) Then//帽子
耐久偏移 = "344"
ElseIf (装备ID = 2) Then//项链
耐久偏移 = "34C"
ElseIf (装备ID = 3) Then//衣服
耐久偏移 = "354"
ElseIf (装备ID = 4) Then//护手
耐久偏移 = "35C"
ElseIf (装备ID = 5) Then//戒指
耐久偏移 = "36C"
ElseIf (装备ID = 6) Then//面具
耐久偏移 = "348"
ElseIf (装备ID = 7) Then//翅膀
耐久偏移 = "350"
ElseIf (装备ID = 8) Then//裤子
耐久偏移 = "358"
ElseIf (装备ID = 9) Then//鞋子
耐久偏移 = "360"
ElseIf (装备ID = 10) Then//武器
耐久偏移 = "368"
ElseIf (装备ID = 11) Then//符咒
耐久偏移 = "370"
ElseIf (装备ID = 12) Then
耐久偏移 = ""
End If
读装备耐久 = dm.readint(hwnd, "[[[" & 基址 & "]+38]+"& 耐久偏移 &"]+28", 0)
End Function
9、读装备耐久上限
Function 读装备耐久上限(装备ID)
Dim 耐久偏移
If (装备ID = 1) Then//帽子
耐久偏移 = "344"
ElseIf (装备ID = 2) Then//项链
耐久偏移 = "34C"
ElseIf (装备ID = 3) Then//衣服
耐久偏移 = "354"
ElseIf (装备ID = 4) Then//护手
耐久偏移 = "35C"
ElseIf (装备ID = 5) Then//戒指
耐久偏移 = "36C"
ElseIf (装备ID = 6) Then//面具
耐久偏移 = "348"
ElseIf (装备ID = 7) Then//翅膀
耐久偏移 = "350"
ElseIf (装备ID = 8) Then//裤子
耐久偏移 = "358"
ElseIf (装备ID = 9) Then//鞋子
耐久偏移 = "360"
ElseIf (装备ID = 10) Then//武器
耐久偏移 = "368"
ElseIf (装备ID = 11) Then//符咒
耐久偏移 = "370"
ElseIf (装备ID = 12) Then
耐久偏移 = ""
End If
读装备耐久上限 = dm.readint(hwnd, "[[[" & 基址 & "]+38]+"& 耐久偏移 &"]+2C", 0)
End Function
10、读背包物品数量
Function 读背包物品数量(物品ID)
//读背包物品数量 = dm.readint(hwnd, "[[[" & 基址 & "]+38]"&cstr(物品ID)&"]+28", 0)
读背包物品数量 = dm.readint(hwnd, "[[[[" & 基址 & "]+38]+47C]+"& (物品ID-1)*4 &"]+28", 0)
End Function
11、读摊位名字
Function 读摊位名字
读摊位名字 = dm.readString(hwnd, "[[["& 基址 &"]+90]+8]+7c",0,100)
End Function
12、读跳跃高度
Function 读摊主名字
读摊主名字 = dm.readString(hwnd, "[[["& 基址 &"]+90]+8]+5c",0,100)
End Function
13、读血量
Function 读血量()
读血量 = dm.readint(hwnd, "[[[" & 基址 & "]+0xc]+0x338]+0x8908", 0)
End Function
14、读蓝量
Function 读蓝量()
//读蓝量=dm.readint(hwnd, "[[[[["& 基址 &"]+0x14]+0xc4]+0]+0x08]+8904", 0)
读蓝量 = dm.readint(hwnd, "[[["& 基址 &"]+0xc]+0x338]+0x8904", 0) // +2c +08 +520
End Function
15、读活力
Function 读活力
读活力=dm.readint(hwnd, "[[["& 基址 &"]+0xc]+0x338]+0x9458", 0)
End Function
16、读地图ID
Function 读地图ID()
读地图ID=dm.ReadInt(hwnd, "[[[" & 基址 & "]+0xC]+0x334]+0x138", 0)
End Function
17、读对话状态
说明
一般有0,2,14,16之类代表不同对话深度的状态
Function 读对话状态()
读对话状态 = dm.readint(hwnd, "[["& 基址 &"]+20]+0", 0)
End Function
18、读行动状态
说明
静止2 跑4 跳16 攀爬8 攀爬停止32
Function 读行动状态()
读行动状态=dm.readint(hwnd, "[[["& 基址 &"]+0xc]+0x338]+0x228", 0)
End Function
19、读坐标X
说明
+C+338+18很多次版本更新都没有改变过了
Function 读坐标X()
读坐标X=dm.ReadInt(hwnd, "[[[" & 基址 & "]+C]+338]+18", 0)
End Function
20、读坐标Y
Function 读坐标Y()
读坐标y=dm.ReadInt(hwnd, "[[[" & 基址 & "]+C]+338]+44", 0)
End Function
21、读行动速度
Function 读行动速度()
读行动速度=dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+350", 0)
End Function
22、读人物状态
说明
静止1 攻击2 死亡4
Function 读人物状态()
读人物状态=dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+1FC", 0)
End Function
23、读行脚账单
Function 读行脚账单
读行脚账单=dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+8DFC", 0)
End Function
24、读五铢
Function 读五铢
读五铢 =dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+0x8df8", 0)
End Function
25、读三国币
Function 读三国币()
读三国币=dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+0x8DEC", 0)
End Function
26、读钱庄
Function 读钱庄
读钱庄 =dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+0x8df0", 0)
End Function
27、读人物等级
Function 读等级
读等级 =dm.readint(hwnd, "[[["& 基址 &"]+c]+338]+0x8A70", 0)
End Function
28、读登录状态
说明
登录界面选线是3 输入帐号密码是8 验证码=9 20选择角色 选中角色=15 进入是21 退出等待是22
Function 读登录状态
读登录状态 =dm.readint(hwnd, 登录基址, 0)
End Function
29、读服务器线路(非地址方式)
Function 读服务器线路()
标题 = dm.getwindowTitle(hwnd)
标题数组 = split(标题," ")
线路 = 标题数组(2)
线路数组 = split(线路, "线")
读服务器线路 = Cint(线路数组(0))
End Function
行脚设计思路
主要就是识别地图知道洞口在哪儿,然后按照do-{if.x<200 and y<200 then ....elseif x <200 and y >=200 then .....elseif 地图切换 then break}loop,这样不管掉到哪里都能走回正确的道路上。
1、在外面
Sub 脚本_行脚馆外()
Call 设置表格(行, 列_工作状态, "【行脚】行脚馆外")
dm.keypress (122)
dm.keypress (122)
Do
dm.keypress (39)
dm.keypress (37)
Delay 300
If 读地图ID() = 24 or 读地图ID() = 39 or 读地图ID = 112 Then
Call 脚本_对话_主城
ElseIf 读地图ID() = 34 or 读地图ID() = 52 or 读地图ID() = 126 Then
Call 脚本_对话_高级区
ElseIf 读地图ID() = 28 or 读地图ID() = 118 or 读地图ID() = 44 Then
Call 脚本_对话_郊外
End If
If 456 <= 读地图ID() and 读地图ID() <= 462 Then Exit Do
Delay 300
Loop
call 脚本_行脚商行馆入口
End Sub
2、进去了,识别洞口
Sub 脚本_行脚商行馆入口()
Dim 局_地图ID
Call 设置表格(行, 列_工作状态, "【行脚】行脚中")
局_地图ID = 读地图ID
If 是否错洞 = 1 and 已经完成次数 <> 0 Then
TracePrint "已经完成次数" & " " & 已经完成次数 & "错题频率" & " " & 错题频率
TracePrint "mod" & " " & ((已经完成次数+1) mod 错洞频率)
If ((已经完成次数+1) mod 错洞频率) = 0 Then
错洞进行状态 = 1
TracePrint "错洞进行中"
Call 设置表格(行, 列_工作状态, "【行脚】错洞中")
If 局_地图ID = 457 Then //是洞3,进4
Do
Call 行脚第一个位置
call 脚本_出口4()
If 错洞进行状态 = 2 and 读坐标Y() = 2180 Then Exit Do
TracePrint "洞3,错4"
Loop
Else //非洞3,进3
Do
Call 行脚第一个位置
call 脚本_出口3()
If 错洞进行状态 = 2 and 读坐标Y() = 2180 Then Exit Do
TracePrint "非洞3,错3"
Loop
End If
Call 设置表格(行, 列_工作状态, "【行脚】行脚中")
End If
End If
TracePrint "错洞完成"
Do
局_地图ID = 读地图ID
Call 行脚第一个位置
If 局_地图ID = 461 Then
TracePrint ("出口1")
Call 脚本_出口1()
ElseIf 局_地图ID = 458 Then
TracePrint ("出口2")
Call 脚本_出口2()
ElseIf 局_地图ID = 457 Then
TracePrint ("出口3")
Call 脚本_出口3()
ElseIf 局_地图ID = 460 Then
TracePrint ("出口4")
Call 脚本_出口4()
ElseIf 局_地图ID = 459 Then
TracePrint ("出口5")
Call 脚本_出口5()
ElseIf 局_地图ID = 456 Then
TracePrint ("出口6")
Call 脚本_出口6()
ElseIf 局_地图ID = 462 Then
TracePrint ("答题地图")
Call 释放按键
Call 脚本_行脚NPC答题
Exit do
End If
Loop
End Sub
3、规划路线,以洞6为例
Sub 脚本_出口6()
Dim x,y
x = 读坐标X()
y = 读坐标Y()
If y = 980 and x < 1995 and x >= 1640 Then
dm.keydown (39)
elseIf y = 980 and x >= 1995 and x <= 2050 Then
Call 右跳
ElseIf y = 900 and x < 2150 and x >= 2020 Then
dm.keydown (39)
ElseIf y = 900 and x >= 2150 and x <= 2190 Then
Call 右跳
elseIf y = 1050 and x <2160 and x>=1930 Then
dm.keydown (39)
ElseIf y = 1050 and x >= 2160 and x<=2200 Then
Call 右跳
ElseIf y = 970 and x < 2280 and x>= 2190 Then
dm.keydown (39)
ElseIf y = 970 and x >= 2280 and x<=2330 Then
Call 右跳
ElseIf y = 920 and x < 2330 and x>=2310 Then
dm.keydown (39)
ElseIf y = 920 and x >= 2330 and x<=2480 Then
Call 上跳
ElseIf y = 860 and x >= 2330 and x<=2510 Then
Call 上跳
ElseIf y = 820 and x>=2190 and x<=2830 Then
dm.keydown (39)
ElseIf y = 950 and x >= 2830 and x <= 3090 Then
dm.keydown (39)
ElseIf y = 950 and x > 3090 and x <= 3140 Then
Call 爬树左上
ElseIf y = 700 and x <= 3290 and x >= 3000 Then
dm.keydown (39)
ElseIf y = 700 and x <= 3550 and x > 3290 Then
dm.keydown (40)
dm.keydown (39)
ElseIf (y = 990 or y = 1090) and x >= 3490 and x < 3680 Then
dm.keydown (39)
ElseIf y = 1090 and x >= 3680 and x <= 3880 Then//防止下不去,from“行脚2.txt”
Call dm.keydown (39)
ElseIf (y = 3970 or y=3980 or y = 0) and x >= 3940 and x <= 3980 Then//1310 3970卡住
Call 左跳
ElseIf y=1310 and x >= 3940 and x <= 3980 Then
Call dm.keydown(37)
ElseIf y=1310 and x < 3940 and x >= 3840 Then
Call 爬树右下
ElseIf y = 1580 and x > 3890 Then
Call 爬树左下
ElseIf y = 1580 and x >= 3840 and x <= 3890 Then
Call 爬树右下
ElseIf y = 1860 and x >= 3850 and x <= 3900 Then
Call 爬树右下
ElseIf y = 1860 and x >= 3900 and x <=1860 Then
Call 爬树左下
ElseIf y = 2180 and x > 3600 Then
dm.keydown (37)
ElseIf y = 2180 and x >= 3390 and x <= 3520 Then
dm.keydown(39)
ElseIf y = 2180 and x <= 3600 and x > 3520 Then
Call 上跳
ElseIf y = 2100 and x < 3590 and x > 3500 Then
dm.keydown (39)
ElseIf y = 2100 and x >= 3600 and x <= 3650 Then
dm.keydown (37)
ElseIf y = 2100 and x >= 3590 and x <= 3600 Then
Call 上跳
ElseIf y = 2030 and x > 3610 and x <= 3730 Then
dm.keydown (37)
ElseIf y = 2030 and x >= 3560 and x < 3580 Then
dm.keydown (39)
ElseIf y = 2030 and x <= 3610 and x >= 3580 Then
Call 上跳
ElseIf y = 1960 and x > 3620 and x <= 3690 Then
dm.keydown (37)
ElseIf y = 1960 and x < 3575 and x >= 3530 Then
dm.keydown (39)
ElseIf y = 1960 and x >= 3575 and x <= 3620 Then
dm.keypress (38)
//修复bug
ElseIf (y = 1690 or y = 1760) and x > 3130 and x < 3800 Then
dm.keydown (37)
ElseIf y = 1760 and x <= 3120 and x > 3060 Then
dm.keydown (39)
ElseIf y = 1760 and x >= 3120 and x <= 3130 Then
Call 上跳
ElseIf y = 1680 and x < 3100 and x >= 2930 Then
dm.keydown (39)
ElseIf y = 1680 and x > 3140 and x <= 3180 Then
dm.keydown (37)
ElseIf y = 1680 and x >= 3100 and x <= 3140 Then
Call 上跳
ElseIf y = 1600 and x>=3050 and x<=3190 Then
Call 上跳
ElseIf y = 1530 and x >= 3000 and x <= 3130 Then
dm.keydown (39)
ElseIf y = 1530 and x > 3130 and x <= 3180 Then
Call 右跳
ElseIf y = 1450 and x >= 3150 and x < 3220 Then
dm.keydown (39)
ElseIf y = 1450 and x >= 3220 and x <= 3330 Then
Call 右跳
ElseIf y = 1380 and x >= 3220 and x < 3330 Then
dm.keydown (39)
ElseIf y = 1380 and x >= 3330 and x <= 3420 Then
Call 爬树左上
ElseIf y = 1140 and x < 3380 and x >= 3210 Then
dm.keydown (39)
ElseIf y = 1140 and x <= 3470 and x >= 3380 Then
Call 爬树左上
ElseIf y = 910 and x >= 3300 and x<=3620 Then
dm.keydown (39)
End If
End sub
4、答题
Sub 脚本_行脚NPC答题()
Dim x, y
Dim A错, B错, C错, D错
Dim 局_出错状态
Dim 局_地图ID
Call 释放按键
局_出错状态 = 0
Call 设置表格(行, 列_工作状态, "【行脚】答题中:寻路")
Do
x = 读坐标X()
If x <= 2100 Then
dm.keydown (39)
ElseIf x >= 2200 Then
dm.keydown (37)
Else
dm.keyup (39)
dm.keyup (37)
Exit do
End If
TracePrint x
Loop
Call 设置表格(行, 列_工作状态, "【行脚】答题中:答题")
Do
TracePrint "行脚按键"
If 读地图ID = 462 and 读对话状态() = 0 Then
dm.keypress(39)
dm.keypress(37)
Call 按键(71,50,0)
ElseIf 读地图ID = 462 and 读对话状态() = 1 Then
TracePrint "按1"
单击左键 203,185
ElseIf 读地图ID = 462 and 读对话状态() = 2 Then//不重要
TracePrint "按2"
单击左键 363,137
ElseIf 读地图ID = 462 and 读对话状态() = 14 Then
TracePrint "按14"
单击左键 108,300
ElseIf 读地图ID = 462 and 读对话状态() = 21 Then
//答题
dm_ret = dm.FindPic(248,118,588,437, 屏幕 & "/" & "A0.bmp", "000000", 识图精准率, 0, Ax, Ay)
dm_ret = dm.FindPic(248,118,588,437, 屏幕 & "/" & "B0.bmp", "000000", 识图精准率, 0, Bx, By)
dm_ret = dm.FindPic(248,118,588,437, 屏幕 & "/" & "C0.bmp", "000000", 识图精准率, 0, Cx, Cy)
dm_ret = dm.FindPic(248,118,588,437, 屏幕 & "/" & "D0.bmp", "000000", 识图精准率, 0, Dx, Dy)
A错 = (Ax >= 0 or Ay >= 0)
B错 = (Bx >= 0 or By >= 0)
C错 = (Cx >= 0 or Cy >= 0)
D错 = (Dx >= 0 or Dy >= 0)
TracePrint A错 & " -- " & B错 & " -- " & C错 & " -- " & D错
If (是否错题 = 1) and (已经完成次数<>0)and (((已经完成次数+1) mod 错题频率) = 0)Then
局_出错状态 = 1
Call 设置表格(行, 列_工作状态, "【行脚】错题中")
If (B错 and C错 and D错 and (not A错)) Then//如果A对,选B
单击左键 332, 322
Else
单击左键 326, 291
End if
Else
If (B错 and C错 and D错 and (not A错)) Then
单击左键 326,291
elseIf (A错 and C错 and D错 and (not B错)) Then
单击左键 332, 322
ElseIf (A错 and B错 and D错 and (not C错)) Then
单击左键 330,351
ElseIf (A错 and B错 and C错 and (not D错)) Then
单击左键 328,379
Else
单击左键 330,351
End If
End If
//答题后操作
delay(1000)
dm_ret = dm.FindPic(0,0,800,600, 屏幕 & "/" & "WA.bmp", "000000", 识图精准率, 0, WAx, WAy)
If WAx >= 0 and WAy >= 0 Then
Delay (按键延迟)
If (局_出错状态 = 1) Then
正常出错计数 = 正常出错计数 + 1
Else
黑屏出错计数 = 黑屏出错计数 + 1
局_出错状态 = 1
End If
End If
单击左键 427, 325
Call 按键(71, 50, 0)
ElseIf 读地图ID = 24 or 读地图ID = 39 or 读地图ID = 112 or 读地图ID = 34 or 读地图ID = 52 or 读地图ID = 126 or 读地图ID = 28 or 读地图ID = 118 or 读地图ID = 44 Then
TracePrint "退出行脚"
Exit Do
End If
Delay (500)//必须要delay,否则会查询太快点错
Loop
单击左键 408, 420//确认按钮
Call 设置表格(行, 列_工作状态, "【行脚】行脚馆外")
//统计数据
已经完成次数 = 已经完成次数 + 1
TracePrint 是否无限循环 & " " & 需要完成次数 & " " & 已经完成次数
TracePrint 是否错洞 & " " & 错洞频率
TracePrint 是否错题 & " " & 错题频率
TracePrint 是否停顿 & " " & 停顿频率 & " " & 停顿时间
call dm.writeINI("账户" & 账户编号, "已经完成行脚次数",已经完成次数, 配置文件相对路径 & "账户数据.ini")
Call 设置表格(行, 列_行脚完成次数, 已经完成次数 & "/" & 需要完成次数)
Call 设置表格(行, 列_行脚错题次数, (正常出错计数 + 黑屏出错计数) &"/" & CLng(需要完成次数/错题频率))
//Call 更新界面数据
If 是否无限循环=false Then
If 已经完成次数 >= 需要完成次数 Then
//插入结束线程
Call 设置表格(行, 列_工作状态, "【行脚】完成")
Exit Sub
End If
End If
//停顿
If 局_出错状态 = 1 Then
Call 设置表格(行, 列_工作状态, "【行脚】行脚馆外:错题等待")
Delay (300000)
Else
Call 设置表格(行, 列_工作状态, "【行脚】行脚馆外:正常等待")
End If
If 是否停顿 = 1 and (已经完成次数<>0) and ((已经完成次数 mod 停顿频率) = 0)Then Delay(停顿时间)
Delay (1000)
//重复
Call 释放按键
Call 脚本_行脚馆外
End Sub
自动寻路思路
【方法1】寻路CALL、爆破CALL,如果您看到这篇文章后有时间去学,可以邮件交流给我发篇你写的教程。优点:快,准。缺点:容易封。
【方法2】类似行脚自行判断地图。优点:可自行写一些快捷路径。缺点:写完所有地图得费多少时间吶
提供一些地图ID:
巴郡=3
巴郡东郊=5
古驿道_北关道=200
古驿道_关岭=201
疾风岗=12
古驿道_黄土岭=199
巴郡东郊_树林=197
野猪岭=11
巴郡西郊=4
关隘岔路=198
饮马关关隘=10
古驿道末段=9
古驿道关隘=6
古驿道前段=7
古驿道中段=8
成都南郊=25
成都子城=23
成都罗城=24
成都东郊=26
烟雨渡码头=28
烟雨渡运河=29
泽林神鸟涧=30
泽林鸟王宫=31
蜀南竹海翠竹坪=32
蜀南竹海紫云瀑=33
临江西郊=35
临江=34
临江东郊=36
江陵=55
襄阳=126
襄阳南郊=128
荆山之北=130
荆山之南=131
黄石矿洞一层=906
霸王城初阶=930
霸王城进阶=931
瀑布密道=236
地鼠领地 = 442
【方法3(采用)】朋友教的,用的一个Trick,如果能找到我们任务栏的寻路代码就好了:
于是可以在交流-添加好友界面输入代码:
/<DnpcWalkEx=" & 前往地图ID & "|" & x & "|" & y & ">/123456</C04>
如:
/<DnpcWalkEx=23|1300|1600>/123456</C04>
发现有了类似的官方寻路效果:
而点击后,发现开始了自动寻路:
寻路完整代码:
//官方自动寻路,靠脚走的寻路,输入的是小地图坐标
Sub 寻路位置(前往地图ID, miniX, miniY)
x = int(miniX * 100)
y = int(miniY * 100)
dm.keypress 27
dm.keypress 115//按F4
dm.MoveTo 212,137
dm.LeftClick
Call 单击左键(216, 135)
Call 单击左键(454, 459)
Delay 10
//dm.SendString hwnd, "/<DnpcWalkEx=" & 图 & "|" & xx坐标 & "|" & yy坐标 & "> /123456</C04>"
dm.SendString hwnd, "/<DnpcWalkEx=" & 前往地图ID & "|" & x & "|" & y & ">/123456</C04>"
Delay 10
Call 单击左键(339, 309)
dm.keypress 27
dm.keypress 27
Do
TracePrint int(读坐标Y/100) & "-" & 读坐标y & "-" & miniY
If (读人物状态 = 4) Then //寻路过程中被野怪杀死
dm_ret = dm.FindPic(252,217,566,457 , 屏幕 & "/" & "取勾小强丸.bmp", "000000", 识图精准率, 0, yx, yy)
If (yx >= 0 and yy >= 0) Then Call 单击左键(yx, yy)
dm_ret = dm.FindPic(340, 323, 510, 442, 屏幕 & "/" & "exitFlag.bmp", "000000", 识图精准率, 0, xx, xy)
If (xx >= 0 and xy >= 0) Then Call 单击左键(xx, xy)
End If
//静止2 跑4
If (读行动状态 = 2) Then
If 读地图ID = 前往地图ID and int(读坐标X/100) <= miniX+1 and int(读坐标X/100)>=miniX-1 and int(读坐标Y/100) = miniY Then//到达指定位置
Exit Do
Else //中途被迫停下,重新call
Call 寻路位置(前往地图ID, miniX, miniY)
Exit do
End If
End If
Delay 1000 //1s检测一次
Loop
TracePrint "到达指定地点"
End Sub
具体原理不明。