基于数据,模拟人为操作
- 您所在的用户组无法下载或查看附件
我们明白,脚本和人为操作,除了在效率上有所差别之外,最大的区别在于人为操作应对各种特殊情况的能力尤为强大,那么要提高脚本的容错和应对各种突然情况,就应该让脚本更加接近人的思想,而数据就是重中之重。
- 您所在的用户组无法下载或查看附件
我们通过记录用户设定和实际完成情况进行对比,记录下用户完成脚本中功能的数据,由统一的方法去管理此时用户此时应该做什么(总任务管理),来实现模拟人为控制。
直接看结果!这里,假设我们有3个任务,分别是A\B\C,简单的制作一个UI界面:
- 您所在的用户组无法下载或查看附件
相信这个应该不用源码吧(就不给!)这三个任务中,C任务平均耗时8秒,B任务10秒,A任务5秒。但是A有特殊情况,运行过程中有可能偏差非常大,有可能20秒才完成,而B任务有几率出现完全卡死的情况。那么我们要如何处理这几种情况呢? 我们是否可以为每个任务设置一个管理器,这个管理器负责处理这个任务过程中出现的特殊情况。上述情况中,B和C我们的处理可以非常类似,启动任务后设置一个计时器,正常时间内完成,就会将用户数据写入,如果时间超出后就关闭任务,此时无数据写入,那么这个任务判定为失败,排到任务末尾,等待总任务管理进行新一轮的任务分配。
而A中,我们需要一些方法来告诉计时器“我”还在正常工作,你重新计时的机制。
来看看代码是怎么实现的吧:
- /* UI参数*/
- Function initUIData()
- setGlobalData "IsA", ReadUIConfig("任务A")
- setGlobalData "IsB", ReadUIConfig("任务B")
- setGlobalData "IsC", ReadUIConfig("任务C")
-
- setGlobalData "UserIsA", false
- setGlobalData "UserIsB", false
- setGlobalData "UserIsC", false
-
- setGlobalData "flag", false //任务结束标志
- setGlobalData "flag1", false //任务超时重置
- End Function
- Function initGame()
- TracePrint "游戏是否开启,未在前台则启动"
- TracePrint "游戏启动后回到首页,保证任务起点"
- End Function
- Function task()
- Dim time1 = TickCount()
- Do
- If getGlobalData("IsA") <> getGlobalData("UserIsA") Then
- TracePrint "开始进行A任务"
- Call 任务A()
- End If
- If getGlobalData("IsB") <> getGlobalData("UserIsB") Then
- TracePrint "开始进行B任务"
- Call 任务B()
- End If
- If getGlobalData("IsC") <> getGlobalData("UserIsC") Then
- TracePrint "开始进行C任务"
- Call 任务C()
- End If
- If getGlobalData("UserIsA") = true and getGlobalData("UserIsB") = true and getGlobalData("UserIsC") = true Then
- TracePrint "所有任务完成,耗时"& TickCount()-time1&"毫秒"
- Exit Do
- End If
- Delay 1000
- If TickCount() - time1 > 99999 Then
- TracePrint "这个号任务已经超过99秒,未知问题,记录此时任务完成情况"
- Exit Do
- End If
- Loop
- End Function
- Function 任务A()
- Dim A_time = 5 //A任务间隔5秒 没做完判定为出问题了
- Dim th = Thread.Start(任务A进程)
- Dim time1 = TickCount()
- Do
- If getGlobalData("flag") = true Then
- setGlobalData "flag", false
- Exit Do
- End If
- If getGlobalData("flag1") = true Then
- setGlobalData "flag1", false
- time1 = TickCount()
- End If
- If TickCount() - time1 > A_time * 1000 Then
- TracePrint "A任务超时,等待重做"
- Thread.Stop(th)
- Call 超时()
- Exit Do
- End If
- Delay 200
- Loop
- End Function
- Function 任务A进程()
- // setGlobalData "flag1", true //此命令可重置超时时间,进程中使用
- Dim RndTime = Rnd()*20 //模拟出任务的实际时间
- Dim time1 = TickCount()
- TracePrint "A任务随机时间为"&RndTime
- Do
- If TickCount() - time1 > RndTime*1000 Then
- setGlobalData "UserIsA", true
- setGlobalData "flag", true
- TracePrint "A任务完成"
- Exit Do
- End If
- setGlobalData "flag1", true //此命令可重置超时时间,进程中使用
- Delay 200
- Loop
- End Function
- Function 任务B()
- Dim B_time = 10 //B任务10秒没做完判定为出问题了
- Dim th = Thread.Start(任务B进程)
- Dim time1 = TickCount()
- Do
- If getGlobalData("flag") = true Then
- setGlobalData "flag", false
- Exit Do
- End If
- If TickCount() - time1 > B_time * 1000 Then
- TracePrint "B任务超时,等待重做"
- Thread.Stop(th)
- Call 超时()
- Exit Do
- End If
- Delay 200
- Loop
- End Function
- Function 任务B进程()
- Dim RndTime = Rnd()*12 //模拟出任务的实际时间
- Dim time1 = TickCount()
- If CInt(RndTime) = 0 Then //某种特殊情况下,B任务卡死(B任务中的任意界面都有可能,不好捕捉)
- RndTime = 9999
- End If
- TracePrint "B任务随机时间为"&RndTime
- Do
- If TickCount() - time1 > RndTime*1000 Then
- setGlobalData "UserIsB", true
- setGlobalData "flag", true
- TracePrint "B任务完成"
- Exit Do
- End If
- Delay 200
- Loop
- End Function
- Function 任务C()
- Dim C_time = 8 //C任务8秒没做完判定为出问题了
- Dim th = Thread.Start(任务C进程)
- Dim time1 = TickCount()
- Do
- If getGlobalData("flag") = true Then
- setGlobalData "flag", false
- Exit Do
- End If
- If TickCount() - time1 > C_time * 1000 Then
- TracePrint "C任务超时,等待重做"
- Thread.Stop(th)
- Call 超时()
- Exit Do
- End If
- Delay 200
- Loop
- End Function
- Function 任务C进程()
- Dim RndTime = Rnd()*10 //模拟出任务的实际时间
- Dim time1 = TickCount()
- TracePrint "C任务随机时间为"&RndTime
- Do
- If TickCount() - time1 > RndTime*1000 Then
- setGlobalData "UserIsC", true
- setGlobalData "flag", true
- TracePrint "C任务完成"
- Exit Do
- End If
- Delay 200
- Loop
- End Function
- Function 超时()
- TracePrint "检测界面"
- TracePrint "能够识别到的就相关处理"
- TracePrint "识别不到的直接重启游戏回到初始"
- End Function
- Function main()
- Call initUIData()
- Call initGame()
- Call task()
- End Function
- Call main()
- Function setGlobalData(key, value)
- Thread.SetShareVar(key,value)
- End Function
- Function getGlobalData(key)
- getGlobalData = Thread.GetShareVar(key)
- End Function
复制代码 代码略长,但肯定拦不住你一颗求知的心,当然,我们还是先来运行下看看!
情况1:
- 您所在的用户组无法下载或查看附件
此时A任务时间超过5秒,但是他不断进行重置计数时间,因为正常结束了,B和C都在正常时间内完成,直接结束。
情况2:
- 您所在的用户组无法下载或查看附件
此时A有不断重置,因为不会超时,B任务超时了(时间未到,网络断开等等情况),于是进行相关的处理后先进行C任务,C任务完成后,我们再把未完成的B任务重新进行。
只要我们记录用户的完成情况,再添加一个任务管理方法来管理用户的所有任务,就能做出很“拟人”的脚本。想学习更多吗!请关注本系列教程!
- 您所在的用户组无法下载或查看附件
按键交流群(新):713687750