pos 发表于 2012-12-5 18:37:52

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

---遍历指定深度找房间
---输入参数       
---roomname               string                目标房间名称
---roomway                sting                目标房间出口
---wayarray   array                起步出口数组
---steps                number                遍历深度
---输出参数       
---1                Boolean                是否发现目标房间
---2                string                发现目标的完整路径
function goallwaytofind(roomname,roomway,thisroomarray,steps)
        local room="";        local way="";        local forward="";        local fw="";        local found=false

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

                l,w=wait.regexp("^\\s*这里.*的出口是\\s*(.*)。$")
                if string.find(l,"的出口是") then
                        way=w
                        forward=forward..";"..thisroomarray
                end

                if isrightroom(roomname,roomway,room,way,step_count) then
                        found=true
                        break
                elseif steps>1 then
                        if room="苗岭边缘" then way=removesamedirection(way,"southup") end
                        found,fw=goallwaytofind(roomname,roomway,splitway(removesamedirection(formatway(way),reverse])),steps-1)
                        forward=forward..";"..fw
                        if found then break end
                end
                               
                exe(reverse])
                l,w=wait.regexp("^\\s*这里.*的出口是\\s*.*。$")
                forward=forward..";"..reverse]
        end        ---for j in ipairs(bt) do

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

北大侠客行MUD,中国最好的MUD

labaz 发表于 2012-12-5 21:38:35

formatway是干啥的?

pos 发表于 2012-12-5 22:49:44

回复 4# labaz


把各种格式出口表述,变成用分号;为间隔的字符串

pos 发表于 2012-12-5 22:52:10

formatway是干啥的?
labaz 发表于 2012-12-5 01:38 PM http://pkuxkx.net/forum/images/common/back.gif

比如:
north、west、south、east、southwest 和 northeast
变成:north;west;south;east;southwest;northeast

labaz 发表于 2012-12-5 23:19:02

回复 6# pos

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

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

另外最后获得的路径有压缩处理吗?

pos 发表于 2012-12-6 01:30:56

---简化路径,剔除遍历时重复路径
---输入参数
---way string 标准路径字符串
---输出参数
---1 string 剔除重复路径后的标准路径字符串
function simplifyway(way)
if not string.find(way,";") then return way end

local pos=0
local lastpath=""
local lastpathpos=0
while string.find(way,"%a+%p",pos) do
a,b=string.find(way,"%a+%p",pos)
if lastpath==reverse then
way=string.sub(way,0,lastpathpos)..string.sub(way,b)
lastpath=""
lastpathpos=0
pos=0
else
lastpath=string.sub(way,a,b-1)
lastpathpos=pos
pos=b
end
end

if string.find(way,".*%a$") then
a,b=string.find(way,"%p%a+$",pos)
if lastpath==reverse then
way=string.sub(way,1,lastpathpos)
end
end

way=formatway(way)
return way
end


有时会出现第一个字符或最后一个字符是“;”,formatway可以处理掉。大部分时间是习惯的冗余处理。反正这个也不化服务器资源。

hijacker 发表于 2013-3-30 11:35:51

mark学习下,总是搞不太懂递归yct79

wxkx 发表于 2015-12-5 17:36:32

小弟初学mush,求formatway函数的内容,谁能贴出来?

cappuccino 发表于 2015-12-6 02:26:32

回复 8# wxkx

我在几个存储设备里找了20+min。。。以下代码的作者是楼主,借此怀念下pos--------------------------------------------------------------------------------------------------------------
---格式化路径字符串为";"间隔的标准路径字符串,
---输入参数
---way                        string                从游戏中抓取的路径字符串
---输出参数
---1                        sting                标准路径字符串
--------------------------------------------------------------------------------------------------------------
function formatway(way)
        way=string.gsub(way," 和 ",";")
        way=string.gsub(way,"、",";")
        way=string.gsub(way," ",";")
        way=string.gsub(way,"。",";")
        if way=="" then return "" end
        way=string.gsub(way,";+",";")
        way=string.gsub(way,"^;+(.*)","%1")
        way=string.gsub(way,"(.*);+$","%1")
        return way
end
页: [1]
查看完整版本: 初学mush,试写遍历代码,请各位高手指教