请教高手解答,谢谢。
本帖最后由 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来获取变量的值。 DoAfter (1, "put " .. GetVariable("job_chai_yangshi") .. " " .. GetVariable("job_chai_buwei"))
附上一个我个人习惯的code风格(未经调试):
map_wood = {
["小段"] = "small",
["弯曲"] = "bending",
["直"] = "straight",
["大段"] = "large",
["光滑"] = "smooth",
["粗糙"] = "rough",
["树枝"] = "branch",
["树杈"] = "crotch",
["树干"] = "trunk",
["树根"] = "root",
}
^你从柴堆上拿走了一根(\S+)的(\S+)。$
DoAfter(1, "put " .. map_wood["%1"] .. " " .. map_wood["%2"])
本帖最后由 robotone 于 2014-8-2 10:48 AM 编辑
谢谢。Lua还没学,原来数组就没学好,业余选手学习中……
另一个问题,单引号和双引号的区别?
引号不能重复嵌套使用,要用的话可以单引号双引号嵌套,还有中括号。
DoAfterSpecial (5, 'EnableTriggerGroup ("mygroup", 1)', 12)
--[[
上面的例子中,最后一个参数(12)表示在 5 秒钟后把命令发送给脚本解析器
由于我们使用了单引号作为字符串的标识符,所以参数“mygroup”两边双引号不需要特殊处理就可以被作为正常双引号使用。
--]]
下面内容转自一个博客。
任何语言,首先要明白的是 标识符 的命名规则,LUA的规则和C语言的没太大分别都是由:字母,数字,下划线组成,而且不能以数字开头..
貌似我会的编程语言都是这样的规定.. 这个没啥技术难度....靠死记的..
LUA的字符串表示是可以用单引号或者双引号的...这点跟JAVASCRIPT是一样的,
在LUA手册里有一段这样的东西
http://www.cppblog.com/Images/OutliningIndicators/None.gif a =
' alo\n123" '
http://www.cppblog.com/Images/OutliningIndicators/None.gif a =
" alo\n123\ ""
http://www.cppblog.com/Images/OutliningIndicators/None.gif a =
' \97lo\10\04923" '
http://www.cppblog.com/Images/OutliningIndicators/None.gif a = [[alo
http://www.cppblog.com/Images/OutliningIndicators/None.gif 123 " ]]
http://www.cppblog.com/Images/OutliningIndicators/None.gif a = [ == [
http://www.cppblog.com/Images/OutliningIndicators/None.gif alo
http://www.cppblog.com/Images/OutliningIndicators/None.gif 123 " ]==]
http://www.cppblog.com/Images/OutliningIndicators/None.gif
手册里的解释是这样的
http://www.cppblog.com/Images/OutliningIndicators/None.gif字符串还可以用一种长括号括起来的方式定义。我们把两个正的方括号间插入 n 个等号定义为第 n 级正长括号。
就是说,0 级正的长括号写作 [[ ,一级正的长括号写作 [=[ ,如此等等。反的长扩展也作类似定义;举个例子,4 级反的长括号写作 ]====] 。
一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。整个词法分析过程将不受分行限制,不处理任何转意符,
并且忽略掉任何不同级别的长括号。这种方式描述的字符串可以包含任何东西,当然特定级别的反长括号除外。
http://www.cppblog.com/Images/OutliningIndicators/None.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gif另一个约定是,当正的长括号后面立即跟了一个换行符,这个换行符就不包含在这个字符串内。举个例子,
假设一个系统使用 ASCII 码(这时,'a' 编码为 97 ,换行符编码为 10 ,'1' 编码为 49 ),下面五种方式描述了完全相同的字符串:
http://www.cppblog.com/Images/OutliningIndicators/None.gif
很别扭啊手册里的介绍是这个a所代表的字符串显示都是一样的...感觉犯晕啊...
手册例子想表达的意思我解析一下,
a = 'alo\n123"'这个字符串是用单引号括起来的,123后面跟了个".....想表达的意思就是说,
如果用单引号作为字符串的引用的话,内部的双引号做双引号处理,
a = "alo\n123\"" 这个字符串则是用双引号括起来的,为了解决冲突,就要使用转义字符\"去代表"
a = '\97lo\10\04923"'这个其实就是ASCII码转义而已..
最令人犯晕的是下面.. http://www.cppblog.com/Images/OutliningIndicators/None.gifa = [==[
http://www.cppblog.com/Images/OutliningIndicators/None.gifalo
http://www.cppblog.com/Images/OutliningIndicators/None.gif123"]==]
这个想表达啥呢?其实这个作用和C#里的@""有点类似..有点像格式输出吧,,
里面的思想有个灵活的配对,"[["在手册里有个名字,叫长括号,而在"[==["中间的等号个数代表多少级的长括号,
没有等号为0级,1个等号为1级,类推下去.
开始在代码里,我以为这里"级"的意义在于这个字符串占多少行的意思,但是经过我代码的测试原来没任何关系..
依照我这个初学者的猜测...设置这些的意义,目的就是一个避免字符串内过多的使用转义字符吧,LUA的目标是要做嵌入脚本语言,
例如有个游戏的对白, http://www.cppblog.com/Images/OutliningIndicators/None.gif小孩说:"很牛啊"
http://www.cppblog.com/Images/OutliningIndicators/None.gif牛说:"不牛"
http://www.cppblog.com/Images/OutliningIndicators/None.gif牛说:"]]"
http://www.cppblog.com/Images/OutliningIndicators/None.gif小孩说:"]=]"
将以上字符
a=[==[
http://www.cppblog.com/Images/OutliningIndicators/None.gif小孩说:"很牛啊"
http://www.cppblog.com/Images/OutliningIndicators/None.gif牛说:"不牛"
http://www.cppblog.com/Images/OutliningIndicators/None.gif牛说:"]]"
http://www.cppblog.com/Images/OutliningIndicators/None.gif小孩说:"]=]"]==]
这样在[==[里就可以使用任何的字符串表达符,提供了更大的灵活性.
后来我咨询了下LUA高手他给我的答复如下
http://www.cppblog.com/Images/OutliningIndicators/None.gif这个是5.1版本新加的功能,我想主要的作用是屏蔽转义字符的作用的,在5.0的时候,我们写lua都需要自己可意去回避一些转义字符..
这个只是我个人想法,你可以问问其他人,目前我实际应用的开发都是5.0居多,这个是5.1新加的,我也不是很确定,但照字面意思..就算不全对,也差不多了
变量
LUA称为脚本语言,那么就注定了他的变量是弱类型的,就是说变量没有类型,至少我认识的脚本语言JAVASCRIPT就是没类型的.
所以姑且把脚本语言定义为变量没有类型的语言就是脚本语言
变量没有类型,有类型的只是值 (脚本语言的特点)
@food=="ganliang"是不能用的,"@food"才行。GetVariable ("food") == "ganliang"可以用。
@shuliang==1可以用,可能是默认的,数字就是数字型。
——————————————————————————————————————————————————————————
经验教训(经常把机器人完善一点,日积月累会很好用。)
本帖最后由 robotone 于 2014-9-3 12:35 PM 编辑每天把自己的机器人完善一点,日积月累会很好用。
1.0 .. 1 结果是 "01",当在一个数字后面写..时,必须加上空格以防止被解释错。
2.state和status的区别:state所指的状态,一般都是有限的、可列举的,status则是不可确定的。
3.#长度操作符。
record = { "one", "two", ["x"]=10, ["y"]=14,}
print (#record) --#是长度操作符。
print (record["x"])
local i=1
while record do
print (record)
i=i+1
end
local i = "123一二三"
print (#i)
4.[一二三]?是不能用的,汉字双字节,?是0或者1次。用[一二三]+或者[一二三]{0,2}。
在输出窗口选择文字的时候,可以半个半个选,这时候会是乱码。对中文支持不好。
5.a = {"windows","macos","linux",n=3}
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.找到个遍历的代码,参考学习。
lj={"s","w","w","e","e","n"}
bianli=function()
Note("开始走路遍历")
local i=tonumber(GetVariable("bianli_i"))
while lj do
Execute(lj)
local l=wait.regexp("^\\s*这里.*出口(.*)$",5)
while l==nil do
Note("刚才没过去,重新走")
Execute(lj)
l=wait.regexp("^\\s*这里.*出口(.*)$",5)
end
Note("0.3s后执行下一步")
i=i+1
SetVariable("bianli_i",i)
wait.time(0.3)
end
if lj==nil then Note("走完了") SetVariable("bianli_i",1) return end
end
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.游戏-立即执行,可以在窗口里写脚本命令。游戏-跟踪,可以看到客户端执行了什么操作,比如执行了哪个触发器,定时器。
问题汇总
lua数组的内容用while或者for可以一个一行print出来,怎么在一行print出来? lua数组的内容用while或者for可以一个一行print出来,怎么在一行print出来?robotone 发表于 2014-8-5 05:09 PM http://pkuxkx.net/forum/images/common/back.gif
t = {1, 2, 3}
print(table.concat(t, ","))
符合要求吗?
问题汇总
本帖最后由 robotone 于 2014-8-25 06:13 AM 编辑1.如何操作和保存脚本文件里的全局变量和table。
比如脚本文件里有个table,是空的。触发器里抓取到的信息追加到table里以后,可以print出来,知道table里有多少值,
可是在脚本文件里看不到table里的值,还是空的,重新读取脚本也一样。
如何把table里的值保存下来?存成mush变量?
好像脚本文件是只读的,mush改写了变量和table不会更改脚本文件,需要手动改写脚本文件。 回复 7# cappuccino
确实很酷... 我估摸着,不能用篆体,不然你直接大篆了... 1.如何操作和保存脚本文件里的全局变量和table。
比如脚本文件里有个table,是空的。触发器里抓取到的信息 ...
robotone 发表于 2014-8-20 05:20 PM http://pkuxkx.net/forum/images/common/back.gif
首先你得彻底弄清楚,在MUSH中lua的变量和MUSH这个软件自己的变量的关系及表达。MUSH中的变量是以SetVariable和GetVariable两个函数存储和读取。脚本中(lua里)可以用这两个函数读取MUSH变量,也可以自定义local和全局变量。
table表,在你不定义它为local变量时,即test_table={}和local test_table={}。它就会以lua变量的方式存在。调用方式就是test_table的模式。而要是把这个表格存储到MUSH变量里,用的方式是用serialize.lua这个mush自带的lua模块。在MUSH目录下lua子目录里能找到这个文件。使用方式如下代码:
require "serialize"
local myvar = { 1, 2, 8, 9 }
print (serialize.save ("myvar", myvar)) 不继续了?
学