北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 8752|回复: 8

初学mush,试写遍历代码,请各位高手指教

[复制链接]
发表于 2012-12-5 18:37:52 | 显示全部楼层 |阅读模式
  1. ---遍历指定深度找房间
  2. ---输入参数       
  3. ---roomname                 string                目标房间名称
  4. ---roomway                sting                目标房间出口
  5. ---wayarray     array                起步出口数组
  6. ---steps                number                遍历深度
  7. ---输出参数       
  8. ---1                Boolean                是否发现目标房间
  9. ---2                string                发现目标的完整路径
  10. function goallwaytofind(roomname,roomway,thisroomarray,steps)
  11.         local room="";        local way="";        local forward="";        local fw="";        local found=false

  12.         if thisroomarray=={} then return found,forward end
  13.         for j in ipairs(thisroomarray) do
  14.                 exe(thisroomarray[j])
  15.                 while true do
  16.                         l,w=wait.regexp("^(\\S*)\\s*-\\s*$|^>*\\s*绿萼白了你一眼道.*|^>*\\s*店小二一下挡在楼梯前.*|^>*\\s*这里通向神的世界.*|你小心翼翼往前挪动|青海湖畔美不胜收,你不由停下脚步,欣赏起了风景。")
  17.                         if string.find(l,"%s+-%s+$") then --正常行走部分
  18.                                 room=w[1]
  19.                                 break
  20.                         elseif string.find(l,"绿萼白了你一眼道") or string.find(l,"店小二一下挡在楼梯前")  --无法通过部分
  21.                                 or string.find(l,"这里通向神的世界") then                       
  22.                                 local roomarray={}
  23.                                 for i,k in ipairs(thisroomarray) do
  24.                                         if i>j then roomarray[i-j]=k end        --忽略过不去的方向.
  25.                                 end
  26.                                 found,fw=goallwaytofind(roomname,roomway,roomarray,steps)        --剩余方向继续遍历.
  27.                                 forward=forward..";"..fw
  28.                                 forward=formatway(forward)
  29.                                 return found,forward
  30.                         elseif string.find(l,"你小心翼翼往前挪动") or string.find(l,"青海湖畔美不胜收")  --需缓慢行走部分
  31.                                 wait.time(3)
  32.                         end
  33.                 end --end while true do

  34.                 l,w=wait.regexp("^\\s*这里.*的出口是\\s*(.*)。$")
  35.                 if string.find(l,"的出口是") then
  36.                         way=w[1]
  37.                         forward=forward..";"..thisroomarray[j]
  38.                 end

  39.                 if isrightroom(roomname,roomway,room,way,step_count) then
  40.                         found=true
  41.                         break
  42.                 elseif steps>1 then
  43.                         if room="苗岭边缘" then way=removesamedirection(way,"southup") end
  44.                         found,fw=goallwaytofind(roomname,roomway,splitway(removesamedirection(formatway(way),reverse[thisroomarray[j]])),steps-1)
  45.                         forward=forward..";"..fw
  46.                         if found then break end
  47.                 end
  48.                                
  49.                 exe(reverse[thisroomarray[j]])
  50.                 l,w=wait.regexp("^\\s*这里.*的出口是\\s*.*。$")
  51.                 forward=forward..";"..reverse[thisroomarray[j]]
  52.         end        ---for j in ipairs(bt[steps.."-"..tostring(i)]) do

  53.         forward=formatway(forward)
  54.         return found,forward
  55. end
复制代码
最近解决推车乱入问题,顺便写了个小遍历,共享一下.请各位同好斧正.

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-12-5 21:38:35 | 显示全部楼层
formatway是干啥的?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2012-12-5 22:49:44 | 显示全部楼层
回复 4# labaz


把各种格式出口表述,变成用分号;为间隔的字符串
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2012-12-5 22:52:10 | 显示全部楼层
formatway是干啥的?
labaz 发表于 2012-12-5 01:38 PM


比如:
north、west、south、east、southwest 和 northeast
变成:north;west;south;east;southwest;northeast
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-12-5 23:19:02 | 显示全部楼层
回复 6# pos

l,w=wait.regexp("^\\s*这里.*的出口是\\s*.*。$")
forward=forward..";"..reverse[thisroomarray[j]]

上面不是已经有;的处理了吗?

另外最后获得的路径有压缩处理吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2012-12-6 01:30:56 | 显示全部楼层
  1. ---简化路径,剔除遍历时重复路径
  2. ---输入参数
  3. ---way string 标准路径字符串
  4. ---输出参数
  5. ---1 string 剔除重复路径后的标准路径字符串
  6. function simplifyway(way)
  7. if not string.find(way,";") then return way end

  8. local pos=0
  9. local lastpath=""
  10. local lastpathpos=0
  11. while string.find(way,"%a+%p",pos) do
  12. a,b=string.find(way,"%a+%p",pos)
  13. if lastpath==reverse[string.sub(way,a,b-1)] then
  14. way=string.sub(way,0,lastpathpos)..string.sub(way,b)
  15. lastpath=""
  16. lastpathpos=0
  17. pos=0
  18. else
  19. lastpath=string.sub(way,a,b-1)
  20. lastpathpos=pos
  21. pos=b
  22. end
  23. end

  24. if string.find(way,".*%a$") then
  25. a,b=string.find(way,"%p%a+$",pos)
  26. if lastpath==reverse[string.sub(way,a+1,b)] then
  27. way=string.sub(way,1,lastpathpos)
  28. end
  29. end

  30. way=formatway(way)
  31. return way
  32. end
复制代码


有时会出现第一个字符或最后一个字符是“;”,formatway可以处理掉。大部分时间是习惯的冗余处理。反正这个也不化服务器资源。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-3-30 11:35:51 | 显示全部楼层
mark学习下,总是搞不太懂递归
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-12-5 17:36:32 | 显示全部楼层
小弟初学mush,求formatway函数的内容,谁能贴出来?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-12-6 02:26:32 | 显示全部楼层
回复 8# wxkx

我在几个存储设备里找了20+min。。。以下代码的作者是楼主,借此怀念下pos
  1. --------------------------------------------------------------------------------------------------------------
  2. ---格式化路径字符串为";"间隔的标准路径字符串,
  3. ---输入参数
  4. ---way                        string                从游戏中抓取的路径字符串
  5. ---输出参数
  6. ---1                        sting                标准路径字符串
  7. --------------------------------------------------------------------------------------------------------------
  8. function formatway(way)
  9.         way=string.gsub(way," 和 ",";")
  10.         way=string.gsub(way,"、",";")
  11.         way=string.gsub(way," ",";")
  12.         way=string.gsub(way,"。",";")
  13.         if way=="" then return "" end
  14.         way=string.gsub(way,";+",";")
  15.         way=string.gsub(way,"^;+(.*)","%1")
  16.         way=string.gsub(way,"(.*);+$","%1")
  17.         return way
  18. end
复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 05:26 AM , Processed in 0.010897 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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