初学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 formatway是干啥的? 回复 4# labaz
把各种格式出口表述,变成用分号;为间隔的字符串 formatway是干啥的?
labaz 发表于 2012-12-5 01:38 PM http://pkuxkx.com/forum/images/common/back.gif
比如:
north、west、south、east、southwest 和 northeast
变成:north;west;south;east;southwest;northeast 回复 6# pos
l,w=wait.regexp("^\\s*这里.*的出口是\\s*.*。$")
forward=forward..";"..reverse]
上面不是已经有;的处理了吗?
另外最后获得的路径有压缩处理吗? ---简化路径,剔除遍历时重复路径
---输入参数
---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可以处理掉。大部分时间是习惯的冗余处理。反正这个也不化服务器资源。 mark学习下,总是搞不太懂递归yct79 小弟初学mush,求formatway函数的内容,谁能贴出来? 回复 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]