少林诵经全自动机器人设计思路,关键字:诵经、超度
本帖最后由 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 发一部分代码片段,@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];
} 翻书的过程还可优化一下,章节号是可以排序的,因此可以用对半法翻,比如600页的书要找第400页,第一翻300,然后450375413 394。。。。最后趋向400 回复 4# alucar
考虑过,不过在制作这个机器人的过程中,我脆弱的神经被摧残了一次又一次,呵呵,先是以为只有类型一,机器人初级原型完成后,跑了没多会儿,停了,一看,原来有类型二,重新设计,呵呵,又弄好了,跑了没多会儿,又停了,再看,发现了类型三。我有点儿怕了ttk_27,就这样吧,免得蹦出了章节名不带号码的类型四 回复 5# ycryu
其实类型一里还分章节中的括号是全角的和半角的两种
这个只能说sg制作时的排版太不严谨了hoho
手动时对习惯做排版的同学是一种摧残
做机器人么就要多罗列一种情况
yct59 回复 3# yhzzyahoo
这个可以有{:7_278:} 出气筒勋章真好看{:7_278:}
这个能算精华?太原始了吧? 翻书方式碰到金刚经,碰一次死一次,除非你从第一页翻。当然金刚经只有74页。 取书的方法也老土,先look bao,将所有书名放入一个数组,然后在数组中找到自己要的书和顺序号,直接拿出正确的书即可。