北大侠客行MUD论坛

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

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

[复制链接]
发表于 2015-3-5 23:09:38 | 显示全部楼层 |阅读模式
请问在Mush里面怎么把带有换行的房间描述抓出来吗?

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

但提示报错
[string "触发器: "]:1: unfinished string near '"东门 - '

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

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 15:29:26 | 显示全部楼层
新人看不懂啊
.+应该是任一信息
\-是啥?就是-是么......
\n是换行?
然后你就是抓了一个房间名,一个描述,是吗?
可是这个没看到多行,只有一个换行符是吧?
应该是\n   (.+)好几个是吧?描述多行啊
另外,为什么有这么几个空格呢?不能用\s\s之类的吗?不确定了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 15:57:19 | 显示全部楼层
2012年的代码,现在应该不能直接用了。只提供个思路,其他请自行领悟。
  1. room={
  2.         new = function ()
  3.                 local _R = {}
  4.                 setmetatable(_R, {__index = room})
  5.                 return _R
  6.         end,
  7.         relations={},
  8.         name = "",
  9.         descriptions = {},
  10.         exits = {},
  11.         items = {},
  12. }
  13. function look (direction)
  14. --~ 得到direction方向上房间的look信息并返回,如果direction为空则look当前房间。返回信息举例:
  15. --~ "items":
  16. --~   1="店小二(xiao er)"
  17. --~ "name"="醉仙楼"
  18. --~ "descriptions":
  19. --~   1="方圆数百里内提起醉仙楼可以说是无人不知,无人不晓。当年苏学士云游到"
  20. --~   2="此,对醉仙楼的花雕酒赞不绝口,欣然为其题匾,留下一段传遍海内的佳话,从"
  21. --~   3="此醉仙楼名声大震。楼下布置简易,顾客多是匆匆的行人,买点包子、鸡腿、米"
  22. --~   4="酒就赶路去了。楼上是雅座。"
  23. --~ "exits":
  24. --~   1="up"
  25. --~   2="west"
  26. --~ "relations":
  27. --~   1="醉仙楼二楼"
  28. --~   2="〓"
  29. --~   3="北大街----醉仙楼"
  30.         R = room.new()
  31.         R.relations = {}
  32.         R.descriptions = {}
  33.         R.exits = {}
  34.         R.items = {}
  35.         r = {}
  36.         Send("set action draw_room")
  37.         if direction then
  38.                 run("look " .. direction)
  39.         else
  40.                 run("look")
  41.         end
  42.         Send("set action q")
  43.         Send("set action draw_end")
  44.         l,w = wait.regexp('设定环境变量:action = "draw_room"')
  45.         while true do
  46.                 l,w = wait.regexp(".*")
  47.                 if string.find(l, "风景要慢慢的看。") then
  48.                         wait.time(2)
  49.                         return look(direction)
  50.                 end
  51.                 if string.find(l,'设定环境变量:action = "draw_end"') or string.find(l,'设定环境变量:action = "q"') then break end
  52.                 table.insert(r, l)
  53.         end
  54.         --处理房间信息
  55.         local m = { name = rex.new("^(\\S+) \\- $"),
  56.                                 exits = rex.new("这里.*的出口是(.*)"),
  57.                                 ex = rex.new("(\\w+)"),
  58.                                 weather = rex.new("「.*」: .*。"),
  59.                         }
  60.         for i, v in pairs(r) do
  61.                 if string.sub(v,1,1) == ">" then
  62.                         r[i] = string.sub(v, 3, string.len(v))
  63.                 end
  64.                 if m.name:match(v) then
  65.                         _, _, R.name = m.name:match(v)
  66.                         R.name = R.name[1]
  67.                         for j = 1, i-1 do
  68.                                 if string.sub(r[j],3,5) == "   " then
  69.                                         r[j] = trim(r[j])
  70.                                         if r[j] ~= nil and r[j] ~= "" then
  71.                                                 table.insert(R.relations,r[j])
  72.                                         end
  73.                                 end
  74.                         end
  75.                         for j = i+1, #r do
  76.                                 if m.exits:match(r[j]) then
  77.                                         while m.ex:match(r[j]) do
  78.                                                 local _, _, ex = m.ex:match(r[j])
  79.                                                 if ex == nil then break end
  80.                                                 ex = ex[1]
  81. --~                                                 print(ex)
  82.                                                 local pos_start, pos_end = string.find(r[j],ex)
  83. --~                                                 r[j], _ = string.gsub(r[j], ex, "")
  84.                                                 r[j] = string.sub(r[j], pos_end + 1, string.len(r[j]))
  85.                                                 if not is_Special_exits(ex) then
  86.                                                         table.insert(R.exits,ex)
  87.                                                 end
  88.                                         end
  89.                                         --武当广场的出口太多会被分成两行
  90.                                         if R.name == "武当广场" then
  91.                                                 print("对武当广场的特殊处理!")
  92.                                                 table.insert(R.exits, "southeast")
  93.                                                 table.insert(R.exits, "southdown")
  94.                                         end
  95.                                         table.sort(R.exits, function (v1,v2) return precede_exits[v1]
  96.                                         for k = i+1, j-1 do
  97.                                                 r[k]=trim(r[k])
  98.                                                 if r[k] ~= nil and r[k] ~= "" then
  99.                                                         table.insert(R.descriptions, r[k])
  100.                                                 end
  101.                                         end
  102.                                         if #R.descriptions - 1 > 0 and m.weather:match(R.descriptions[#R.descriptions - 1]) then
  103.                                                 table.remove(R.descriptions, #R.descriptions - 1)
  104.                                         end
  105.                                         if m.weather:match(R.descriptions[#R.descriptions]) then
  106.                                                 table.remove(R.descriptions, #R.descriptions)
  107.                                         end
  108.                                         for k = j+1, #r do
  109.                                                 r[k]=trim(r[k])
  110.                                                 if r[k] ~= nil and r[k] ~= "" then
  111.                                                         table.insert(R.items, string.lower(r[k]))
  112.                                                 end
  113.                                         end
  114.                                 end
  115.                         end
  116.                         break
  117.                 end
  118.         end
  119.         return R
  120. end
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:26:52 | 显示全部楼层
思路大概知道,代码看不懂啊......
一点点问哈

开头部分,room部分,是定义了一个类,有个构造函数,但里面的就不懂了
setmetatable是干什么?百度了一下,看不懂啊......
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:31:35 | 显示全部楼层
44行:l,w = wait.regexp('设定环境变量:action = "draw_room"')
以上的部分基本明白,初始化对象(其实可以放进构造函数里吧?),然后发送游戏命令l+方向,如果没方向就只l。
但44行,wait.regexp命令就不是很明白了,貌似是等待这条消息回来之后(记得还有个参数是最高等待时间吧?如果省略是不是就是无限等下去?),把内容存到l,w里去?
可是l,w是啥意思啊?为什么可以有两个变量后面加赋值的?难道后面的也是两个?没发现啊,奇怪的lua
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:33:38 | 显示全部楼层
还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:33:42 | 显示全部楼层
还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:36:47 | 显示全部楼层
回复 4# ltblue


    我也不懂,生搬的。lua的一个特性吧,这里借助它实现面向对象。。想具体了解可以翻翻《lua程序设计》
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:37:49 | 显示全部楼层
一直到52行,table.insert(r, l)基本明白意识了
刚才想了一下,隐约记得好像是l,w=XXX,就是两者都=XXX的意思是吗?
这段的意思,大概就是读入信息,直到输出的结束语句
然后把信息插入链表r?这个52行命令是这个意思吧?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-11 16:39:07 | 显示全部楼层
回复 5# ltblue


    这个函数有两个返回值。就像a, b = 1, 2那样——lua是这么支持的
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 11:28 AM , Processed in 0.014046 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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