找回密码
 注册
搜索
查看: 827|回复: 17

[灌水]如何利用coroutine让代码可读性提高

[复制链接]
门派:桃花岛
发表于 2020-2-17 10:04:00 | 显示全部楼层 |阅读模式
本帖最后由 zruo@tj 于 2020-2-17 10:58 编辑

由于书剑机器人大量使用callback,很多时候新手一上来就懵了。
例如,一个简单的走路循环为啥写成递归。
searchStart, searchFunc 还有walkwait的关系估计很多人还不一定完全理解。

那怎么让代码写的更容易读呢?
我的答案是 coroutine.

search代码有点长,我就不贴了,我举例pathStart

pathStart也是经典递归,理由很简单,在room里面有大量特殊处理,都需要call特殊方程。
结束以后再call walk wait, 一来容易加些delay来避免flood,二来可以回掉search/path下一步

那对于coroutine就很简单了。我把整个stack yield起来,等其他特殊处理做完,直接resume我的path stack下一步就好了啊!

那我们来试试看。

  1. function path_start()
  2.     EnableTrigger("hp12",false)
  3.     EnableTimer("roadWait",false)
  4.     DeleteTimer("roadWait",false)
  5.     if flag.find==1 then return end
  6.     wait.make(function()
  7.         local steps_done = 0
  8.         for i,step in ipairs(road.detail) do   
  9.             road.i= i  
  10.             print("开始第".. i .. "步")
  11.             print("步骤:" .. step )
  12.             local step_set=utils.split(step,';')
  13.             steps_done = steps_done + table.getn(step_set)
  14.             EnableTrigger("hp12",false)
  15.             if locl.room=="鳄鱼潭" then
  16.                 exe('ta corpse')
  17.             end
  18.             walk_hook_thread = coroutine.running()
  19.             if string.find(step,'#') then
  20.                 local _,_,func,params = string.find(step,"^#(%a%w*)%s*(.-)$")
  21.                 if func then
  22.                     _G[func](params)
  23.                 else
  24.                     messageShow('Function 不存在,可能是地图问题:'.. func)
  25.                 end
  26.             else
  27.                 exe(step)
  28.                 walk_wait()
  29.             end
  30.             print("suspend till walk wait finish")
  31.             coroutine.yield()
  32.             print("walk continue")
  33.         end
  34.         locate_finish='go_confirm'
  35.         return locate()
  36.     end)
  37. end
复制代码
  1. function walk_wait()
  2.     wait.make(function()
  3.         EnableTrigger("hp12",true)
  4.         if tmp.find then
  5.             wait.time(0.2)
  6.             if cntr1() > 0 then
  7.                 walk_goon()
  8.             else
  9.                 cntr1 = countR(15)
  10.                 walk_goon()
  11.             end
  12.         else
  13.             walk_goon()
  14.         end
  15.     end)
  16. end

  17. walk_hook_thread = nil

  18. function walk_goon(func)
  19.     EnableTrigger("hp12",false)
  20.     flag.walkwait = true
  21.     EnableTrigger("hp12",true)
  22.     wait_busy()
  23.    
  24.     if walk_hook_thread then
  25.         print("resume suspended walk")
  26.         local tmp_thread = walk_hook_thread
  27.         walk_hook_thread =nil
  28.         coroutine.resume(tmp_thread)
  29.     else
  30.         exe('alias action 正在赶路中')
  31.     end   
  32. end
复制代码

好,我把path成功的写成了一个简单循环,看上去可能有点臃肿,但是新人也不会那么难理解了吧!!
希望对大家有帮助

评分

1

查看全部评分

门派:古墓派
发表于 2020-2-17 20:43:07 | 显示全部楼层
zruo@tj 发表于 2020-2-17 10:40
太多例子了。

例如go , go的时候要locate. locate等待trigger 更新locl room/area

可读性没人在意的,关键是效率。
门派:桃花岛
 楼主| 发表于 2020-2-17 10:06:33 | 显示全部楼层
啊啊,贴错了!贴成了search
本来打算写个pathstart的例子更简单点。
门派:古墓派
发表于 2020-2-17 10:07:18 | 显示全部楼层
功能上有啥区别么。。。                 
门派:古墓派
发表于 2020-2-17 10:07:59 | 显示全部楼层
论坛有code标记,看起来舒服点。
门派:桃花岛
 楼主| 发表于 2020-2-17 10:40:12 | 显示全部楼层
joyce@tj 发表于 2020-2-17 10:07
功能上有啥区别么。。。

太多例子了。

例如go , go的时候要locate. locate等待trigger 更新locl room/area
如果local trigger 慢了。 go 就会遇到经典的“不知道哪里”
我看代码的处理是刻意等0.5秒。
用coroutine就不需要,等拿到信息直接恢复go的运行stack继续下一步。

总体来说更多是可读性增强
门派:武当派
发表于 2020-2-17 20:03:03 | 显示全部楼层
大神啊 你对新手的定义怕是有什么误解
门派:古墓派
发表于 2020-2-17 20:45:10 | 显示全部楼层
这里的同学,不讲究代码洁癖的,不要求代码优雅,都是实用主义。能用,效率高,不发呆就是好机器。

公版追求的是稳定,效率确实不是长处。
门派:桃花岛
 楼主| 发表于 2020-2-17 23:34:13 来自手机 | 显示全部楼层
joyce@tj 发表于 2020-2-17 20:45
这里的同学,不讲究代码洁癖的,不要求代码优雅,都是实用主义。能用,效率高,不发呆就是好机器。

公版 ...

就是举例分享下coroutine心得
我重写这个更多是为了自己理解和以后优化
例如多步遍历加bfs算法
这篇纯技术水了
门派:明教
发表于 2020-2-18 22:52:35 | 显示全部楼层
支持技术贴,希望多贴一些类似的帖子,带给大家不一样的思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-8-14 10:33 , Processed in 0.036599 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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