文章目录

前言

原标题为《三国高级辅助_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爬取有用数据之类的东西,开源赛高~ 天涯未远,江湖再见。

交流代码和原理

找基址方法

我已经试过CE官方最高版本、CE_6.4.3_风叶人加强版、淘宝卖的CE、一些易语言编写的软件,都不行。
用了一款比较好用的:Vzla Engine2.0 百度网盘下载(密码zef5)

在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开头的,而且右键“查找访问该地址的代码”,发现了大量的相关汇编代码,那么这个F68734就确定为基址啦。

以前用过的基址/内存地址及其查找方式(目前部分已失效!只是增加认识)

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

具体原理不明。


转载请注明出处http://www.bewindoweb.com/99.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠
  • 毒丨
    评论于2018年08月18日
    大佬,就是用CE搜索血量那点访问就会闪退的?
    三颗豆子
    回复于2018年08月18日
    你是用的CE还是VZL呢? CE的话太出名了,早就被官方研究得很深了,对CE的检测和限制都已经写到游戏保护的代码里了,所以一般网上下载的CE都用不了,出现闪退基本都是因为游戏的保护机制,有时候还会网络掉线、直接蓝屏或者强行重启。 VZL现在只是搜索不到基址了,但是不存在闪退的问题,被检测得比较少,如果是VZL发生的闪退,那估计是VZL也要凉凉了……
  • 红白黑
    评论于2018年08月03日
    楼主,能加你QQ,和你交流关于数据爬取的一些经验吗? 请发到QQ邮箱,谢谢
    三颗豆子
    回复于2018年08月05日
    当然可以啊,不过可能不能及时回复,我的邮箱bewindoweb1995@foxmail.com,我用QQ邮箱代理接收了的,有想要交流的发这个邮箱就行,我能收到。
  • 红白黑
    评论于2018年07月19日
    按步骤找到的基址不能用了 软件版本=QQ三国1.0Beta77Build35 账户个数=9 基址=0435F4 登录基址=0524F8
    三颗豆子
    回复于2018年07月20日
    Vzla Engine2.0软件已经失效了,所以找出来的基址很可能是错的。目前只能自己去寻找新的替代软件来查找基址(如果找到好用的还请发邮件教教我)。一种测试找到的基址是否正确的方法是:用基址加上以前的所有偏移,看有没有数据能对得上(因为版本更新后一般总会有偏移不变的,比如坐标X+C+338+18这个偏移已经很久都没变过了)。测试登录基址就更简单,观察登录基址的数据,登录界面选线应该为3,输入帐号密码应该为8。如果基址都是正确的,那可能是程序写得有问题了,需要检查代码;否则基址是错的,需要自行寻找新工具。
  • 不快逆流
    评论于2018年07月14日
    按照步骤找基址点再次搜索的时候就空白了
    三颗豆子
    回复于2018年07月15日
    是的,Vzla Engine2.0软件已经失效,估计三国已经把相应的在window XP上的代码完善了,所以需要自己重新寻找新的工具来查找。希望提供的思路对你有所帮助~
  • 风一样飘
    评论于2018年07月12日
    作者,我找出的不是F开头的
    三颗豆子
    回复于2018年07月13日
    可能现在改了,我最后一次尝试的时候也是发现一个E开头的了不再是F开头了,不知道是不是新的基址,也没去研究了。如果你测试过你的那个基址可以用的话麻烦评论一下你的基址,我把你的那个基址展示给后面的同学看提升文章质量,保留你的昵称,多谢~