北大侠客行MUD论坛

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

改变思路,远离触发。

[复制链接]
发表于 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的函数。
于是我们可以方便的将这两个函数拼接。
func  QuanZhenFullJob()
      GetStatus()
      if exp > xxx
          QuanZhenNewbieJob()
      else if exp <= xxx
          QuanZhenSaoDi()

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

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

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-16 12:11:21 | 显示全部楼层
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-16 17:47:30 | 显示全部楼层
不明觉厉
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-17 00:43:00 | 显示全部楼层
zmud是没法这样干的,mush这样干,确实条理清晰,便于管理和编写
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 01:11:29 | 显示全部楼层
mush可以的zmud都可以,zmud可以的mush不行或艰难实现。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 10:04:52 | 显示全部楼层
mush可以的zmud都可以,zmud可以的mush不行或艰难实现。
oolong 发表于 2015-1-18 01:11 AM


我也想请教一下,没有协程的帮助,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,倒是应该可以办到的。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 14:45:08 | 显示全部楼层
本帖最后由 littleknife 于 2015-1-18 02:48 PM 编辑

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

至于在MUSH中或用lua的实现暂停的方法我倒是可以提供一下几种方式供参考:

  1. require "wait"
  2. function wait_test()
  3.         wait.make(function()
  4.                 --------------------------------------------------------------------------------------
  5.                 Execute("hi")
  6.                 wait.regexp("^你双手抱拳,作了个揖道:各位英雄请了!")-----一次性触发实现暂停。用命令hi或其他命令继续。如:set no_more continue等形式。
  7.                                 print("这里是用命令行方式恢复的继续!")
  8.                 --------------------------------------------------------------------------------------
  9.                 wait.pause("pauseid")-----脚本暂停,用脚本wait.wake("pauseid")来唤醒继续。需配合新版wait.lua文件。
  10.                                 print("这里是用wait.wake来唤醒的继续部分!需要wait.lua带有暂停功能。")
  11.                 --------------------------------------------------------------------------------------
  12.                 thread=coroutine.create (function()
  13.                                 print("这里是线程执行到这里了。")
  14.                                 coroutine.yield()-----线程暂停,用脚本线程函数coroutine.resume(thread)唤醒继续。
  15.                                 print("这里是用线程函数resume恢复的部分:")
  16.                 end)
  17.                 coroutine.resume(thread)
  18.                 --------------------------------------------------------------------------------------
  19.                 do_something()
  20.         end)
  21. end
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 14:53:08 | 显示全部楼层
回复 6# cmud


    cmud支持消息,使用消息机制,wait一个消息。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 19:07:34 | 显示全部楼层
嗯,这么简单功能zmud cmud轻松实现...
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-1-18 19:26:27 | 显示全部楼层
嗯,这么简单功能zmud cmud轻松实现...
oolong 发表于 2015-1-18 07:07 PM


Zmud支持消息?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-1 05:49 AM , Processed in 0.011676 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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