lzkd 发表于 2013-1-4 10:58:17

[MUSH]行走方式探讨(3更)

本帖最后由 lzkd 于 2013-1-9 11:04 AM 编辑

目录
第一章 前言
第二章 最基本的行走
第三章 #ok行走方式


————————————————————我是快乐的分割线——————————————————————————————
第一章 前言


  离开一段时间了,一直忙呀忙的。其实,现在还是在忙,而且会更忙。不过呢,也一直有悄悄关注北侠。相信,许多人都会象小刀这样吧,呵呵,一笑。

  说说为什么想写这个。
  首先呢。主要是最近接了一个很麻烦的活,干的实在郁闷了,需要换换脑筋,轻松一下。所以,就打算写这个,也算是轻松休闲,是吧。暂时没办法进MDU玩,但可以写点技术性的文章嘛。
  其次呢。个人持这种观点,一个MUD机器人,主要是两部分,一个是走路,一个是战斗。这两个问题解决了,那机器人基本也就出来了。那么,我们就在这里讨论一下行走(或者说是走路,walk,这个怎么称呼并不重要)。小刀在这里也算是抛砖引玉了。我看论坛最近又多了不少高手的说,咱这也算是献丑了。不过,在北侠嘛,大家都是朋友,也无所谓说的高明不高明了。小刀尽量把自己的想法说出来,大家讨论哈。
  第三呢。我了个去,新论坛搬家,怎么把我变成99精华了?这个不行,一定要把100精华整回来,是吧。

  简单说一下,本文大概会说些什么。
  第一,本文会比较系统的分析一下各种走路机制。并且从一个比较完整的角度(当然,这是小刀认为的完整,欢迎大家探讨补充),来阐述走路的本质是什么。
  第二,本文会就大家最感兴趣的机制,进行说明,并比较其优劣。呃~~如果真的需要,可以考虑给出参考代码(不过,这个可能比较难,小刀好久木有写机器人了)。
  第三,本文纯粹讨论行走的方式,路径如何生成,不在本文讨论范围之内。也就是说,小刀默认本文的读者,都是有了自己的路径。


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

lzkd 发表于 2013-1-4 10:58:29

更新及探讨记录

本帖最后由 lzkd 于 2013-1-9 11:03 AM 编辑

2012-1-09 完成第三章《#ok行走方式》的内容,考虑是否给出参考代码。
2012-1-05 第二章完成。
2012-1-04 补充前言,完成第二章的一部分。
2013-1-04 前言部分完成,并建立好目录结构。
2013-1-04 开始动笔写行走方式探讨。

lzkd 发表于 2013-1-4 10:58:34

本帖最后由 lzkd 于 2013-1-5 04:30 PM 编辑

第二章 最基本的行走

  在开始之前,我们先来分析一下,在MUD,我们需要的行走,有哪几种。一般来说,会有以下几种。
  第一种,是点对点的快速行走。比如说,从扬州到北京,如果是手动的话,可能打个诸如gctobj这样的,就直接跑过去了。如果是机器人的话,也可以按这样来处理。
  第二种,是范围的快速行走。比较典型的例子,是以前帮晓晓写的拣垃圾机器人,在一定范围之内,每个房间都跑过来,看见能拣的都拣起来(为了卖钱嘛,一笑)。
  第三种,是范围内的慢速行走。比较典型的例子,岳王墓那里出现盗宝人。我们使用点对点路径跑到岳王墓,在以岳王墓某点为中心,展开搜索,遇到了盗宝人,就开杀。这种情况下,就要求不能跑的太快。不然的话,你呼的一下跑过去了,这任务就没办法做了。
  上面所有的路径,可以是事先写好,也可以自动生成的(这个需要整个MUD的地图资料),不过路径的生成,就不在本文讨论范围之内了。
  相信,大家会对第三种比较感兴趣。不过,我们先来了解一下,MUSH中的走路,到底是怎么一个样子,这样有助于我们进行比较和思考。

  好了,我们现在开始讨论MUSH中的行走,从最简单的开始。最简单的单步行走,也就是直接在命令行向MUD,发出诸如n,s,之类的命令。这种行为,在MUSH中,等同干Send()这个函数。这个肯定是不符合我们要求的。
  我们再继续看,MUSH中,还提供了一个快速行走的方式,可以发送出一连串的命令,有些类似alias。这个就符合了我们的第一种点对点的快速行走要求。(在路径事先已经有,或者已经做好的前提下)

  其实,说到底,无论是点对点行走也好,遍历也好,无非就是把命令一个一个往MUD里发送。所以,我们需要考虑到一个问题,命令间隙。如果一下子往MUD里发送了太多命令,是会被系统吃掉的。如果在走路的时候,出现这种情况,就会导致行走失败。
  讲到底,个人认为,机器人行走最核心的,无非是用合适的节奏来完成已经得到的路径。
  MUSH本身也考虑到了这个情况。他提供了解决方案。在MUSH的快速行走访方式,也就是所谓Speedwalk方式下,是可以设置快速行走的时间间隔。使用函数SpeedWalkDelay(),具体的使用,大家去查手册吧,本文就不话多了。

  另外,有一个问题需要在这里提出来。在快速行走中,MUSH是采用了所谓“队列”的方式。也就是说,在一串快速行走命令发出后,你再想添加命令,只能跟在这一串命令的后面。这种方式造成的最直接的后果就是,看见盗宝人了,停不下来,呼的就过去了。你走再慢也没用。因为你的kill的命令没办法发出来。
  那么,怎么解决这个问题呢?各位高手大牛都想出各种的方法,下面,小刀会一一向大家介绍。

lzkd 发表于 2013-1-4 10:58:40

本帖最后由 lzkd 于 2013-1-9 11:02 AM 编辑

第三章 #ok行走方式
 
  很抱歉,工作实在是忙,到现在才能挤出一点时间来写教程,先向大家说声对不起了。
 
  所谓#ok行走方式,就小刀所见,是maper第一个提出来的。首先在这里,让我们向这位北侠史上了不起MUSHer表示一下敬意,他的存在,影响了一大批MUSH的使用者。
  我们先来了解一下,#ok行走方式的工作原理。
  在set brief 2的情况下,我们每行走一步,都可以看见如
这里明显的出口是 eastup、north、south 和 west。
这样的字。每当这行字出现一次,我们就可以认为,已经行走了一步。
  首先,我们将路径取出,放到一个table里,大致是这样一个格式。
mypath = {
 "n",
 "ne",
 "nw",
 -- ...
}
  第二,我们设置一个全局变量,初始值设置为1(因为lua的table默认下标为1),每走一步则加1(怎么算是走了一步,见下)。
  第三,我们写一个tri,match部分就是
这里明显的出口是 eastup、north、south 和 west。
类似这样的内容。每触发一次,我们的全局变量就+1,然后,根据全局变量的值,从table中,取出当前应该行走哪一步,并且发送出去。
  好了,到这里#ok行走方式的工作原理,就全部讲完了。
 
  下面,我们来说一下,#ok行走方式的优缺点。先说优点。
1、很明显,这种行走方式,解决了一下输入太多命令,会被服务器吃掉的问题。
2、因为是通过tri进行触发行走的。所以,哪怕网络速度再卡,都不会有问题,因为只有每成功了一步,才会继续下一步。
3、这种行走方式的实现,比较简单,小巧。基本上可以说是看了就会,容易上手。
  然后是缺点。
1、很明显,这种方式对付不了拦路npc,不过这是另外一个难题了。
2、行走的过程中,网络卡没问题,但一旦出现“被拌了一下”,或者如推车乱入这种情况,那就完蛋了。
3、这种行走方式,当中不能停止(其实,真的要停止也不是不可以,但不经济),比如说,看见盗宝人了,就没办法停下来开打。
 
  好了,到这里#ok行走方式,已经全部介绍完了。按说,应该根据这个思路,已经可以写出完整的代码了。也不知道,现在北侠各位大虾的MUSH水准如何了,是否需要给出一个参考代码。这个,就看各位同学的反应吧。

lzkd 发表于 2013-1-4 10:58:47

占楼有用

lzkd 发表于 2013-1-4 10:59:04

占楼有用

-------------

后面不占了,各位随意哈

alucar 发表于 2013-1-4 11:30:03

研究tt吧hoho,编好机器人后至少可以在家里用手机connectbot玩,不担心被查房yct47
不过小刀不用担心这个...

labaz 发表于 2013-1-4 11:31:32

回复 8# alucar


你还在读书呢?感觉好多年了

alucar 发表于 2013-1-4 12:39:57

回炉了一把,终于快结束了

dcl 发表于 2013-1-4 12:41:58

留名。
自己写快速行走插件是绝对有必要地
页: [1] 2 3 4 5
查看完整版本: [MUSH]行走方式探讨(3更)