bbz 发表于 2015-3-5 23:09:38

Mush,怎么抓取带有换行的房间描述

请问在Mush里面怎么把带有换行的房间描述抓出来吗?

我试了向下面这样写的触发器
(.+) \- \n    (.+)
setVar("room_desc","%0")

但提示报错
:1: unfinished string near '"东门 - '

试过了 string.gsub("%0","\n","")也不行

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

ltblue 发表于 2015-3-11 15:29:26

新人看不懂啊
.+应该是任一信息
\-是啥?就是-是么......
\n是换行?
然后你就是抓了一个房间名,一个描述,是吗?
可是这个没看到多行,只有一个换行符是吧?
应该是\n   (.+)好几个是吧?描述多行啊
另外,为什么有这么几个空格呢?不能用\s\s之类的吗?不确定了

cappuccino 发表于 2015-3-11 15:57:19

2012年的代码,现在应该不能直接用了。只提供个思路,其他请自行领悟。room={
        new = function ()
                local _R = {}
                setmetatable(_R, {__index = room})
                return _R
        end,
        relations={},
        name = "",
        descriptions = {},
        exits = {},
        items = {},
}
function look (direction)
--~ 得到direction方向上房间的look信息并返回,如果direction为空则look当前房间。返回信息举例:
--~ "items":
--~   1="店小二(xiao er)"
--~ "name"="醉仙楼"
--~ "descriptions":
--~   1="方圆数百里内提起醉仙楼可以说是无人不知,无人不晓。当年苏学士云游到"
--~   2="此,对醉仙楼的花雕酒赞不绝口,欣然为其题匾,留下一段传遍海内的佳话,从"
--~   3="此醉仙楼名声大震。楼下布置简易,顾客多是匆匆的行人,买点包子、鸡腿、米"
--~   4="酒就赶路去了。楼上是雅座。"
--~ "exits":
--~   1="up"
--~   2="west"
--~ "relations":
--~   1="醉仙楼二楼"
--~   2="〓"
--~   3="北大街----醉仙楼"
        R = room.new()
        R.relations = {}
        R.descriptions = {}
        R.exits = {}
        R.items = {}
        r = {}
        Send("set action draw_room")
        if direction then
                run("look " .. direction)
        else
                run("look")
        end
        Send("set action q")
        Send("set action draw_end")
        l,w = wait.regexp('设定环境变量:action = "draw_room"')
        while true do
                l,w = wait.regexp(".*")
                if string.find(l, "风景要慢慢的看。") then
                        wait.time(2)
                        return look(direction)
                end
                if string.find(l,'设定环境变量:action = "draw_end"') or string.find(l,'设定环境变量:action = "q"') then break end
                table.insert(r, l)
        end
        --处理房间信息
        local m = { name = rex.new("^(\\S+) \\- $"),
                                exits = rex.new("这里.*的出口是(.*)"),
                                ex = rex.new("(\\w+)"),
                                weather = rex.new("「.*」: .*。"),
                        }
        for i, v in pairs(r) do
                if string.sub(v,1,1) == ">" then
                        r = string.sub(v, 3, string.len(v))
                end
                if m.name:match(v) then
                        _, _, R.name = m.name:match(v)
                        R.name = R.name
                        for j = 1, i-1 do
                                if string.sub(r,3,5) == "   " then
                                        r = trim(r)
                                        if r ~= nil and r ~= "" then
                                                table.insert(R.relations,r)
                                        end
                                end
                        end
                        for j = i+1, #r do
                                if m.exits:match(r) then
                                        while m.ex:match(r) do
                                                local _, _, ex = m.ex:match(r)
                                                if ex == nil then break end
                                                ex = ex
--~                                                 print(ex)
                                                local pos_start, pos_end = string.find(r,ex)
--~                                                 r, _ = string.gsub(r, ex, "")
                                                r = string.sub(r, pos_end + 1, string.len(r))
                                                if not is_Special_exits(ex) then
                                                        table.insert(R.exits,ex)
                                                end
                                        end
                                        --武当广场的出口太多会被分成两行
                                        if R.name == "武当广场" then
                                                print("对武当广场的特殊处理!")
                                                table.insert(R.exits, "southeast")
                                                table.insert(R.exits, "southdown")
                                        end
                                        table.sort(R.exits, function (v1,v2) return precede_exits<precede_exits end)
                                        for k = i+1, j-1 do
                                                r=trim(r)
                                                if r ~= nil and r ~= "" then
                                                        table.insert(R.descriptions, r)
                                                end
                                        end
                                        if #R.descriptions - 1 > 0 and m.weather:match(R.descriptions[#R.descriptions - 1]) then
                                                table.remove(R.descriptions, #R.descriptions - 1)
                                        end
                                        if m.weather:match(R.descriptions[#R.descriptions]) then
                                                table.remove(R.descriptions, #R.descriptions)
                                        end
                                        for k = j+1, #r do
                                                r=trim(r)
                                                if r ~= nil and r ~= "" then
                                                        table.insert(R.items, string.lower(r))
                                                end
                                        end
                                end
                        end
                        break
                end
        end
        return R
end

ltblue 发表于 2015-3-11 16:26:52

思路大概知道,代码看不懂啊......
一点点问哈

开头部分,room部分,是定义了一个类,有个构造函数,但里面的就不懂了
setmetatable是干什么?百度了一下,看不懂啊......

ltblue 发表于 2015-3-11 16:31:35

44行:l,w = wait.regexp('设定环境变量:action = "draw_room"')
以上的部分基本明白,初始化对象(其实可以放进构造函数里吧?),然后发送游戏命令l+方向,如果没方向就只l。
但44行,wait.regexp命令就不是很明白了,貌似是等待这条消息回来之后(记得还有个参数是最高等待时间吧?如果省略是不是就是无限等下去?),把内容存到l,w里去?
可是l,w是啥意思啊?为什么可以有两个变量后面加赋值的?难道后面的也是两个?没发现啊,奇怪的lua

ltblue 发表于 2015-3-11 16:33:38

还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗?

ltblue 发表于 2015-3-11 16:33:42

还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗?

cappuccino 发表于 2015-3-11 16:36:47

回复 4# ltblue


    我也不懂,生搬的。lua的一个特性吧,这里借助它实现面向对象。。想具体了解可以翻翻《lua程序设计》

ltblue 发表于 2015-3-11 16:37:49

一直到52行,table.insert(r, l)基本明白意识了
刚才想了一下,隐约记得好像是l,w=XXX,就是两者都=XXX的意思是吗?
这段的意思,大概就是读入信息,直到输出的结束语句
然后把信息插入链表r?这个52行命令是这个意思吧?

cappuccino 发表于 2015-3-11 16:39:07

回复 5# ltblue


    这个函数有两个返回值。就像a, b = 1, 2那样——lua是这么支持的
页: [1] 2 3 4 5
查看完整版本: Mush,怎么抓取带有换行的房间描述