北大侠客行MUD论坛

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

【MUSH框架】基于MUSH的模块化机器人设计之底层框架_【一个脚本走天下v20141214】

[复制链接]
发表于 2011-8-6 19:16:44 | 显示全部楼层 |阅读模式
本帖最后由 littleknife 于 2015-10-24 09:16 AM 编辑

****************************************************************************************
一、【一个脚本】的核心思路:
模块化脚本框架引用方式实现机器人的集成化,使得复杂机器的编写成为可能;单一的配置文件配置MUSH的运行状态,使得配置MUSH更加简洁
****************************************************************************************
       (1)设置文件的编辑变成统一【一个脚本】,使机器的撰写更加方便。MUSH的设置文件主要包含变量、脚本、触发、Alias等,都是各自的文件,要想设置好一个机器人需要自己存储这些文件。而更换机器人就要把它们都换一遍,这里的【一个脚本走天下】其核心思路就是考虑以前用惯了zmud的用.mud文件的思路,以一个文件引用所有的东西。而脚本框架的应用则彻底不再依靠MUSH的触发、变量、alias的配置文件意思

        (2)框架所提供的整合代码的思路,使得复杂的冗长的lua代码被实质上整合到【一个脚本】里,所以这也是其核心思路之一。通过这种模块化的集成,力图只制作一个集成脚本【框架脚本】就可以完成机器人的研发。而【底层框架】则为大多数应用层机器人提供了核心的函数及方法。

      其实这种模块化的思路好多玩家已经在自觉不自觉的使用了。所以,机器达人们请不要见笑,鲁班门前弄大斧了。
作为自己的一篇学习笔记、一篇心得体会,发出来供大家共勉,抛砖引玉罢了。有心的朋友请您提出宝贵的意见和建议,谢谢!

****************************************************************************************
****************************************************************************************
★pkuxkx2014【一个脚本走天下】之《底层框架》集成模块文件V20141214:
补充MUSH自带的wait.lua模块:将此文件拷贝至MUSH\lua目录下。
****************************************************************************************
【注:此脚本框架文件不可与城际互联插件同时使用,否则相互冲突。压缩包中的db库是城际互联节点库,请拷贝至MUSHclient.exe目录下。】

****************************************************************************************
成功加载《底层框架》后的界面效果如下:
****************************************************************************************


****************************************************************************************
二、【一个脚本】框架的先续基础内容:你若想弄清楚下面的内容,得提前知道的内容是:
****************************************************************************************


如何建立一个MUSH的总文件MCL文件;
如何在这个文件的引用.lua脚本;
基本MUSH的常识性知识:比如什么是MUSH的变量,Lua的变量、正则表达式是什么、什么是触发等等。
MUD游戏的基本常识性知识:行走、吃饭、喝水、看东西、学习、打坐、吐纳,这些都是什么意思。
基本的lua编程基础:比如什么是lua,什么是表格。基本lua程序语言的写法等等。

****************************************************************************************
三、【底层框架】的使用方法:
****************************************************************************************

        首先,用一个总的配置文件(这里是pkuxkx_littleknife.lua)作为主引用文件,里面有一定的初始设置。其中包含底层框架
模块文件xkx_frame.mod的载入,通过这个mod文件(mod文件是我自己定义的文件,格式就是文本文件)固定几个底层模块(*.mod),
如:行走系统模块、系统函数模块、战斗模块、学习练习模块等等。注意:这里有载入顺序问题,顺序不对也许会出错

        最后,则是以表格loadlua_list作为应用层模块的引用来调各个【应用层模块】。

---------------------------------------------------------------------------------------------------------------------------
pkuxkx_playerid.lua:总配置文件,只需要对这个总配置文件进行适当的修改即可完成载入模块的目的。
---------------------------------------------------------------------------------------------------------------------------
关于各个mod文件: 【 鉴于一楼资源紧张,各mod模块中的函数简介放在二楼。】
在mod目录下,还有一些以mod为扩展名的文本文件。这些被我称为底层引用库文件,主要是提供一些实用函数
鉴于广大同学的建议,这里不再详细说明各个mod的函数,有些东西也都是自己按需要加入到底层框架中。只是在下面【应用模块】中以实例
的形式把常用的底层函数加以介绍吧。相信,随着时间的推移。多数同学会形成自己的底层框架支持函数。
---------------------------------------------------------------------------------------------------------------------------
****************************************************************************************
四、【应用层模块】的设计与使用:如何用框架来做应用层模块,就是怎么来用MUSH做模块化机器人的问题。
****************************************************************************************

首先,是你开发的【应用层模块】应放在总配置文件pkuxkx_playerid.lua(即调用文件,压缩包里的是pkuxkx_littleknfie.lua)的loadlua_list表中。形如下图:
其次,你只要集中精力弄自己的应用模块,及合理使用框架函数即可。

比如我编了个quest_hubiao.lua的机器人,怎么加入到框架中?就是loadlua_list表加一行“quest_hubiao.lua”即可。

注:这里的mod和lua文件都是文本文件、lua代码,格式上没有区别。只是我为了区分已完成的模块自定义为Mod。研发和测试代码我用Lua扩展名而已。






****************************************************************************************
1、封装模块(面向对象程序设计):

        应用层模块的研发,我的建议是用封装模块的形式做,也就是面向对象程序设计的思路。即:无论是【应用中心】还是【任务模块】均采用封
装的形式进行封装。其好处是均以对象的方式使用,可以随时整合到各个使用机器人中

  1. -----具体的封装代码:
  2. AppMOD={
  3.         new=function()
  4.                 local _AppMOD={}
  5.                 setmetatable(_AppMOD,{__index=AppMOD})
  6.                 return _AppMOD
  7.         end,
  8.         interval=5,
  9.         timeout=20,
  10.         help="格式:帮助文件",
  11.         -------------------------------------
  12.         Sleeproomno=player.Sleeproomno,
  13.         Eatfoodroomno=player.Eatfoodroomno,
  14.         Trainingroomno=player.Trainingroomno,
  15.         -------------------------------------
  16.         aimroomno="",
  17.         aimroomname="",
  18.         -------------------------------------
  19.         jobnpcname="",
  20.         jobnpcid="",
  21.         jobnpcmenpai="",
  22.         jobwords="",
  23. }

  24. function AppMOD:finish()
  25. end

  26. function AppMOD:fail()
  27. end

  28. AppMOD_button=function()
  29.         print(AppMOD.help)
  30.         SetCommandSelection (1, -1)
  31.         PasteCommand("#AppMOD ")
  32. end

  33. AppMOD_alias=function(name, line, wildcards)
  34.         do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
  35. end

  36. do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
  37.         local tmp_AppMOD=AppMOD.new()
  38.         tmp_AppMOD.finish=AppMOD_ok
  39.         tmp_AppMOD.fail=AppMOD_fail
  40.         tmp_AppMOD:start(wildcards)

  41. end

  42. function AppMOD:start(wildcards)
  43.         wait.make(function()
  44.         self:update()
  45.         local f=function() self:check(wildcards) end
  46.         getinfo(f)
  47.         end)
  48. end
  49. -----封装后模块的应用:
  50. (1)do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail),命令引用。
  51. (2)脚本定义引用:形如:
  52.                 local xkd_studyliterate=qxuexi.new()
  53.                 local condition={"shi","literate",100,nil,"west;west"}
  54.                         xkd_studyliterate.Sleeproomno=self.Sleeproomno
  55.                         xkd_studyliterate.Eatfoodroomno=self.Eatfoodroomno
  56.                         xkd_studyliterate.menpai="xkd"

  57.                         xkd_studyliterate.finish=function()
  58.                                 self.need_studyliterate=false
  59.                                 self:main()
  60.                         end
  61.                         xkd_studyliterate:start(condition)
复制代码
****************************************************************************************
2、应用模块的研发实例:
        【应用实例】的代码文件是:xkd_rb.lua。其中里面包含了【应用中心】xkd_center的代码,执行层【任务模块】xkd_Diaoyu的代码。限于篇幅,请自行下载前面的压缩文件查阅。

        在新的框架模块下,应用模块的研发是基于一个总的【应用中心】的任务框架思路来完成的,其核心设计思想是尽可能的实现总协调的目的。定义是:判定自身状态并指向执行层的【任务模块】,也就是总调度文件的意思。下面以一个非pkuxkx的【侠客岛钓鱼机器】的例子说明下用法。   

(1)【应用中心】的代码:

贴完代码,我才发现,这个代码的格式整理真是头痛的要命。故此,限于篇幅我已经在pkuxkx_mod2014这个压缩包里,涵盖了相关代码。也注释了部分内容。这里提供的还是一个框架性质的代码文件。希望诸位能理解,也希望借此给哪些新入MUSH的玩家以借鉴性的作用。

(2)【任务模块】,即执行层的代码:这里钓鱼就是任务。这里任务的定义是通过一系列命令可以获取经验和潜能的事件。


(3)一个完整的执行层【任务模块】框架代码:

  1. AppMOD={
  2.         new=function()
  3.                 local _AppMOD={}
  4.                 setmetatable(_AppMOD,{__index=AppMOD})
  5.                 return _AppMOD
  6.         end,
  7.         interval=5,
  8.         timeout=20,
  9.         help="格式:帮助文件",
  10.         -------------------------------------
  11.         Sleeproomno=player.Sleeproomno,
  12.         Eatfoodroomno=player.Eatfoodroomno,
  13.         Trainingroomno=player.Trainingroomno,
  14.         -------------------------------------
  15.         aimroomno="",
  16.         aimroomname="",
  17.         -------------------------------------
  18.         jobnpcname="",
  19.         jobnpcid="",
  20.         jobnpcmenpai="",
  21.         jobwords="",
  22. }

  23. function AppMOD:finish()
  24. end

  25. function AppMOD:fail()
  26. end

  27. AppMOD_button=function()
  28.         print(AppMOD.help)
  29.         SetCommandSelection (1, -1)
  30.         PasteCommand("#AppMOD ")
  31. end

  32. AppMOD_alias=function(name, line, wildcards)
  33.         do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
  34. end

  35. do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
  36.         local tmp_AppMOD=AppMOD.new()
  37.         tmp_AppMOD.finish=AppMOD_ok
  38.         tmp_AppMOD.fail=AppMOD_fail
  39.         tmp_AppMOD:start(wildcards)

  40. end

  41. function AppMOD:start(wildcards)
  42.         wait.make(function()
  43.         self:update()
  44.         local f=function() self:check(wildcards) end
  45.         getinfo(f)
  46.         end)
  47. end

  48. function AppMOD:check(wildcards)
  49.         local askjob=function() self:askcmd() end
  50.         local endf=function()
  51.                         do_walkgo(self.masterroomno,0.2,askjob,askjob)
  52.         end

  53.                 if me.hp["neili"]<=1.2*me.hp["neilimax"] then
  54.                         do_dazuo(1.2,"curmaxneili",endf,endf)
  55.                 else
  56.                                 busytest(endf)
  57.                 end
  58. end

  59. function AppMOD:askcmd()
  60. end

  61. function AppMOD:cooltime()
  62. end

  63. function AppMOD:main()
  64. end

  65. -----------------------------------------------

  66. function AppMOD:dosomething1()
  67. end

  68. function AppMOD:dosomething2()
  69. end

  70. function AppMOD:dosomething3()
  71. end

  72. function AppMOD:dosomething4()
  73. end

  74. -----------------------------------------------

  75. function AppMOD:update()

  76.                 local  AppMOD_triggerlist={
  77.                        {name="AppMOD_dosth1",regexp="Here is trigger1 RegularExpression",script=function()    self:dosomething1()  end,},
  78.                        {name="AppMOD_dosth2",regexp="Here is trigger2 RegularExpression",script=function()    self:dosomething2()  end,},
  79.                        {name="AppMOD_dosth3",regexp="Here is trigger3 RegularExpression",script=function()    self:dosomething3()  end,},
  80.                        {name="AppMOD_dosth4",regexp="Here is trigger4 RegularExpression",script=function()    self:dosomething4()  end,},
  81.                 }

  82. ---Creat Trigger-->>
  83.                 for k,v in pairs(AppMOD_triggerlist) do
  84.                         addtri(v.name,v.regexp,"q_AppMOD",v.script)
  85.                 end

  86. ---End Creat Trigger--<<
  87.         local noecho_trilist={
  88.                         "noecho_tri1",
  89.                         "noecho_tri2",
  90.                         }
  91.         local _noechotri=linktri(noecho_trilist)

  92.         addtri("AppMOD_noecho",_noechotri,"q_AppMOD","")
  93.         SetTriggerOption("AppMOD_noecho","omit_from_output",1)
  94.         EnableTriggerGroup("q_AppMOD",1)
  95. end

  96. AddAlias("alias_AppMOD_button","#AppMOD_button","",alias_flag.Enabled + alias_flag.Replace ,"AppMOD_button")
  97. AddAlias("alias_AppMOD","#AppMOD (.*)","",alias_flag.Enabled + alias_flag.Replace+ alias_flag.RegularExpression ,"AppMOD_alias")

  98. SetAliasOption("alias_AppMOD","group","job_AppMOD")
  99. SetAliasOption("alias_AppMOD_button","group","job_AppMOD")

复制代码
至此,通过本次的说明更新性,希望能给有用MUSH编写机器的玩家给以帮助。
最后,本作只是一个自学笔记,在各位机器达人面前弄斧献丑,不要见笑。
******************************************************************************************************
【一个脚本框架】近期更新记录:
20141214:针对框架文件加入map_p2palias.mod模块,此模块为城际互联算法模块,在xkx_frame.mod中默认加载,可自行屏蔽。实现框架脚本内直接应用城际互联(故不需加载插件,若加载插件则屏蔽此模块即可)的作用。

******************************************************************************************************

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-8-6 19:16:50 | 显示全部楼层

【底层框架】各MOD文件所提供的常用函数简介

本帖最后由 littleknife 于 2014-11-14 12:25 PM 编辑

【底层框架】各MOD文件所提供的常用函数简介:

-----************************************************************
system.mod文件中主要函数介绍:
-----************************************************************


  1. -----************************************************************
  2. ----函数名:busy模块。busytest(busyfinish,t,...)
  3. ----此模块用来判定自身是否处于busy。
  4. ----输入:函数名,间隔时间,参数表
  5. ----输出:在不忙的情况下,执行busyfinish。
  6. -----************************************************************
  7. -----************************************************************
  8. ----函数名:delay(t,delayfinish,...),waitend(t,waitfun,...),infoend(func,...)
  9. ----delay和waitend均为等待几秒后执行目标函数。
  10. ----infoend为信息结束函数,即等待信息都显示完毕后执行目标函数的意思。
  11. -----************************************************************

  12. -----************************************************************
  13. ----函数名: Convert2Seconds(seconds):时间转换函数。
  14. ----输入:                seconds                  ----字符串格式。
  15. ----输出:  hours, minutes, seconds         ----小时、分钟、秒。
  16. ----说明:                此函数提供的是将秒计时转换为小时、分钟、秒的格式。
  17. -----************************************************************
  18. -----************************************************************
  19. ----函数名: ltrim (r, s), rtrim (r, s):左截、右截取串函数。
  20. ----输入:r:截取或去掉的字符串,s:源字符串。
  21. ----输出:截取后字符串。
  22. ----说明:无。
  23. -----************************************************************
  24. -----************************************************************
  25. ----函数名:触发脚本书写函数:addtri,addtri_multiline,addtri_noecho
  26. ----addtri(triname,trimatch,trigroup,triscript,triflag,trisequence)
  27. ----输入:触发名字,触发内容,触发群名,脚本名或函数名,标示,顺序。
  28. ----输出:建立触发。
  29. ----说明:这里的新模块下的触发建立函数,主要是封装模块的核心。其triscript已经可以识别函数名的直接填写。这无疑使得模块封装更加方便。
  30. -----************************************************************
  31. -----************************************************************
  32. ----函数名:Alias添加函数:addali(非正则模式),addali_reg(正则模式)。
  33. ----addali=function(aliname,alimatch,aligroup,aliscript)
  34. ----输入:Alias名,触发内容,触发群名,触发脚本。
  35. ----输出:建立Alias。
  36. ----说明:这里的addali也是通过脚本aliscipt的方式运行Alias。
  37. -----************************************************************
  38. -----************************************************************
  39. ----函数名:删除触发,删除触发群,删除变量:
  40. ----deltri(triname),deltrigp(groupname),delvar(varname)
  41. ----输入:触发名或触发群名,变量名。
  42. ----输出:删除对应单独的触发或对应的触发群;删除变量。
  43. ----说明:无。
  44. -----************************************************************
  45. -----************************************************************
  46. ----函数名:linktri函数:linktri2(triggerlist)
  47. ----输入:触发名或触发群名,变量名。
  48. ----输出:把triggerlist表里的触发字符串连接成一个触发。
  49. ----说明:连接数字项表格个各个值成为trigger。
  50. ----此函数默认占用w[1]="",w[2]=全部表达式,列表中的参数从w[3]开始。
  51. ----括号开始的变量为w[2]=("..rtrim("|",_str)..")",里面有()则为w[3],第一个w[1]=""
  52. -----************************************************************
  53. -----************************************************************
  54. ----函数名:ctonum(str)---中文数字转换函数。
  55. ----输入:str="一百三十五"
  56. ----输出:135
  57. ----说明:无
  58. -----************************************************************
  59. -----************************************************************
  60. ----两个表格的操作函数:针对数字项表格的操作函数。
  61. ----并集函数: table_union(a,b),交集函数:table_intersection (a,b),
  62. ----移除重复项函数:talbe_removeduplicate(t),
  63. ----相等判定函数:table_is_equal(list1,list2),
  64. ----查询索引函数:simTableIndex(str,list)
  65. ----表格是否为空表判定函数: table_is_empty(t)
  66. -----************************************************************
  67. -----************************************************************
  68. ----system.allstop()
  69. ----说明:重新刷新脚本函数。全部停止重置机器。
  70. -----************************************************************
  71. -----************************************************************
复制代码
-----************************************************************
status.mod文件中主要函数介绍:
-----************************************************************


  1. -----************************************************************
  2. ----函数名:status_oncha(name, line, w,s),status_onjifa(name, line, w)技能查询并存储函数。
  3. ----说明:应用此函数可以把skills和jifa skills都存入到me.skills表和me.jifa表,以及MUSH变量表中。
  4. -----************************************************************
  5. -----************************************************************
  6. ----函数模块名:me模块。
  7. ----说明:主要是自身状态的基本参数。提供睡觉、吃饭、发呆检测模块供参考。
  8. -----************************************************************
  9. -----************************************************************
  10. ----函数模块名:Convert_KM(value)
  11. ----说明:把亿、万模式转换为数字。
  12. -----************************************************************
  13. -----************************************************************
  14. ----函数模块名:skills模块
  15. ----说明:抓取自身技能,提供me.skills表和me.jifa表。
  16. -----************************************************************
  17. -----************************************************************
  18. ----函数名:me.Checkitem(Comparelist)
  19. ----说明:获取自身物品列表。这是一个方法型函数。Comparelist为对比表。
  20. -----************************************************************
  21. -----************************************************************
  22. ----函数名:me.idhere(Callback)
  23. ----IDhere列表函数。
  24. -----************************************************************
  25. -----************************************************************
  26. ----函数模块:npc模块:
  27. ----抓取NPC名字,颜色,门派等信息的模块。
  28. -----************************************************************
复制代码
-----************************************************************
walk.mod文件中主要函数介绍:
-----************************************************************

  1. 主要行走模块:do_walkgo(pathstring,steptime,walk_ok,walk_fail)
  2. steptime:每步间隔时间(秒)。
  3. walk_ok:行走后执行动作函数;
  4. walk_fail:行走失败后执行动作函数;
复制代码
-----************************************************************
rest.mod文件中主要函数介绍:(这部分模块由于系统及自身喜好不同,也许存在些BUG。有兴趣的自己查阅修正吧。)
-----************************************************************


  1. 打坐吐纳模块:do_dazuo(goal,condition,dazuo_ok,dazuo_fail),do_tuna(goal,condition,tuna_ok,tuna_fail)
  2. 学习、练习模块:do_qxuexi(wildcards,qxuexi_ok,qxuexi_fail),do_qlianxi(wildcards,qlianxi_ok,qlianxi_fail)
  3. 读书模块:do_qreadbook(wildcards,qreadbook_ok,qreadbook_fail)
  4. 状态检查模块: checkstatus(item,condition,goal)
  5. 修炼模块:do_xiulian(xiulian_ok,xiulian_fail)

复制代码
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-8-6 19:16:54 | 显示全部楼层

【任务模块】实例:执行层的研发_新版领悟模块参考代码。

本帖最后由 littleknife 于 2014-12-14 07:06 PM 编辑

本实例以新版领悟模块为参考实例,推出参考代码。供广大MUSHer爱好者参考使用。。仅供学习。。使用请保留版权信息,谢谢。

  1. ------------***********************************************
  2. -- File name   : quest_lingwu.mod
  3. -- Description : 领悟模块,2014版。涵盖命令行模式和脚本模式。需配合基础框架,绘图模块参考了子襄(isstillsun)的代码。
  4. -- Version: 20140420
  5. -- Author: littleknife(applehoo@126.com)
  6. --问题:武器、食物需自己带在身上。
  7. ------------***********************************************
  8. 论坛代码不好显示,这里下载自行研究吧:
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 19:20:45 | 显示全部楼层
侠客岛读石壁机器人就是这样的,学习之
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 19:22:27 | 显示全部楼层
超教棒,支持一下
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 19:40:13 | 显示全部楼层
木有违规,发吧
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 19:40:50 | 显示全部楼层
胡小刀,这些模块都完成之后,把这个和其他的好用的mush工具,一起整理一下弄一个新的北侠专用mush打包放主页去,当然懒做的话给份名单,我来帮忙
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-8-6 19:56:48 | 显示全部楼层
噢了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 20:12:32 | 显示全部楼层
来晚了,顶顶
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-8-6 20:46:32 | 显示全部楼层
哈哈,果断精华
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 09:32 PM , Processed in 0.014387 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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