alrighty 发表于 2014-4-4 14:20:04

推广一下tintin++

其实是探讨怎么做一个容易用的mapper,然后改造一下tintin自带的mapper。
假定有完善的地图数据的情况下,可以把行走变得简单。北侠的地图很复杂,要自动处理所有的地图很困难。这里简单探讨一下非迷宫地图就好了。
当然了,用其他的客户端做这些也没问题。

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

alrighty 发表于 2014-4-4 14:24:33

改造目标
实现几个命令(alias)从而简化机器人的制作。
1。 ablareas {区域名称列表} {停止标识} {命令}
       功能:自动遍历区域内所有房间,停留在有停止标志的房间之后,执行命令。
       应用场景举例:
       韩员外说道:韩家仇人%1(%2)据传在%3、%4、%5三处出现过,快去找到他帮我杀了他!
       触发: ablareas {%3;%4;%5}{%1}{hihi}
2。ablarearoom {区域名称}{距离x}{房间名称}{深度y}{遍历停止标识}{命令}
      功能:自动遍历距离区域x步之内,名称符合的房间。附加y步深度之内房间,停留在有停止标志的房间之后,执行命令。
       应用场景举例:
       韩员外说道:韩家仇人%1(%2)据传在『%3』出现过,快去帮我杀了他!
       finder告诉你:【%1(%2)】目前在【%4】,快去摁死它吧!
       触发: ablarearoom {%3}{x}{%4}{y}{%1}{hihi}      
       说明: 比如npc出现在中原,finder说在石阶,可能就是在少林寺的石阶。所以,任何一个名叫石阶的房间,如果距离中原任何一个房间在x步之内,就要搜索。为了对付npc移动,石阶y步之内的房间也要搜索。
       如果确定是区域内的房间,x=0就可以了。
       npc不会移动?你真乐观。 y=0就可以了。
3。arun {编号}{命令}
      功能:行走到编号房间,执行命令。
      说明:mapper确定走到目标房间之后,才会执行命令。
实现了这几个命令,应该就可以对付差不多的跑路需求了。

hahh 发表于 2014-4-4 14:36:51

膜拜牛人,等下面的干货

alrighty 发表于 2014-4-4 14:45:13

画完了大饼, 下面开始讨论正题。

首先讨论一些跑路的基本问题:
1。搜索点对点路径的算法:优化的dijkstra算法。(这是tintin++中mapper使用的算法,就是实现的有点惨不忍睹。)
      优点:速度足够快。
                保证首先搜索消耗(weight)低的路径。
2。搜索一条走过n个指定房间的算法。
      这个没有好的方法。但是利用优化的dijkstra算法,一个一个的搜索过去,搜出来的路径也是可以接受的。对于区域遍历而言,应该没有人工优化的遍历路径高效。但是在正确设置路径消耗的情况下,结果也是可以接受的。优点在于灵活性,随便指定图中n个房间,自动就可以搜索过去。

alrighty 发表于 2014-4-6 06:18:17

跑路不只是搜索路径。

搜索出一条路径之后,不能简单的把命令一股脑的发出去。
跑路的过程中有很多的特殊情况要处理,这就要求mapper每发出一些命令,都要判断实际情况,再决定下一步的行动。
比较常见的情况:
1。 一秒钟20个命令的限制
2。遇到不能连续行走的路径,比如坐船,比如需要招呼一下看门的。

这种情况下,mapper就需要知道某些出口比较特殊,发出命令之后,需要等待确认进入下一个房间,可以继续行走之后,才能发出下一个命令。

tintin++的mapper中,出口是不包含这些特殊的信息的。所以需要一下扩展:
1。记录特殊出口信息,发出特殊出口命令之后,暂停,(#map exitflag e check)
2。根据mud反馈,通知mapper继续 (#map ok)

jiangliuer 发表于 2014-4-6 13:39:45

完全鸭子听雷~ yct16

alrighty 发表于 2014-4-6 15:19:59

跑路要跟踪进度

跑路的过程中,需要跟踪自己每一步的进度。这里有两层含义:
      1。mapper认为跑到哪里了。
      2。mud里实际到哪里了。
      例如,从ct输入个n,w。mapper认为你已经到了钱庄了。但是网络卡啊,你才走到北大街。这时候看见目标了,就必须知道目标其实是在北大街,而不是钱庄。
      
      具体的做法就是,每走一步都注意一下房间名。
      例如,从ct出发,mapper就设置一个触发,“下一站北大街”。你看见了北大街, 就告诉mapper,然后立刻设置下一个触发,“下一站扬州钱庄”。
      
      这样做还可以检测是否迷路了。具体就不说了。

alrighty 发表于 2014-4-6 15:26:05

为了一次完美的跑路,都需要做那些准备?

1。 告诉mapper现在在哪个房间,方法有:
       A。告诉系统: 比如刚登陆进来,告诉系统你在客店, (#map go 1)
       B。传说中的GPS,这个就不讨论了。你问为啥?因为“风景要慢慢看”就是这么来的。
       当然这个做一次就可以了,只要不迷路, 就不需要再设置了。
2。 设置停止标志和命令,告诉系统你要找什么,找到目标之后做什么。(map_stop_setup {岳不群}{hihi yue buqun})

3。 路尽头命令,路跑完了,没找到目标,做点啥呢?比如扩大搜索范围或者跑回去要个奖励看看是不是可以糊弄过去。(map_eop_setup {idle})
      
4。进入目标房间命令。(map_metr_setup {zhaohuoji})
      例如你要去茶花院找伙计,那么多不同颜色的院子,得一个一个的找过去。这个命令告诉mapper进入每个茶花院都执行着伙计。
6。迷路命令,不具体讲了。
7。看门狗命令,不具体讲了。

做好以上的准备之后,就可以开始跑路了。

注: 蓝色的命令是要具体实现的tintin++命令和alias。

alrighty 发表于 2014-4-6 15:45:02

行走的方法

行走分为3类:
1。快速行走:一次输入尽量多的命令,然后等待系统回应。(#map dfs fast)
2。慢速行走:先快速的走到目标附近,再一步一步走过去。(#map dfs slow)
3。一步一停:推车可以用到这个。(#map dfs step)


遍历的走法
1。首先快速行走,看到目标记录目标房间。

2。针对目标房间n步( 根据npc的移动能力来决定)之内使用慢速行走。
   快速行走要合理设置地图的特殊出口。例如要遍历黄河两岸时,走完了南岸,坐船之前最好停一下,确定没有看到目标之后,再坐船去北岸。实现的方法很简单,把坐船的出口标志为check就可以了。

到这里关于跑路的基本问题就说的差不多了。

alrighty 发表于 2014-4-9 12:48:22

本帖最后由 alrighty 于 2014-4-9 12:53 PM 编辑

言归正传,现在是时候兑现2楼对观众朋友们的承诺的时候了。

用了几天时间把跑路的部分从mapper里扒出来,然后port到了2.01版。

前提要求: 请下载一个2.01版本的tintin,自己编译通过。

然后,下载附件(遵守机器人守则,hs.map只包含了9个房间),解压到src目录(把你自己的文件备份先),覆盖已有文件,重新make clean;make编译完成之后,就可以开始测试了。

登录一个id,跑到华山脚下,准备测试。

./tt++test.class登录, 确认你站在华山脚下。



1. arun 9 {hihi feng}    跑到room 9 和铁匠打招呼。2. ablareas {华山}{李铁嘴}{hihi teller}    遍历华山,找到李铁嘴打个招呼    注意,由于我设置了华山脚上north的出口weight为100,所以保证了遍历的时候,    A 最后一个才遍历玉泉院,   B 进入玉泉院之前会停一下,一边有机会执行#map stop来停止遍历。3. ablarearoom {华山}{3}{碎石路}{2}{铁匠}{hihi feng}    距离华山3歩之内,所有叫做碎石路的房间,遍历其周围2步之内所有房间,找到铁匠打招呼

4. ablat {小山村}{碎石路}{hihi}    附送多一个命令, 遍历小山村所有叫做随时路的房间, 执行hihi。    注意, 必须手动执行#map ok之后, mapper才会继续去下一个房间。    这个命令可以用来做hsz,寻宝,找伙计。

贴一张截图:黄色的房间时路径经过的房间绿色的是跑路的目标房间紫色的是当前所在房间跑路的过程中,经过的每个房间都会记录 区域,名字, 编号。



有了这个框架之后, 配合一份比较好的地图, 做主流任务就很轻松了。



页: [1] 2
查看完整版本: 推广一下tintin++