北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: robotone

少林和尚从零开始学Mush,真难啊。

[复制链接]
 楼主| 发表于 2014-7-27 17:41:59 | 显示全部楼层

请教高手解答,谢谢。

本帖最后由 robotone 于 2014-8-8 09:42 AM 编辑

^你从柴堆上拿走了一根(\S+)的(\S+)。$


if "%1"=="小段" then SetVariable ("job_chai_yangshi", "small") end
if "%1"=="弯曲" then SetVariable ("job_chai_yangshi", "bending") end
if "%1"=="直" then SetVariable ("job_chai_yangshi", "straight") end
if "%1"=="大段" then SetVariable ("job_chai_yangshi", "large") end
if "%1"=="光滑" then SetVariable ("job_chai_yangshi", "smooth") end
if "%1"=="粗糙" then SetVariable ("job_chai_yangshi", "rough") end
if "%2"=="树枝" then SetVariable ("job_chai_buwei", "branch") end
if "%2"=="树杈" then SetVariable ("job_chai_buwei", "crotch") end
if "%2"=="树干" then SetVariable ("job_chai_buwei", "trunk") end
if "%2"=="树根" then SetVariable ("job_chai_buwei", "root") end
DoAfter (1, "put @job_chai_yangshi @job_chai_buwei")
————————————————————————————————————————
问题是:DoAfter发送的命令里,变量还是触发前的。前边if更改了变量存在mush的变量列表中了,但是没有在DoAfter里用。
就是@job_chai_yangshi @job_chai_buwei。
用@展开变量,如果变量在这个触发器里SetVariable过,展开的结果是SetVariable以前的,要用GetVariable来获取变量的值。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2014-7-27 20:12:36 | 显示全部楼层
DoAfter (1, "put " .. GetVariable("job_chai_yangshi") .. " " .. GetVariable("job_chai_buwei"))

附上一个我个人习惯的code风格(未经调试):

  1. map_wood = {
  2.   ["小段"] = "small",
  3.   ["弯曲"] = "bending",
  4.   ["直"] = "straight",
  5.   ["大段"] = "large",
  6.   ["光滑"] = "smooth",
  7.   ["粗糙"] = "rough",
  8.   ["树枝"] = "branch",
  9.   ["树杈"] = "crotch",
  10.   ["树干"] = "trunk",
  11.   ["树根"] = "root",
  12. }

  13. ^你从柴堆上拿走了一根(\S+)的(\S+)。$
  14. DoAfter(1, "put " .. map_wood["%1"] .. " " .. map_wood["%2"])
复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-7-27 21:28:30 | 显示全部楼层
本帖最后由 robotone 于 2014-8-2 10:48 AM 编辑

谢谢。Lua还没学,原来数组就没学好,业余选手学习中……

另一个问题,单引号和双引号的区别?
引号不能重复嵌套使用,要用的话可以单引号双引号嵌套,还有中括号。
DoAfterSpecial (5, 'EnableTriggerGroup ("mygroup", 1)', 12)

--[[
上面的例子中,最后一个参数(12)表示在 5 秒钟后把命令发送给脚本解析器

由于我们使用了单引号作为字符串的标识符,所以参数“mygroup”两边双引号不需要特殊处理就可以被作为正常双引号使用。
--]]

下面内容转自一个博客。
   任何语言,首先要明白的是 标识符 的命名规则,LUA的规则和C语言的没太大分别都是由:字母,数字,下划线组成,而且不能以数字开头..
貌似我会的编程语言都是这样的规定..   这个没啥技术难度....靠死记的..
        LUA的字符串表示是可以用单引号或者双引号的...这点跟JAVASCRIPT是一样的,
        在LUA手册里有一段这样的东西
     a =
' alo\n123" '
     a
=
" alo\n123\ ""
     a =
' \97lo\10\04923" '
     a
= [[alo
     
123 " ]]
     a = [ == [
     alo
     
123 " ]==]


手册里的解释是这样的
字符串还可以用一种长括号括起来的方式定义。我们把两个正的方括号间插入 n 个等号定义为第 n 级正长括号。

就是说,0 级正的长括号写作 [[ ,一级正的长括号写作 [=[ ,如此等等。反的长扩展也作类似定义;举个例子,4 级反的长括号写作 ]====] 。
一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。整个词法分析过程将不受分行限制,不处理任何转意符,
并且忽略掉任何不同级别的长括号。这种方式描述的字符串可以包含任何东西,当然特定级别的反长括号除外。

另一个约定是,当正的长括号后面立即跟了一个换行符,这个换行符就不包含在这个字符串内。举个例子,

假设一个系统使用 ASCII 码(这时,'a' 编码为 97 ,换行符编码为 10'1' 编码为 49 ),下面五种方式描述了完全相同的字符串:



很别扭啊手册里的介绍是这个a所代表的字符串显示都是一样的...感觉犯晕啊...

手册例子想表达的意思我解析一下,
a = 'alo\n123"'  这个字符串是用单引号括起来的,123后面跟了个".....想表达的意思就是说,
如果用单引号作为字符串的引用的话,内部的双引号做双引号处理,
a = "alo\n123\"" 这个字符串则是用双引号括起来的,为了解决冲突,就要使用转义字符\"去代表"
a = '\97lo\10\04923"'  这个其实就是ASCII码转义而已..
最令人犯晕的是下面..
a = [==[
alo
123"]==]


这个想表达啥呢?其实这个作用和C#里的@""有点类似..有点像格式输出吧,,
里面的思想有个灵活的配对,"[["  在手册里有个名字,叫长括号,而在"[==["中间的等号个数代表多少级的长括号,
没有等号为0级,1个等号为1级,类推下去.

开始在代码里,我以为这里"级"的意义在于这个字符串占多少行的意思,但是经过我代码的测试原来没任何关系..
依照我这个初学者的猜测...设置这些的意义,目的就是一个避免字符串内过多的使用转义字符吧,LUA的目标是要做嵌入脚本语言,
例如有个游戏的对白,
小孩说:"很牛啊"
牛说:"不牛"
牛说:
"]]"
小孩说:
"]=]"


将以上字符
a=[==[
小孩说:"很牛啊"
牛说:
"不牛"
牛说:
"]]"
小孩说:
"]=]"]==]
这样在[==[里就可以使用任何的字符串表达符,提供了更大的灵活性.


后来我咨询了下LUA高手他给我的答复如下
这个是5.1版本新加的功能,我想主要的作用是屏蔽转义字符的作用的,在5.0的时候,我们写lua都需要自己可意去回避一些转义字符..

这个只是我个人想法,你可以问问其他人,目前我实际应用的开发都是5.0居多,这个是5.1新加的,我也不是很确定,但照字面意思..就算不全对,也差不多了

变量

LUA称为脚本语言,那么就注定了他的变量是弱类型的,就是说变量没有类型,至少我认识的脚本语言JAVASCRIPT就是没类型的.

所以姑且把脚本语言定义为变量没有类型的语言就是脚本语言

变量没有类型,有类型的只是值 (脚本语言的特点)

@food=="ganliang"是不能用的,"@food"才行。GetVariable ("food") == "ganliang"可以用。
@shuliang==1可以用,可能是默认的,数字就是数字型。
——————————————————————————————————————————————————————————
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2014-8-2 18:48:11 | 显示全部楼层

经验教训(经常把机器人完善一点,日积月累会很好用。)

本帖最后由 robotone 于 2014-9-3 12:35 PM 编辑

每天把自己的机器人完善一点,日积月累会很好用。

1.0 .. 1              结果是 "01",当在一个数字后面写..时,必须加上空格以防止被解释错。

2.state和status的区别:state所指的状态,一般都是有限的、可列举的,status则是不可确定的。

3.#长度操作符。

  1. record = { "one", "two", ["x"]=10, ["y"]=14,}
  2. print (#record)     --#是长度操作符。
  3. print (record["x"])
  4. local i=1
  5. while record[i] do
  6.     print (record[i])
  7.     i=i+1
  8. end
  9. local i = "123一二三"
  10. print (#i)
复制代码


4.[一二三]?是不能用的,汉字双字节,?是0或者1次。用[一二三]+或者[一二三]{0,2}。
   在输出窗口选择文字的时候,可以半个半个选,这时候会是乱码。对中文支持不好。

5.
  1. a = {"windows","macos","linux",n=3}

  2. for k,v in pairs(a) do print(k,v) end
复制代码

k的意思是key,索引。v的意思是value,值。in pairs(a)意思是k,v成双成对在数组a里。
Lua的逻辑和逻辑运算很奇怪,有就是真,and和or不是返回逻辑真假,是返回值,值不是nil和false都为真。
所以for k,v in pairs(a)的意思是,直到表的尽头。

6.SetOption ("enable_triggers", 1)启用触发器。Mush没有像Zmud开启关闭触发器那样的按钮,可以自己做别名。
还能启用或者关闭 别名、脚本、快速行走、定时器。
enable_aliases
enable_scripts
enable_speed_walk
enable_timers
enable_triggers
可以把这些做成别名,放在快捷键F2-F12里用。

7.手动走了 {n;w;n;n;e.....}等步骤,怎么逆转回到我的出发地
   利用数组来解决
   将来做个自动往回走的功能,在一个地方输入:mark,然后不管手动还是自动走,输入:back,都能走回去。
   多次mark以后,每次back能走到上一个mark的地点。

8.找到个遍历的代码,参考学习。


  1. lj={"s","w","w","e","e","n"}
  2. bianli=function()
  3.                Note("开始走路遍历")
  4.                local i=tonumber(GetVariable("bianli_i"))
  5.         while lj[i] do
  6.           Execute(lj[i])
  7.           local l=wait.regexp("^\\s*这里.*出口(.*)$",5)
  8.           while l==nil do
  9.        Note("刚才没过去,重新走")
  10.        Execute(lj[i])
  11.        l=wait.regexp("^\\s*这里.*出口(.*)$",5)
  12.    end
  13.           Note("0.3s后执行下一步")
  14.           i=i+1
  15.           SetVariable("bianli_i",i)
  16.    wait.time(0.3)
  17.   end
  18.        if lj[i]==nil then Note("走完了") SetVariable("bianli_i",1) return end  
  19. end
  20. end)
复制代码


9.lua中pairs()和ipairs()的区别。
tbl = {"alpha", "beta", ["one"] = "uno", ["two"] = "dos"}
for key, value in ipairs(tbl) do
print(key, value)
end
--pairs()
--pairs()函数基本和ipairs()函数用法相同, 区别在于pairs()可以遍历整个table, 即包括数组及非数组部分.
-->如有pairs迭代输出如下:
-->1 alpha
-->2 beta
-->one uno
-->two dos
-->如有ipairs迭代输出如下:
--ipairs()
--ipairs()函数用于遍历table中的数组部分.
-->1 alpha
-->2 beta

10.You require a special briefing.
     你需要一份特别情况的简报。
table.concat(table, sep,  start, end)

table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长.

sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数.

a = {"windows","macos","linux",n=3}
require "tprint"
tprint (a)
print(table.concat(a, ","))
输出:
1="windows"
2="macos"
3="linux"
"n"=3
windows,macos,linux


11.做好的触发器,内容是发送给脚本,没有执行的命令,不知道有没有触发,可以改变颜色和样式,或者勾选下划线,能触发的话就很容易识别。

12.用EnableTriggerGroup()开关触发器组的时候,如果触发器组不存在,不会报错。

13.登录游戏前,把临时触发器,别名,定时器删除掉。
DeleteTemporaryAliases()  删除所有的临时别名。
DeleteTemporaryTimers () 删除所有的临时定时器。
DeleteTemporaryTriggers()  删除所有的临时触发器。

14.skbrief XXX可以查询武功等级。verify XXX可以查询武功的用法。
skbrief force
#33/986


verify hunyuan-yiqi
┌【混元一气功功能表】───────────────────────┐
│等级:  初窥门径  47/     0         类别:  martial               │  
│                                                                  │
│特殊技能:                                                        │
│      内功(force)                                                 │
├─────────────────────────────────┤
│内功方面(exert + ):                                              │
│      heal           lifeheal       roar                          │
└─────────────────────────────────┘

15.Wiki过时了,查东西在论坛搜索更实用。

16.发送到游戏立即执行,会打断文字,造成不能触发。
ask daoguo about 失败
你向道果禅师打听有关
save
『失败』的消息。
道果禅师说道:「已经帮你取消了诵经任务。」

17.游戏-立即执行,可以在窗口里写脚本命令。游戏-跟踪,可以看到客户端执行了什么操作,比如执行了哪个触发器,定时器。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2014-8-5 17:09:09 | 显示全部楼层

问题汇总

lua数组的内容用while或者for可以一个一行print出来,怎么在一行print出来?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2014-8-6 01:12:27 | 显示全部楼层
lua数组的内容用while或者for可以一个一行print出来,怎么在一行print出来?
robotone 发表于 2014-8-5 05:09 PM

  1. t = {1, 2, 3}
  2. print(table.concat(t, ","))
复制代码
符合要求吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2014-8-20 17:20:45 | 显示全部楼层

问题汇总

本帖最后由 robotone 于 2014-8-25 06:13 AM 编辑

1.如何操作和保存脚本文件里的全局变量和table。
比如脚本文件里有个table,是空的。触发器里抓取到的信息追加到table里以后,可以print出来,知道table里有多少值,
可是在脚本文件里看不到table里的值,还是空的,重新读取脚本也一样。
如何把table里的值保存下来?存成mush变量?

好像脚本文件是只读的,mush改写了变量和table不会更改脚本文件,需要手动改写脚本文件。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2014-11-3 11:19:25 | 显示全部楼层
回复 7# cappuccino


    确实很酷... 我估摸着,不能用篆体,不然你直接大篆了...
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2014-11-4 08:02:56 | 显示全部楼层
1.如何操作和保存脚本文件里的全局变量和table。
比如脚本文件里有个table,是空的。触发器里抓取到的信息 ...
robotone 发表于 2014-8-20 05:20 PM



        首先你得彻底弄清楚,在MUSH中lua的变量和MUSH这个软件自己的变量的关系及表达。MUSH中的变量是以SetVariable和GetVariable两个函数存储和读取。脚本中(lua里)可以用这两个函数读取MUSH变量,也可以自定义local和全局变量。
        table表,在你不定义它为local变量时,即test_table={}和local test_table={}。它就会以lua变量的方式存在。调用方式就是test_table[key]的模式。而要是把这个表格存储到MUSH变量里,用的方式是用serialize.lua这个mush自带的lua模块。在MUSH目录下lua子目录里能找到这个文件。使用方式如下代码:

  1.       require "serialize"
  2.       local myvar = { 1, 2, 8, 9 }
  3.       print (serialize.save ("myvar", myvar))
复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-1-1 23:58:46 | 显示全部楼层
不继续了?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 10:34 AM , Processed in 0.012227 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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