• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

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

返回列表 12345678» / 10
发新话题 回复该主题

[13教程进阶篇]1.基于数据,模拟人为操作 [复制链接]

1#

基于数据,模拟人为操作



您所在的用户组无法下载或查看附件



我们明白,脚本和人为操作,除了在效率上有所差别之外,最大的区别在于人为操作应对各种特殊情况的能力尤为强大,那么要提高脚本的容错和应对各种突然情况,就应该让脚本更加接近人的思想,而数据就是重中之重。


您所在的用户组无法下载或查看附件


我们通过记录用户设定和实际完成情况进行对比,记录下用户完成脚本中功能的数据,由统一的方法去管理此时用户此时应该做什么(总任务管理),来实现模拟人为控制。

直接看结果!这里,假设我们有3个任务,分别是A\B\C,简单的制作一个UI界面:

您所在的用户组无法下载或查看附件


相信这个应该不用源码吧(就不给!)这三个任务中,C任务平均耗时8秒,B任务10秒,A任务5秒。但是A有特殊情况,运行过程中有可能偏差非常大,有可能20秒才完成,而B任务有几率出现完全卡死的情况。那么我们要如何处理这几种情况呢?

我们是否可以为每个任务设置一个管理器,这个管理器负责处理这个任务过程中出现的特殊情况。上述情况中,BC我们的处理可以非常类似,启动任务后设置一个计时器,正常时间内完成,就会将用户数据写入,如果时间超出后就关闭任务,此时无数据写入,那么这个任务判定为失败,排到任务末尾,等待总任务管理进行新一轮的任务分配。

A中,我们需要一些方法来告诉计时器“我”还在正常工作,你重新计时的机制。

来看看代码是怎么实现的吧:
  1. /* UI参数*/
  2. Function initUIData()
  3. setGlobalData "IsA", ReadUIConfig("任务A")
  4. setGlobalData "IsB", ReadUIConfig("任务B")
  5. setGlobalData "IsC", ReadUIConfig("任务C")

  6. setGlobalData "UserIsA", false
  7. setGlobalData "UserIsB", false
  8. setGlobalData "UserIsC", false

  9. setGlobalData "flag", false //任务结束标志
  10. setGlobalData "flag1", false //任务超时重置
  11. End Function

  12. Function initGame()
  13. TracePrint "游戏是否开启,未在前台则启动"
  14. TracePrint "游戏启动后回到首页,保证任务起点"
  15. End Function

  16. Function task()
  17. Dim time1 = TickCount()
  18. Do
  19. If getGlobalData("IsA") <> getGlobalData("UserIsA") Then
  20. TracePrint "开始进行A任务"
  21. Call 任务A()
  22. End If
  23. If getGlobalData("IsB") <> getGlobalData("UserIsB") Then
  24. TracePrint "开始进行B任务"
  25. Call 任务B()
  26. End If
  27. If getGlobalData("IsC") <> getGlobalData("UserIsC") Then
  28. TracePrint "开始进行C任务"
  29. Call 任务C()
  30. End If
  31. If getGlobalData("UserIsA") = true and getGlobalData("UserIsB") = true and getGlobalData("UserIsC") = true Then
  32. TracePrint "所有任务完成,耗时"& TickCount()-time1&"毫秒"
  33. Exit Do
  34. End If
  35. Delay 1000
  36. If TickCount() - time1 > 99999 Then
  37. TracePrint "这个号任务已经超过99秒,未知问题,记录此时任务完成情况"
  38. Exit Do
  39. End If
  40. Loop
  41. End Function

  42. Function 任务A()
  43. Dim A_time = 5 //A任务间隔5秒 没做完判定为出问题了
  44. Dim th = Thread.Start(任务A进程)
  45. Dim time1 = TickCount()
  46. Do
  47. If getGlobalData("flag") = true Then
  48. setGlobalData "flag", false
  49. Exit Do
  50. End If
  51. If getGlobalData("flag1") = true Then
  52. setGlobalData "flag1", false
  53. time1 = TickCount()
  54. End If
  55. If TickCount() - time1 > A_time * 1000 Then
  56. TracePrint "A任务超时,等待重做"
  57. Thread.Stop(th)
  58. Call 超时()
  59. Exit Do
  60. End If
  61. Delay 200
  62. Loop
  63. End Function

  64. Function 任务A进程()
  65. // setGlobalData "flag1", true //此命令可重置超时时间,进程中使用
  66. Dim RndTime = Rnd()*20 //模拟出任务的实际时间
  67. Dim time1 = TickCount()
  68. TracePrint "A任务随机时间为"&RndTime
  69. Do
  70. If TickCount() - time1 > RndTime*1000 Then
  71. setGlobalData "UserIsA", true
  72. setGlobalData "flag", true
  73. TracePrint "A任务完成"
  74. Exit Do
  75. End If
  76. setGlobalData "flag1", true //此命令可重置超时时间,进程中使用
  77. Delay 200
  78. Loop
  79. End Function

  80. Function 任务B()
  81. Dim B_time = 10 //B任务10秒没做完判定为出问题了
  82. Dim th = Thread.Start(任务B进程)
  83. Dim time1 = TickCount()
  84. Do
  85. If getGlobalData("flag") = true Then
  86. setGlobalData "flag", false
  87. Exit Do
  88. End If
  89. If TickCount() - time1 > B_time * 1000 Then
  90. TracePrint "B任务超时,等待重做"
  91. Thread.Stop(th)
  92. Call 超时()
  93. Exit Do
  94. End If
  95. Delay 200
  96. Loop
  97. End Function

  98. Function 任务B进程()
  99. Dim RndTime = Rnd()*12 //模拟出任务的实际时间
  100. Dim time1 = TickCount()
  101. If CInt(RndTime) = 0 Then //某种特殊情况下,B任务卡死(B任务中的任意界面都有可能,不好捕捉)
  102. RndTime = 9999
  103. End If
  104. TracePrint "B任务随机时间为"&RndTime
  105. Do
  106. If TickCount() - time1 > RndTime*1000 Then
  107. setGlobalData "UserIsB", true
  108. setGlobalData "flag", true
  109. TracePrint "B任务完成"
  110. Exit Do
  111. End If
  112. Delay 200
  113. Loop
  114. End Function

  115. Function 任务C()
  116. Dim C_time = 8 //C任务8秒没做完判定为出问题了
  117. Dim th = Thread.Start(任务C进程)
  118. Dim time1 = TickCount()
  119. Do
  120. If getGlobalData("flag") = true Then
  121. setGlobalData "flag", false
  122. Exit Do
  123. End If
  124. If TickCount() - time1 > C_time * 1000 Then
  125. TracePrint "C任务超时,等待重做"
  126. Thread.Stop(th)
  127. Call 超时()
  128. Exit Do
  129. End If
  130. Delay 200
  131. Loop
  132. End Function

  133. Function 任务C进程()
  134. Dim RndTime = Rnd()*10 //模拟出任务的实际时间
  135. Dim time1 = TickCount()
  136. TracePrint "C任务随机时间为"&RndTime
  137. Do
  138. If TickCount() - time1 > RndTime*1000 Then
  139. setGlobalData "UserIsC", true
  140. setGlobalData "flag", true
  141. TracePrint "C任务完成"
  142. Exit Do
  143. End If
  144. Delay 200
  145. Loop
  146. End Function

  147. Function 超时()
  148. TracePrint "检测界面"
  149. TracePrint "能够识别到的就相关处理"
  150. TracePrint "识别不到的直接重启游戏回到初始"
  151. End Function

  152. Function main()
  153. Call initUIData()
  154. Call initGame()
  155. Call task()
  156. End Function

  157. Call main()

  158. Function setGlobalData(key, value)
  159. Thread.SetShareVar(key,value)
  160. End Function

  161. Function getGlobalData(key)
  162. getGlobalData = Thread.GetShareVar(key)
  163. End Function
复制代码

代码略长,但肯定拦不住你一颗求知的心,当然,我们还是先来运行下看看!

情况1:

您所在的用户组无法下载或查看附件


此时A任务时间超过5秒,但是他不断进行重置计数时间,因为正常结束了,BC都在正常时间内完成,直接结束。


情况2:



您所在的用户组无法下载或查看附件



此时A有不断重置,因为不会超时,B任务超时了(时间未到,网络断开等等情况),于是进行相关的处理后先进行C任务,C任务完成后,我们再把未完成的B任务重新进行。


只要我们记录用户的完成情况,再添加一个任务管理方法来管理用户的所有任务,就能做出很“拟人的脚本。想学习更多吗!请关注本系列教程!


您所在的用户组无法下载或查看附件




按键交流群(新):713687750


最后编辑兄弟工程师13 最后编辑于 2016-07-11 18:29:59
本主题由 超级版主 瑞祥幽冥狼 于 2023/2/4 21:41:08 执行 审核帖子 操作
2#

学习一下内容

3#

观摩学习,拜谢

4#

谢谢分享!!!!!

5#

学习修改。。

6#

该用户帖子内容已被屏蔽

庚辰插件专区   
网页自动填表就用庚辰插件
7#

123445677

8#


9#

我来学习了

10#

6666666666666666666666

11#

6666666666666

12#

学习一下内容

13#

直接看结果!

14#

学习下学习下

15#

dddddddddddddddd

16#

感谢楼主分享此教程~!

17#

学习一下内容

18#

教程好

19#

好例子 需要希望对我有帮助

20#

学习下 看看

发新话题 回复该主题