xxxcc 发表于 2015-1-16 11:26:42

改变思路,远离触发。

通常接触MUD游戏的时候,都是从Zmud开始入手的,因为它确实是容易上手:
复制一行问题,然后写入一串命令,就可以让角色按照我们的设想开始行动了。

但是长久以后,我们的思想似乎被它束缚了,一旦开始写机器人,就会从触发
入手,通常的思路都是,在什么情况下,我们应该做什么。结果导致写大型机
器人的时候,会充满了各种各样的trigger,最后变得难以控制。

我想说的是,我们写机器人应该是这样的,比如全真新手机器人:(以下是伪代码)
func QuanZhenNewbieJob()                        //定义全真新手任务函数。
      while ContinueJob
      {
          result = LookNotice()                      //查看全真公告,得到查看的结果。
          if result == 'LaoDao'                     //如果公告是老道任务,那么就调用老道的任务函数。
               DoLaoDaoJob()
          else if result == 'DaoTong'            //如果公告是道童任务,那么就调用道童的任务函数。
               DoDaoTongJob()
          else                                              //如果没有公告,那么就执行一个空闲的函数,然后重新查看公告(比如读书,比如傻等10秒等等)
               IdleFunc()                                                   
               continue
       }

OK,运行这个函数,就可以开始我们的全真新手任务了,方便快捷,非常便于管理。
后来我们又写了全真SaoDi的函数。
于是我们可以方便的将这两个函数拼接。
funcQuanZhenFullJob()
      GetStatus()
      if exp > xxx
          QuanZhenNewbieJob()
      else if exp <= xxx
          QuanZhenSaoDi()

我想应该很多高手的机器都应该是以这种方式执行的,因为wait.lua似乎已经提供了这样的功能
(因为我是用python仿照wait.lua实现了这么一套东西,但是对于wait.lua真正的使用方法并不了解,
但是看论坛帖子,似乎已经有人扩展了wait的功能,实现了这种机器编写方式)

写这个帖子只是为了让其他玩家开拓一下编写机器人的思路。

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

hkyyxss 发表于 2015-1-16 12:11:21

hepat 发表于 2015-1-16 17:47:30

不明觉厉

suxxx 发表于 2015-1-17 00:43:00

zmud是没法这样干的,mush这样干,确实条理清晰,便于管理和编写

oolong 发表于 2015-1-18 01:11:29

mush可以的zmud都可以,zmud可以的mush不行或艰难实现。

cmud 发表于 2015-1-18 10:04:52

mush可以的zmud都可以,zmud可以的mush不行或艰难实现。
oolong 发表于 2015-1-18 01:11 AM http://pkuxkx.net/forum/images/common/back.gif

我也想请教一下,没有协程的帮助,Zmud如何实现函数暂停执行,等待其他条件满足后,继续执行。
比如:
func QuanZhenNewbieJob()                        //定义全真新手任务函数。
      while ContinueJob
      {
          result = LookNotice()                      //查看全真公告,得到查看的结果。 (1)
          if result == 'LaoDao'                     //如果公告是老道任务,那么就调用老道的任务函数。
               DoLaoDaoJob()
          else if result == 'DaoTong'            //如果公告是道童任务,那么就调用道童的任务函数。
               DoDaoTongJob()
          else                                              //如果没有公告,那么就执行一个空闲的函数,然后重新查看公告(比如读书,比如傻等10秒等等)
               IdleFunc()                                                   
               continue
       }
在函数执行(1)这个地方我会让QuanZhenNewbieJob暂停执行,然后发送look notice指令,等待mud的返回信息,从而给result赋值。
这个过程用lua和python的协程,可以非常方便的实现。
但是用Zmud呢?如何在(1)这个地方暂停执行呢?

Cmud支持lua和python,倒是应该可以办到的。

littleknife 发表于 2015-1-18 14:45:08

本帖最后由 littleknife 于 2015-1-18 02:48 PM 编辑

你的思路其实和我写的MUSH框架脚本思路基本一致。若有兴趣可以参考下《一个脚本》框架(置顶帖)。
我的框架中后来提出的应用模块开发中心,即是总调用模式,然后根据条件去执行各自的任务的意思。

至于在MUSH中或用lua的实现暂停的方法我倒是可以提供一下几种方式供参考:
require "wait"
function wait_test()
        wait.make(function()
                --------------------------------------------------------------------------------------
                Execute("hi")
                wait.regexp("^你双手抱拳,作了个揖道:各位英雄请了!")-----一次性触发实现暂停。用命令hi或其他命令继续。如:set no_more continue等形式。
                                print("这里是用命令行方式恢复的继续!")
                --------------------------------------------------------------------------------------
                wait.pause("pauseid")-----脚本暂停,用脚本wait.wake("pauseid")来唤醒继续。需配合新版wait.lua文件。
                                print("这里是用wait.wake来唤醒的继续部分!需要wait.lua带有暂停功能。")
                --------------------------------------------------------------------------------------
                thread=coroutine.create (function()
                                print("这里是线程执行到这里了。")
                                coroutine.yield()-----线程暂停,用脚本线程函数coroutine.resume(thread)唤醒继续。
                                print("这里是用线程函数resume恢复的部分:")
                end)
                coroutine.resume(thread)
                --------------------------------------------------------------------------------------
                do_something()
        end)
end

seagate 发表于 2015-1-18 14:53:08

回复 6# cmud


    cmud支持消息,使用消息机制,wait一个消息。

oolong 发表于 2015-1-18 19:07:34

嗯,这么简单功能zmud cmud轻松实现...

cmud 发表于 2015-1-18 19:26:27

嗯,这么简单功能zmud cmud轻松实现...
oolong 发表于 2015-1-18 07:07 PM http://pkuxkx.net/forum/images/common/back.gif

Zmud支持消息?
页: [1] 2
查看完整版本: 改变思路,远离触发。