|
首先声明,以下代码是从mush代码修改来的,不是原创,参考于本论坛作品:MUSH边用边学(抛砖引玉系列) ------- 白驼初见
https://www.pkuxkx.com/forum/forum.php?mod=viewthread&tid=42818&fromuid=24096
(出处: 北大侠客行MUD论坛)
初用mudlet发现,有些mush代码不能直接移植过来,特别是我作为新手,在学习入门经典教材白驼初见时,完全没看懂卖鱼环节关于汉字数字正常转阿拉伯数字的原理,
mudlet的入门比mush相对简单,我就在原作基础上,把新手卖鱼环节数字转换代码翻新,将string.sub改为utf8.sub,汉字按3字节计算后代码终于能够在mudlet上运行了。
1.以下是trigger的部分截图:
![file]()
2.中文mudlet的资料不多,虽然是新人,还是为mudlet的后来者做些贡献,以下是修改后的代码,各位见笑了:
```lua------------测试utf8.sub环节---------------------------------
--print("\n例子---------一百八十九---")
-- unit grade node
--print("\n"..utf8.sub(CHN,5,5)) --九---9
--print("\n"..utf8.sub(CHN,4,4)) --十---10
--print("\n"..utf8.sub(CHN,3,3)) --八---8
--print("\n"..utf8.sub(CHN,2,2)) --百---100
--print("\n"..utf8.sub(CHN,1,1)) --一---1
--print("例子-----------")
------------测试结束分隔线---------------------------------
------------代码正式部分--------------------
CHN =matches[2]
CHNum_tbl = { ["一"] = 1,["二"] = 2,["三"] = 3,["四"] = 4,["五"] = 5,["六"] = 6,["七"] = 7,["八"] = 8,["九"] = 9}
if (#CHN % 3) ~= 0 then --在mudlet的lua中,3个字节组成一个汉字,检测对象的字节长度如果不能被3整除,说明不是汉字,返回值为0,检测取消
return 0
end
result =0 --设定返回值结果初始值为0
unit =1 --设定数位单元值为1
grade =1 --设定数位权位值为1
for i = #CHN / 3 , 1 , -1 do
char = utf8.sub(CHN,i,i) --从检测对象的尾部截取第1个汉字,以供下面的代码进行判断
if char == "十" then --如果检测对象汉字为“十”
unit = 10*grade --设定权位系数10 ,万位以后的权位值发生质变,
if (i==1) then --如果检测对象位置为1,即是首位数字
result = result + unit --则返回值为数位值10
elseif CHNum_tbl[utf8.sub(CHN,i-1,i-1)] == nil then --如果检测对象的左边为“零”、“O”,或没有发现数字汉字
result = result + unit
end
elseif char == "百" then --如果检测对象汉字为“百”
unit = 100*grade --设定数位权位系数为100
elseif char == "千" then --如果检测对象汉字为“千”
unit = 1000*grade --设定数位权位系数为1000
elseif char == "万" then --如果检测对象汉字为“万”
unit = 10000*grade --设定数位权位系数为10000
grade = 10000 --从“万”开始,规则发生变化,权位“万”升级为节权位,数值为10000
else
if CHNum_tbl[char] ~= nil then --如果检测对象汉字不是“十”、“百”、“千”、“万”,而是“一”~“九”,则
result = result + CHNum_tbl[char]*unit --返回值为汉字转化为阿拉伯数字,并乘以权位值
--“个”位时,unit=1
--“十”位时,unit=10
--“百”位时,unit=100
--...
--“万”位时,unit=10000
--“万”位以后的“十”,unit=10*10000
--“万”位以后的“百”,unit=100*10000
--“万”位以后的“千”,unit=1000*10000
end
end
end
send("\nsell "..matches[3].." for "..result)
```
|
|