• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.0
软件大小:62.5M
更新时间:5-24

按键精灵iOS版
立即下载

软件版本:1.3.3
软件大小:29.2M
更新时间:06-14

按键精灵Mac版
立即下载

软件版本:1.1.0
软件大小:12.3M
更新时间:12-29

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
返回列表 12345678» / 101
发新话题 回复该主题

[按键精灵安卓版] 学了这个不信你还做不出稳定的脚本 -【201511期】 [复制链接]

1#

学了这个不信你还做不出稳定的脚本




本文按键学院提供技术支持


按键学院交流①群(已满):376122403

按键学院交流②群(已满):372671254

按键学院交流③群(快满):170084238

按键学院安卓①群:115768679


游戏吸引人的地方在于他的不确定性,有可能赶路的时候顺手干掉一个野怪,居然爆出了屠龙宝刀(→_→),但是脚本不同,我们希望的是:他能完全按照我们的逻辑进行,就算偏离了后也能自动扭正回来,继续当前的逻辑。



脚本的稳定性是所有作者最关心的问题,可能你的脚本能运行1个小时,2个小时,但是由于各种因素,甚至有的并不是因为你脚本的问题而产生的逻辑进行不下去的情况,最典型的例子就是网络延时的弹窗,当然这个要处理很简单,因为他属于可预测的问题(游戏本身的),只需要在每一个含有联网操作的地方都加上判定即可(写一个函数大家一起用)。但是有一类是无法预测的,比如有的游戏会有全服公告的喇叭,时不时就出现一次,即使他只出现一会也会影响我们的判定,一个判定的错误会导致一连串的错误,导致游戏实际状态和我们逻辑处理到的地方不一致,然后。。。就没有然后了,等着用户发现并吐槽你吧。
对于这类型的问题:先来分析一下第一种处理方法----在所有的操作循环中加入判定,看看代码:
  1. Dim 计数器 = 0
  2. Do
  3. If CmpColorEx("当前界面特征",0.9)=1 Then
  4. Tap 相应功能的位置
  5. End If
  6. Delay 100
  7. If CmpColorEx("操作之后的界面特征",0.9)=1 Then
  8. Exit Do
  9. End If
  10. If 计数器 > 50 Then
  11. TracePrint "超时了"
  12. Call 超时处理()
  13. Else
  14. 计数器= 计数器+1
  15. End If
  16. Loop
复制代码

代码的功能很简单,就是一次操作使用的循环,先寻找当前界面你需要点击的位置(找色比色找图都行),点击之后寻找此次操作产生的响应,比如出现弹窗什么的,然后开始寻找此弹窗特点,寻找到就说明此次操作成功,可以退出此循环,这就是这段代码的功能,而后面的计数器则是为了防止有一些特殊情况,产生两个特征图都找不到,脚本卡死在这个循环里,超时之后我们可以在超时处理函数里做重启游戏之类的操作。

分析完了功能之后,我们再来分析一下优缺点,优点显而易见,基本能处理所有我们预测不到的问题,并且超时时间可以调整,添加的位置很自由,超时的处理方式也可以自己设置。缺点就是工作量大,一个脚本可能含有大量的循环,他们或多或少有点区别,这段代码没法复用。
好了,我们再来看看第二种处理方式----多线程检测,直接看代码:
  1. Thread.SetShareVar("进度值",0)
  2. Dim 超时 = 8 //秒
  3. Dim 主逻辑线程

  4. Function 主逻辑函数()
  5. Do
  6. Dim 任务时间 = Cint(Rnd()*5)+5
  7. Delay 任务时间 * 1000
  8. Thread.SetShareVar "进度值", Thread.GetShareVar("进度值") + 1
  9. TracePrint "此次任务完成,使用了"&任务时间&"秒,当前进度为:"&Thread.GetShareVar("进度值")&",重新计数"
  10. Loop
  11. End Function

  12. Function 超时处理()
  13. TracePrint "此次任务耗时超过"&超时&"秒,等待5秒后重新启动,继续上次的进度"
  14. Thread.Stop (主逻辑线程)
  15. Delay 5000
  16. 主逻辑线程 = Thread.Start(主逻辑函数)
  17. End Function

  18. Function 判断超时函数()
  19. Dim 判定计数 = 0
  20. Do
  21. Dim 初始进度 = Thread.GetShareVar("进度值")
  22. Delay 1000
  23. If 初始进度 = Thread.GetShareVar("进度值") Then
  24. 判定计数 = 判定计数 + 1
  25. TracePrint "超时计数器:"&判定计数
  26. Else
  27. 判定计数 = 0
  28. End If
  29. If 判定计数 >= 8 Then
  30. 超时处理()
  31. 判定计数 = 0
  32. End If
  33. Loop
  34. End Function

  35. 主逻辑线程 = Thread.Start(主逻辑函数)
  36. Call 判断超时函数()
复制代码

使用多线程来做定时,我们需要对任务时间做分析来设定超时时间,上面的代码中,设置每个任务的时间使用一个随机延时5-10秒,在多线程检测中,如果一个任务处理超过8秒,我们就认定这个任务超过了预计的时间,有可能发生问题了(卡在某个地方之类的),那么我们直接做超时处理。我们来看看处理的结果:



继续讨论优缺点,优点是处理简单,通过一个共享变量在游戏线程中变动,而超时判断线程中检测此变动来判定是否卡住,只算单个任务或者全部任务的总耗时,偏差小(一个任务如果偏差1-10秒,当有10种任务时,我们用第一种方式可能会允许100秒的超时,但是实际上平均时间只有50秒,我们计算总耗时可以设定70秒,偏差相对较小,在任务越多,耗时差距越大时候越明显),缺点就是可控性差,甚至无法针对一个任务中的一部分操作做超时检测。
两种方法各有优缺点,用哪种全看你自己的需求和习惯,实在不好决定的话。。。。。两种一起用吧!不信你的脚本还不稳定!



    已有1评分我要评分查看所有评分

    最后编辑兄弟工程师13 最后编辑于 2015-11-27 16:02:19
    本主题由 按键工程师 兄弟工程师13 于 2015/11/26 15:36:53 执行 移动主题 操作
    2#

    谢谢分享

    3#

    好的,本座也来看看

    4#

    个不信你还做不出稳定的脚本 -【20151

    5#

    好东西

    6#

    asdfsadtgwert

    7#

    UUKXXKXKUT

    8#

    超时设定是必要的

    9#

    哈哈哈哈哈哈哈

    10#

    学习学习

    11#

    Hao非常好用

    12#

    再来看看第二种处理方式

    13#

    中中中中中

    14#

    必须学习啊

    qq群:91318725
    15#

    1111111111111111

    16#

    我看看!!到底是什么!!

    WWW.92AJ.CN
    承接中小型 游戏/办公/投票/自动发货类 脚本
    如果回答对你有所帮助请不要吝啬手中的鲜花
    17#

    安卓多线程么!!!

    WWW.92AJ.CN
    承接中小型 游戏/办公/投票/自动发货类 脚本
    如果回答对你有所帮助请不要吝啬手中的鲜花
    18#

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

    19#

    来看一下

    20#

    谢谢

    发新话题 回复该主题