gzwd 发表于 2018-2-3 12:20:28

zmud721自带数据库创建过程

玩mud有数据库和无数据库对游戏体验个人感觉是巨大的,以前没数据库知识,机器人的很多功能很难实现,经过近2个星期的努力也算做了个半成品出来,以此留念以备以后查找。
       对于数据库,论坛里有不少关于数据库的介绍,大多数是外部数据库的使用,个人觉得721自带的数据库足够用了。要使用数据库必须的有数据,因此最开始就是数据的获取。里面的代码很多借鉴了论坛里其他人的代码,自己加以修改。
       房间信息的获取,开启log记录文件,把想要录取的房间走一遍,关闭log。在离线模式下,命令行输入#send /xxx/room.log      该命令可以把名字为room的log文件在zmud窗口全部逐行显示,xxx为文件夹,可以使用相对路径。
       #REGEX "test0" {^(\S+)\s\-\s+$} {#t+ catchroom;#var roomName %1}
#COND {(.*)} {#if (%regex( "%1", "^\s*(\S+)$")!=0) {#var roomDesc %1;#state test0 0} {#STATE test0 1}} {regex}
      这条tri是多行触发器,第一行 ^(\S+)\s\-\s+$是抓取房间名,匹配后打开catchroom这个类,将房间名赋值给变量roomName。第二行(.*)是获取匹配房间名后出现的所有行,当满足出现的行不为空行时停止抓取,并将该行赋值给roomDesc,其实就是房间描述的第一行。到此抓取房间名和房间描述完成,房间描述取一行个人认为足以。
#CLASS {catchroom}
#TRIGGER {^%s这里*的*{有|是} (*)。$} {#var dir {%1};#if (%pos( " ", @dir)!=0) {#var dir {%replace( @dir, " ", "")}};#if (%pos( "、", @dir)!=0) {#var dir {%replace( @dir, "、", "|")}};#if (%pos( "和", @dir)!=0) {#var dir {%replace( @dir, "和", "|")}};#var dir {%replace( %sort( @dir), "|", "-")};#var roomDesc @roomDesc;#var roomDesc %replace( @roomDesc, ",", "");#var roomFull @roomName++@roomDesc**@dir;#if (%ismember( @roomFull, @roomFullList)!=0) {#var successFlag 1} {#var successFlag 0};#if (@successFlag=0) {#var roomDirsList %additem( @dir, @roomDirsList);#var roomNameList %additem( @roomName, @roomNameList);#var roomDescList %additem( @roomDesc, @roomDescList);#var roomFullList %additem( @roomFull, @roomFullList)} {};#t- catchroom}
#CLASS 0
看着挺乱,粘贴上去就是这样的,没办法,慢慢解释吧。这个就刚才抓取房间名后打开的那个类catchroom里的tri.
#var dir {%1}
#if (%pos( " ", @dir)!=0) {#var dir {%replace( @dir, " ", "")}}
#if (%pos( "、", @dir)!=0) {#var dir {%replace( @dir, "、", "|")}}
#if (%pos( "和", @dir)!=0) {#var dir {%replace( @dir, "和", "|")}}
#var dir {%replace( %sort( @dir), "|", "-")}
这几行是将出口信息抓取出来,通过去“空格” 去“、” 去"和",最后在每个方向之间用-隔开,想用什么做分隔符可以自己定。

#var roomDesc @roomDesc
#var roomDesc %replace( @roomDesc, ",", "")
#var roomFull @roomName++@roomDesc**@dir
前2个命令是将房间描述自己给自己赋值转成乱码,然后去掉转成乱码后里面的,,为什么要去掉这个,,因为我发现在数据导入excel时会很麻烦,难以说清,自己可以去测试。
第3个命令将房间名、房间描述和出口方向组合成一个字符串,基本上这三者组合就可以唯一确定一个方向,有人会说如果这三者都一样呢?办法也是有的,只是没测试,不能证实正确性。


#if (%ismember( @roomFull, @roomFullList)!=0) {#var successFlag 1} {#var successFlag 0}
#if (@successFlag=0) {
#var roomDirsList %additem( @dir, @roomDirsList)
#var roomNameList %additem( @roomName, @roomNameList)
#var roomDescList %additem( @roomDesc, @roomDescList)
#var roomFullList %additem( @roomFull, @roomFullList)
} {}
#t- catchroom
该段代码是通过三者组合的变量roomFull去查找roomFullList这个list变量里面是否存在,如果存在,说明之前这个房间信息已经抓取,如果不存在,则将当前的房间名、房间描述、房间出口方向、房间三和一信息加入到roomNameList、roomDescList、roomDirsList和roomFullList。其实只需要加三和一信息就可以了,其他三个都可以从这个里面分隔出来。加这三个变量是为了验证和roomFullList数量是否一致。我的测试是描述List、方向List和roomFullList数量一致,房间名的数量少了,经过检查,发现有多个房间名合在了一起。为什么这样,不清楚,但十有八九是乱码搞的鬼,合在一起的都是有乱码的房间,所以说721的乱码问题是永远的痛啊。
   所有的房间信息都加入到roomFullList这个list变量后,下一步就是将里面的信息分隔出来。#ALIAS splitRoomList {#var roomNameList {};#var roomDescList {};#var roomDirsList {};#var temp {};#forall @roomFullList {#if (%regex( %i, "(\S+)\++(\S+)\*+(\S+)", roomName, roomDesc, dir)) {#var roomNameList %additem( %replace( @roomName, "+", ""), @roomNameList);#var roomDescList %additem( %replace( @roomDesc, "*", ""), @roomDescList);#var roomDirsList %additem( @dir, @roomDirsList)} {#var temp %additem( %i, @temp)}}}这个alias是将roomFullList里面的每一项逐个取出赋值给相应的房间名list、描述list、方向list.有了相应的list,就把这些信息写入文本文件里进行下一步处理。
#file 1 roomtable.txt
#loop %numitems( @roomFullList) {#wri 1 {%item( @roomNameList, %i)|%item( @roomDescList, %i)|%item( @roomDirsList, %i)|%item( @roomFullList, %i)|扬州:yz}}
#close 1
第1条命令,打开磁盘上名字叫roomtable.txt的文件,把它称呼为1.这个file命令,经测试,相对路径不能用,绝对路径不好使,不带路径,该文件在zmud.exe同路径下。
第2条命令是循环roomFullList变量list的数量次数,以此将各个list里的值写入到txt文本里。最后那个扬州:yz是新加的,说明这些信息属于扬州这个区域,属于额外信息,以备以后使用。
最后close 1关掉打开的文件。这样最初的房间信息可以拿到了。

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

gzwd 发表于 2018-2-3 12:51:18

自己做的数据库截图http://pkuxkx.net/forum/attachments/18020312343aa16d503e4b2222.jpg
过程
1、创建数据库
http://pkuxkx.net/forum/attachments/18020312451e586af520d29c53.jpg
http://pkuxkx.net/forum/attachments/1802031243f03ee80708cf5fd1.jpg
建立了一个叫bbb的数据库
2、建立字段
http://pkuxkx.net/forum/attachments/1802031243b5437c19b7baf748.jpg
添加全部字段
http://pkuxkx.net/forum/attachments/1802031243150d16fad87c0be6.jpg
3、导入数据
点击查看-导入
http://pkuxkx.net/forum/attachments/180203124351f64d762c8b56d5.jpg
选择经过你处理的数据,格式为txt或者csv都可以,最好是csv。

这样,数据库就完成了,有了数据库,通过find、query等数据库命令就可以对数据库进行相应的查询和操作,想实现什么功能可以自己去考虑了。

gzwd 发表于 2018-2-3 12:52:05

额,图有点乱,将就看吧。

eblisade 发表于 2018-2-3 13:41:43

先马一下~感觉现在721用户很少啊,作为721小白表示感谢

oolong 发表于 2018-2-3 13:49:05

回复 1# gzwd
奇迹竟然没乱码

gzwd 发表于 2018-2-3 14:35:47

回复 5# oolong
像这样大量的信息处理,没有乱码是不可能的,老话重提,721的乱码是最大的问题。每时每刻都在想着这乱码该怎么处理,会出各种各样的问题,调试起来非常痛苦,建议是能改mush就改用mush,721给有毅力的人坚守。{:7_278:}

gprs 发表于 2018-2-11 21:11:37

yct23

bitcoincash 发表于 2018-2-11 21:17:06

回复 6# gzwd

mush 不懂编程挺难用的。。

feishu 发表于 2018-3-24 22:09:15

mush对没有编程基础的人来说,上手很难。zmud上手容易。对我来说还是用zmud把
页: [1]
查看完整版本: zmud721自带数据库创建过程