TC官方合作论坛

 找回密码
 立即注册
楼主: alukaduo09

[TC5.0源码] 分析 天^龙^八^部^3 技能遍历二叉树后写出的TC遍历代码 ....

  [复制链接]
发表于 2015-8-9 12:27:00 | 显示全部楼层
感谢,试试{:soso__95a8779cb2df705c-1ae089e09808724a-14684be2a1e03727f8164357bdd1feeb.jpg_1:}
回复 支持 反对

使用道具 举报

发表于 2015-8-9 16:36:25 | 显示全部楼层
表示虽然不知道以前的数组格式,但:
        技能ID=二漠.整型转十六进制字符(大漠.ReadInt(全局窗口句柄,二漠.整型转十六进制字符(返回的数据+#c),0))
        技能名称=大漠.ReadString(全局窗口句柄,"[["&二漠.整型转十六进制字符(返回的数据+#10+#4)&"]+0c]+0",0,16)
可能应该改成
                var 技能ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,整型转十六进制字符(返回的数据[u]+#c),0))
                var 技能名称=大漠.ReadString(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10+#4)&"]+0c]+0",0,16)
表示数组的取项您貌似没写
{:soso__95a8779cb2df705c-1ae089e09808724a-14684be2a1e03727f8164357bdd1feeb.jpg_1:}
回复 支持 反对

使用道具 举报

发表于 2015-8-10 21:17:40 | 显示全部楼层
表示将楼上的源码大幅修改了下,减少资源占用,还加入 技能遍历、数组的周围环境遍历(有的内容二叉树遍历不到,也有数组遍历不到,二叉树才能遍历到的内容),贴上来方便后人(话说这么远没人看到吧。- -)
  1. var 天使=com("Ts.TsSoft")
  2. var 大漠=com("dm.dmsoft")
  3. var 全局窗口句柄
  4. var 基址1=#A1B688
  5. var 周围对象基址_十六进制=#A1B688
  6. var 二叉树遍历周围环境根总集=数组()//用来存放各层不断加入的多线程遍历时获得的根
  7. var 二叉树遍历周围环境根临时存放集=数组()//用来存放多线程遍历时某层可用子树作为根的集
  8. var 进程句柄

  9. 功能 天龙二叉树遍历_初始化()
  10.     var PID=进程信息("Game.exe",0)
  11.     全局窗口句柄=获取窗口句柄(PID[0],1)
  12. 结束

  13. 功能 技能遍历按钮_点击()
  14.     列表框选项清空("技能遍历")
  15.     var 线程ID=线程开启("遍历技能","")
  16. end

  17. 功能 二叉树遍历周围环境按钮_点击()
  18.     数组清空(二叉树遍历周围环境根总集)
  19.     列表框选项清空("二叉树遍历周围环境")
  20.     var 线程ID=线程开启("二叉树遍历周围环境","")
  21. 结束

  22. 功能 数组遍历周围环境按钮_点击()
  23.     列表框选项清空("数组遍历周围环境")
  24.     var 线程ID=线程开启("数组遍历周围环境","")
  25. 结束



  26. 功能 数组遍历周围环境()
  27.     var u,遍历次数,对象ID,对象名称,对象类型,递增数,偏移,对象名称地址,对象ID地址,对象类型地址
  28.     遍历次数=50
  29.     遍历(u=0;u<遍历次数;u++)
  30.         递增数=u*64                //十进制
  31.         偏移=21500+u*64 //21500为53FC十进制
  32.         偏移=字符串格式化("%x",偏移)
  33.         对象名称地址=字符串拼接("[A1B478]+",偏移)
  34.         对象名称=大漠.ReadString(全局窗口句柄,对象名称地址,0,16)
  35.         
  36.         偏移=21524+u*64 //21524为5314十进制
  37.         偏移=字符串格式化("%x",偏移)
  38.         对象ID地址=字符串拼接("[A1B478]+",偏移)
  39.         对象ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,对象ID地址,0))
  40.         
  41.         偏移=21516+u*64 //21516为540C十进制
  42.         偏移=字符串格式化("%x",偏移)
  43.         对象类型地址=字符串拼接("[A1B478]+",偏移)
  44.         对象类型=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,对象类型地址,0))        
  45.         
  46.         列表框增加文本("数组遍历周围环境","对象ID:"&对象ID&" 对象名称:"&对象名称&"——"&"对象类型:"&对象类型)
  47.     end
  48. end

  49. 功能 二叉树遍历周围环境()
  50.     var 返回的数据,大小,u,对象ID,对象名称,血量,X坐标,Y坐标,类型一,类型二,虚函数
  51.     返回的数据=二叉树遍历周围环境查找遍历()
  52.     大小=数组大小(返回的数据)
  53.     u
  54.     遍历(u=0;u<大小;u++)
  55.         对象ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,整型转十六进制字符(返回的数据[u]+#c),0))
  56.         对象名称=大漠.ReadString(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+1EC]+4]+3c",0,16)
  57.         血量=大漠.ReadFloat(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+1EC]+4]+8")
  58.         X坐标=int(大漠.ReadFloat(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]+48"))
  59.         Y坐标=int(大漠.ReadFloat(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]+50"))
  60.         类型一=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10)&"]+2c]+18",0))
  61.         类型二=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10)&"]+0]+38",0))
  62.         虚函数=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]",0))
  63.         if(对象名称=="")
  64.             if(虚函数==字符串格式化("%x","8977224"))//采集物虚函数88FB48的十进制
  65.                 对象名称=大漠.ReadString(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+118]+4]+0",0,16)
  66.             end
  67.             if(虚函数==字符串格式化("%x","8976480"))//地上包虚函数88F860的十进制
  68.                 对象名称="包裹"
  69.             end
  70.         end
  71.         列表框增加文本("二叉树遍历周围环境","对象ID:"&对象ID&" 对象名:"&对象名称&"血量"&血量&"X坐标"&X坐标&","&"Y坐标"&Y坐标&"        "&"类型一:"&类型一&"        "&"类型二"&类型二&"虚函数"&虚函数)
  72.     end
  73. end

  74. function 二叉树遍历周围环境查找遍历()
  75.     var 基址,返回的数据,树根,进程PID,u,返回数据
  76.     基址=整型转十六进制字符(周围对象基址_十六进制)
  77.     返回的数据=数组()
  78.     树根=大漠.ReadInt(全局窗口句柄,"[["&基址&"]+68]+4",0)    //获取树根
  79.     进程PID=天使.GetWindowProcessId(全局窗口句柄)                        //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
  80.     进程句柄=进程信息(进程PID,2)                                    //PID转进程句柄
  81.     返回数据=二叉树遍历周围环境查找数据(树根)       
  82.     return 返回数据
  83. end

  84. function 二叉树遍历周围环境查找数据(树根)
  85.     var 是否空树=读byte(进程句柄,树根+#15)
  86.     if(是否空树==0)
  87.         数组追加元素(二叉树遍历周围环境根总集,树根)
  88.         数组追加元素(二叉树遍历周围环境根临时存放集,树根)
  89.         while(数组大小(二叉树遍历周围环境根临时存放集)!=0)
  90.             var 临时根个数=数组大小(二叉树遍历周围环境根临时存放集)
  91.             var 二叉树遍历周围环境根临时存放集2=数组()
  92.             二叉树遍历周围环境根临时存放集2=二叉树遍历周围环境根临时存放集//赋值到新存放集,原来的存放集可以清空了
  93.             数组清空(二叉树遍历周围环境根临时存放集)//清空存放集就可以放子程序过后新的根了
  94.             for(var i = 0; i < 临时根个数; i++)
  95.                   二叉树遍历周围环境查找数据取根(二叉树遍历周围环境根临时存放集2[i])
  96.                 sleep(5)
  97.             end
  98.         end
  99.     end
  100.     return 二叉树遍历周围环境根总集
  101. end

  102. function 二叉树遍历周围环境查找数据取根(树根)
  103.     var 左树,右树,是否空树
  104.     左树=读4byte(进程句柄,树根)//小于根的ID放入左树
  105.     是否空树=读byte(进程句柄,左树+#15)
  106.     如果(是否空树==0)
  107.         数组追加元素(二叉树遍历周围环境根总集,左树)
  108.         数组追加元素(二叉树遍历周围环境根临时存放集,左树)
  109.     end
  110.     右树=读4byte(进程句柄,树根+#8)//大于根的ID放入右树
  111.     是否空树=读byte(进程句柄,右树+#15)
  112.     如果(是否空树==0)
  113.         数组追加元素(二叉树遍历周围环境根总集,右树)
  114.         数组追加元素(二叉树遍历周围环境根临时存放集,右树)
  115.     end
  116. end



  117. 功能 遍历技能()
  118.     var 返回的数据,大小,u,技能ID,技能名称
  119.     返回的数据=技能二叉树查找遍历(全局窗口句柄)
  120.     大小=数组大小(返回的数据)
  121.     u
  122.     遍历(u=0;u<大小;u++)
  123.         技能ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,整型转十六进制字符(返回的数据[u]+#c),0))
  124.         技能名称=大漠.ReadString(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10+#4)&"]+0c]+0",0,16)
  125.         列表框增加文本("技能遍历","技能ID:"&技能ID&" 技能名:"&技能名称)
  126.     end
  127. end

  128. 功能 技能二叉树查找遍历(窗口句柄,遍历次数=1000)            //设定遍历次数为默认1000次的遍历
  129.     var 基址,返回的数据,树根,进程PID,u,返回数据
  130.     基址=整型转十六进制字符(基址1)
  131.     返回的数据=数组()
  132.     树根=大漠.ReadInt(窗口句柄,"[[[[["&基址&"]+74]+1ec]+4]+2868]+4",0)    //获取树根
  133.     进程PID=天使.GetWindowProcessId(窗口句柄)                        //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
  134.     进程句柄=进程信息(进程PID,2)                                    //PID转进程句柄
  135.     u
  136.     遍历(u=0;u<遍历次数;u++)                                        //u就是代表要查找的技能ID, 我们从ID=0查找到 ID=1000
  137.         返回数据=技能二叉树查找数据(树根,u)    //调用专门查找指定数据的子程序
  138.         如果(返回数据!=0)                                                //如果返回为0证明树中没有要查找的内容
  139.             数组追加元素(返回的数据,返回数据) //不为0就证明找到了数据, 而返回的数据就是树的每个节点
  140.         end
  141.     end
  142.     返回 返回的数据
  143. end

  144. 功能 技能二叉树查找数据(树根,查找的数据)   //这里的代码执行过程跟OD里面的二叉树遍历基本差不多. 不过我们就是将没有找到的数据返回0了
  145.     var 是否空树,查找目标,是否空
  146.     循环(真)
  147.         是否空树=读byte(进程句柄,树根+#25)
  148.         如果(是否空树==0)
  149.             查找目标=读4byte(进程句柄,树根+#c)
  150.             如果(查找目标==查找的数据)
  151.                 返回 树根
  152.             否则
  153.                 如果(查找目标>=查找的数据)
  154.                     树根=读4byte(进程句柄,树根)//小于根的ID放入左树,  大于根的ID放入右树  
  155.                     是否空=读byte(进程句柄,树根+#25)
  156.                     如果(是否空!=0)
  157.                         返回 0
  158.                     end
  159.                 否则
  160.                     树根=读4byte(进程句柄,树根+#8)//小于根的ID放入左树,  大于根的ID放入右树  
  161.                     是否空=读byte(进程句柄,树根+#25)
  162.                     如果(是否空!=0)
  163.                         返回 0
  164.                     end
  165.                 end
  166.             end
  167.         end
  168.     end
  169. end

  170. 功能 周围二叉树查找遍历(窗口句柄,遍历次数=3000)            //设定遍历次数为默认1000次的遍历
  171.     var 基址,返回的数据,树根,进程PID,u,返回数据
  172.     基址=整型转十六进制字符(周围对象基址_十六进制)
  173.     返回的数据=数组()
  174.     树根=大漠.ReadInt(窗口句柄,"[["&基址&"]+68]+4",0)    //获取树根
  175.     进程PID=天使.GetWindowProcessId(窗口句柄)                        //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
  176.     进程句柄=进程信息(进程PID,2)                                    //PID转进程句柄
  177.     数组追加元素(返回的数据,返回数据)
  178.     u
  179.     遍历(u=0;u<遍历次数;u++)                                        //u就是代表要查找的技能ID, 我们从ID=0查找到 ID=1000
  180.         返回数据=周围二叉树查找数据(树根,u)    //调用专门查找指定数据的子程序
  181.         如果(返回数据!=0)                                                //如果返回为0证明树中没有要查找的内容
  182.             数组追加元素(返回的数据,返回数据) //不为0就证明找到了数据, 而返回的数据就是树的每个节点
  183.         end
  184.     end
  185.     返回 返回的数据
  186. end

  187. 功能 周围二叉树查找数据(树根,查找的数据)   //这里的代码执行过程跟OD里面的二叉树遍历基本差不多. 不过我们就是将没有找到的数据返回0了
  188.     var 是否空树,查找目标,是否空
  189.     循环(真)
  190.         是否空树=读byte(进程句柄,树根+#15)
  191.         如果(是否空树==0)
  192.             查找目标=读4byte(进程句柄,树根+#c)
  193.             如果(查找目标==查找的数据)
  194.                 返回 树根
  195.             否则
  196.                 如果(查找目标>=查找的数据)
  197.                     树根=读4byte(进程句柄,树根)//小于根的ID放入左树,  大于根的ID放入右树
  198.                     是否空=读byte(进程句柄,树根+#15)
  199.                     如果(是否空!=0)
  200.                         返回 0
  201.                     end
  202.                 否则
  203.                     树根=读4byte(进程句柄,树根+#8)//小于根的ID放入左树,  大于根的ID放入右树  
  204.                     是否空=读byte(进程句柄,树根+#15)
  205.                     如果(是否空!=0)
  206.                         返回 0
  207.                     end
  208.                 end
  209.             end
  210.         end
  211.     end
  212. end



  213. function 整型转十六进制字符(欲转换的值)
  214.     如果(欲转换的值!=null)
  215.         返回 字符串格式化("%x",转整型(欲转换的值))
  216.     end
  217. end

复制代码






回复 支持 反对

使用道具 举报

发表于 2015-8-13 00:49:54 | 显示全部楼层
知识传播的效果技能
回复 支持 反对

使用道具 举报

发表于 2015-9-12 16:33:51 | 显示全部楼层
回复

使用道具 举报

发表于 2015-9-22 03:59:57 | 显示全部楼层
2222222222222222222222222222222222222222222222222
回复 支持 反对

使用道具 举报

发表于 2015-10-5 01:52:47 | 显示全部楼层
阿萨德的顶顶顶顶顶的顶顶顶顶顶大大
回复 支持 反对

使用道具 举报

发表于 2015-10-5 22:33:30 | 显示全部楼层
回复

使用道具 举报

发表于 2015-10-7 09:27:57 | 显示全部楼层
看看学习
回复

使用道具 举报

发表于 2015-10-9 21:57:05 | 显示全部楼层
fghfhrffg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-20 13:46 , Processed in 0.032665 second(s), 18 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表