北大侠客行MUD论坛

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

少林诵经全自动机器人设计思路,关键字:诵经、超度

[复制链接]
发表于 2013-1-14 00:24:56 | 显示全部楼层 |阅读模式
本帖最后由 ycryu 于 2013-1-13 04:32 PM 编辑

我设计的诵经机器人,核心是翻书。之前我看了几篇关于设计诵经机器人的思路,基本都有写死的内容,比如触发章

节名、记录章节内容,或者记录每个章节的起始页数等等。我不喜欢这种设计方案,因为巫师一旦调整经书章节或者

内容,机器人就停摆。我的目标是从一本书里面翻到我要的章节,不管它是本什么书,按照一套有规律的翻法,总能

找到我要的章节。

开场白之后,声明一个原则,“自己做的机器人才是最好的机器人”,我本人很反对拿来主义,而且也不符合“机器

人管理原则”,因此我在这里只讲设计思路,不提供完整机器人下载,

言归正传---------------------------------------华丽的分割线---------------------------------------

目标章节有三种类型:
一,某一章某一页,如:中阿含七法品世间福经第七(11)
“中阿含七法品世间福经第七”是章节名,(11)是这一章的第11页
二,某一章某一篇,如:大乘正宗分品第三(下)
“大乘正宗分品第三”是章节名,(下)是这一章的下篇,通常这一类章节只有两页或者三页,有多少页也不怕
三,某一章,如:法会因由分品第一
“法会因由分品第一”是章节名,这类章节通常是一篇一页,比较少,但是确实存在,必须考虑到

自动翻书机器人分为两个步骤:
我先讲步骤一,翻法,这里要用到三个变量:@nowPage(当前页数)、@eachPagingNum(每一翻页数)、@sumPage(总页数)
假如现在我手上有一本600页的书,则@sumPage = 600、@nowPage = 0、@eachPagingNum = 600 / 2 = 300
每一次翻@nowPage + @eachPagingNum页,一直翻到总页数不够
一旦翻到总页数不够,则从头再翻,再翻的时候,@eachPagingNum = @eachPagingNum / 2
结合这个600页书的例子,就是一翻300,二翻600,三翻提示超出,四翻150,五翻300,六翻450,七翻600,八翻提示超出,九翻75,十翻150,十一翻225,十二翻300...........................

翻法是一个大框架,现在讲步骤二,找章节,找章节是有技巧的,我会结合之前提到的三种类型的目标章节,介绍各
自的找法,这里要用到变量@rightPage(正确的页数)
类型一:中阿含七法品世间福经第七(11)
        我一翻下去,有三种结果:
        1、章节翻对了,章节页数也翻对了,这就是我要诵读的章节!@rightPage = @nowPage

        2、章节翻对了,但是章节页数没对上,比如我翻到了 中阿含七法品世间福经第七(42),没关系,目标章节
页数离此不远,@rightPage = @nowPage - 42 + 11,42和11都可以用变量取值,下一翻我就直接page @rightPage

        3、完全没翻着,章节都不对,那没什么好说的,让翻书的动作保持继续

类型二:大乘正宗分品第三(下)
        我一翻下去,有三种结果:
        1、章节翻对了,章节篇也翻对了,这就是我要诵读的章节!@rightPage = @nowPage

        2、章节翻对了,但是章节篇没对上,比如我翻到了 大乘正宗分品第三(中),没关系,目标章节篇离此不
远,我先把每一翻页数@eachPagingNum调整为-1,翻页动作保持继续,只是从 大乘正宗分品第三(中) 这里开始,
我一页一页往前翻,可是我一直翻到了上一章节还是没有找到呀,当我翻到上一章节还没找到的时候,我调整
@eachPagingNum为1,再一页一页往后翻。

        3、完全没翻着,章节都不对,那没什么好说的,让翻书的动作保持继续

类型三:法会因由分品第一
        我一翻下去,有两种结果:
        1、章节翻对了,这就是我要诵读的章节!@rightPage = @nowPage

        2、完全没翻着,章节都不对,那没什么好说的,让翻书的动作保持继续
        (这类型通常要等@eachPagingNum足够小,可能要到1的时候,才能翻到,好在这种书通常总页数不多)

以上内容的核心是获取@rightPage(正确的页数)
要诵经,除了要页数,还要内容,超度不需要内容,超度有页数就够了
诵经的内容怎么取?easy,看例子:

大乘正宗分品第三(下)
================================================================
==                                                            ==
==                    如是灭度无量无数无边                    ==
==                    众生实无众生得灭度者                    ==
==                    何以故须菩提若菩萨有                    ==
==                    我相人相众生相寿者相                    ==
==                    即非菩萨                                ==
==                                                            ==
================================================================
金刚经                                         第五页/总七十四页
上一页(pageup)/下一页(pagedown)                   诵经(chanting)


触发器:#tr {(%*)~((%*)~)$===*$==%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s==} {#var chantingContent {%1%2%3%4%5}}
这个触发器只能取得内容行数为5的经书内容,存到变量@chantingContent中,6行怎么写,7行怎么写,我就不复述
了,另外,(%*)~((%*)~)可以换成变量,减少触发器调用次数,提高效率,比如我有变量@chapterName存任务章节名
,@chapterPage存任务章节页,则
#tr {@chapterName~(@chapterPage~)$===*$==%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s(%x)%s==$==%s==} {#var chantingContent {%1%2%3%4%5}}
只有当正确的章节和正确的页数被翻到的时候,才触发取内容

有了@rightPage,也有了@chantingContent,诵经就可以#exec chanting @rightPage @chantingContent了

之前提了一下超度,可能有朋友没掌握超度的要领,我通过这几天的观察,抓核心给介绍一下
超度任务拿到之后,首先奔超度地点,把信交给高僧之后,就进入了灵堂,敲release start开始,高僧会提示现在读什
么经书,触发器现在抓住书名,过几秒钟,提示在读哪个章节,这个章节满足我之前提到的三种类型之一,触发器抓
住章节名,如果有章节页数,也抓住。现在就ask seng about 离开,退出灵堂,来到门口。调用翻书机器人,快速的
找到正确页数,找到之后,马上ask seng about 法事,进去就release chanting @rightPage,如果提示页数不对,马上
@rightPage = @rightPage + 1,再release chanting @rightPage,以此循环,要不了几下,就会提示,你必须在诵经的
一开始跟读,这时候只执行一个@rightPage = @rightPage + 1,就等着,直到出现“经书又翻了一页”,触发release chanting @rightPage,搞定。

由此可见,“release check 页数”这个指令,用不上,还未用上,就搞定了。

另外我想提一下包袱装经书的设计思路,不管是诵经,还是超度,来回跑藏经阁显然是不效率的,所有的书ID都是shu,怎么区分谁是谁呢?包袱。
领到诵经任务的时候,我可以抓到任务经书名字@shuName,我做一个get shu from bao fu的触发,每次从包袱取shu出来,对比一下拿出来的这本书的名字跟@shuName是否一致,不一致,继续拿,拿到一致的时候停,然后#8 put shu 2 in bao fu,这样,我身上就只剩一本任务经书了,其余的经书都进了包袱。

再送一个小提醒,汉字转阿拉伯数字,如五百二十七,转成527,这个论坛里面已经有这个帖子了,可以搜出来

最后再送一个小技巧,第一时间获取经书总页数@sumPage,你可以page 10000(没有哪本书有这么多页吧),会提示这本书总共只有多少页,这个触发非常重要,涉及第一翻,和以后的每一次翻超过

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-1-14 00:26:34 | 显示全部楼层
发一部分代码片段,@zs是我的注释,写注释是个好习惯:
#var zs "首先判断章节名对不对";
#if (%pos(@chapterName,%1) > 0) {#var zs "章节名如果对上了";
#var zs "看章节页数对不对";
#if (%begins(@chapterPage,%2)) {#var zs "如果章节页数也对上了";
#var zs "那这一页就是我要诵经的一页";
#wa 1000;
#var rightPage @nowPage;
#var zs "诵经的内容也在其它的触发器里面复制好了";
execOrders} {#var zs "如果章节页数不对";
#var zs "看看章节页数是不是数字";
#if (%isnumber(@chapterPage)) {#var zs "如果是数字可以计算出正确页数";
#wa 1000;
#var rightPage [@nowPage - %2 + @chapterPage];
page @rightPage;
} {#var zs "如果不是数字";
#var zs "起码章节我是找对了,因为不是数字,无法判断当前章节是第几页";
#var zs "我可以设置每一翻为-1,先让他一页一页往前翻";
#if (@eachPagingNum > 1) {#var eachPagingNum -1};
#wa 1000;
page [@nowPage + @eachPagingNum];
}}} {#var zs "章节名如果不对";
#var zs "我翻得不对,我要往后翻页";
#var zs "如果eachPagingNum = -1,特殊处理为1";
#if (@eachPagingNum < 0) {#var eachPagingNum 1};
#wa 1000;
page [@nowPage + @eachPagingNum];
}
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 08:12:27 | 显示全部楼层
翻书的过程还可优化一下,章节号是可以排序的,因此可以用对半法翻,比如600页的书要找第400页,第一翻300,然后450  375  413 394  。。。。最后趋向400
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-1-14 09:07:23 | 显示全部楼层
回复 4# alucar


    考虑过,不过在制作这个机器人的过程中,我脆弱的神经被摧残了一次又一次,呵呵,先是以为只有类型一,机器人初级原型完成后,跑了没多会儿,停了,一看,原来有类型二,重新设计,呵呵,又弄好了,跑了没多会儿,又停了,再看,发现了类型三。我有点儿怕了,就这样吧,免得蹦出了章节名不带号码的类型四
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 09:18:42 | 显示全部楼层
回复 5# ycryu


其实类型一里还分章节中的括号是全角的和半角的两种
这个只能说sg制作时的排版太不严谨了hoho
手动时对习惯做排版的同学是一种摧残
做机器人么就要多罗列一种情况
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 11:07:13 | 显示全部楼层
回复 3# yyahoo


    这个可以有
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-14 11:32:57 | 显示全部楼层
出气筒勋章真好看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-15 18:45:13 | 显示全部楼层
这个能算精华?太原始了吧?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-15 18:48:36 | 显示全部楼层
翻书方式碰到金刚经,碰一次死一次,除非你从第一页翻。当然金刚经只有74页。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-1-15 18:52:24 | 显示全部楼层
取书的方法也老土,先look bao,将所有书名放入一个数组,然后在数组中找到自己要的书和顺序号,直接拿出正确的书即可。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-21 06:19 AM , Processed in 0.011512 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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