好了,除了最初的问题,其他问题都解决了,剩下的问题就是,最终串起整个机器的流程的责任人是谁?
除非我们能用人工智能自动推算出最优的流程,这个责任人当然是机器最终的用户,亲爱的您阿。
我的机器里设置了3个任务队列,可以通过start,start2,start3分别启动
截取下我AFK前ffqm的任务设置
turbo>>study guangming-shenghuogong::xiulian::jxj
turbo>>study cangming-gong::xiulian::jxj
fullmeok>>changespecial agile,ironskin,sociability
fullmeok>>compressgem 0.9
fullmeok>>xgy 于夕勤@yz-lcy,顾横波@jkf-jyl,孙倩叶@chengdu-fhz
!jobred 17,fullmeok>>syq reborn
!jobred 24,fullmeok>>jxcf
!jobred 16,fullmeok>>touxue
!jobred 08,fullmeok>>mzj
fullmeok>>syq reborn
fullmeok>>jxcf
fullmeok>>touxue
fullmeok>>mzj
fullmeok>>wat
fullmeok>>hsz
fullmeok>>gsz
fullmeok>>mrxj
fullmeok>>vein
study2
study
never>>vein
!fullmeok,pot 2000000>>study qiankun-danuoyi::cmd::mj-mishi::jifa parry qiankun-danuoyi&&lian parry 50::parry
dazuo
xiuxingdian>>biguan abandon skills
tuna
>>代表提内置条件,每个任务都有内置的cd系统
有turbo(我有一个界面选择的超频时间设置,这里用来设置开双),依次修炼牛逼光明圣火功和卡拉米沧溟功
有fullme时
[*]设置special,压缩超过9成的宝石
[*]就近找拼头
[*]依次找不在cd的,不红的syq/jxcf/touxue/mzj
[*]一次找再cd的,红色的syq/jxcf/touxue/mzj
[*]都做完的话,看wat/hsz/gsz/mrxj哪个没cd
[*]实在没活了通个脉
没有fullme的话
[*]优先学习列表2,不行学习列表1
[*]通脉(被never注释)
[*]潜能过2m,就去搞大挪移
[*]打坐
[*]有修行点就去闭关,顺便放弃垃圾技能
[*]吐纳
根据条件和cd,从上到下一次挑一个最合适的。
进入具体任务,由任务来负责创建状态列表。
这个模式有个缺陷,只能僵化的执行队列,没发最优化,比如同时接几个任务同时做。
如果要最优化,就要废弃整个体系的优点推翻重来。
但如之前所说,我追求的是“高可维护性的机器”,不是“高性能的机器”。
所以,得到一些,放弃一些,虽然是成年人,我也没法选择全都要。
理想很丰满,现实很骨感。
到这一步,通过状态及状态队列驱动的机器看似跑通了。
但还是有个问题没解决。
怎么应对意外状况。
比如死了,比如断线了,比如遇到野外boss了。
状态机和状态队列的模式天生不适合处理意外状况。
这时候,我加入很多其他监听指定事件的意外处理守护程序。
当意外发生时,快照或者直接清理掉当前任务。
意外处理完时。由当前任务决定是否能够继续。不能继续就重新走任务队列。
很脏,很暴力,但有效。
凡事都有代价,我选择接受这个代价。
这样写机器,要多少触发啊?
恩,做一个全能机器人的话,100多个吧。
曹丞相不可能.gif
其实是可能的。所有的触发都是事件。所以,我有个^.*$的事件,叫做line,参数是当前文本。
对,全局事件统一规划,非全局的代码自己监听online事件。
online事件的监听主要由4个地方负责
1.当前状态,离开状态时自动失效。一般用来做任务等待确定的恢复。
2.当前任务,结束任务时自动失效。用来做不定时的触发。比如新任务的线索。
3.当前房间,离开房间时自动失效。当一个房间涉及到多个状态切换时使用。
4.当前战斗,战斗结束时自动失效。用来做特殊的战斗触发,比如偷学。
对的,只要有责任人,偶尔跨界一次,未必不好。
我们只是写一个机器人,不是玩代码宗教,不必过于强调纯洁性。
外面的世界很大,我想走一走
整个逻辑系统讲完了,剩下的就是房间系统了。
房间系统对于mud来说是很独立的一块,因为不走标准的心跳拿一块。
对于北侠来说,房间系统就是 敏感词敏感词敏感词,所以细节不多说了。
八仙过海,各显神通吧。
就是说几个基本点
[*]不要用数字id命名,维护起来要哭。我喜欢地区+房间的拼音简称,能直接看房间说命名。
[*]要维护当前房间信息。包括当前房间ID,描述,对象列表,变量空间(方便写机器),触发
[*]要记录当前房间ID,没有移动,或者标记过look的话不清楚ID,实现论坛上说的“惯性定位”。每次都要定位的话很蛋疼
[*]房间出口要有标签。有些出口乞丐能走,别的不行。有些出口女的能走,男的不行。
[*]尽量实现动态生成路径。就是能把制定几个房间,周围制定的N格,根据标签动态生成固定路径。如果能实现按剩余房间而不是路径动态遍历更好。
有条件再开帖子细化下不敏感的内容
膜拜下大佬,什么时候我才能看懂大佬写的东西呢。 战,我要战
战斗系统,没啥好说的。
Timer,永远的timer
抓起足够多的变量,设置一个根据变量和cd,有优先级的战斗策略系统,就差不多了。
锚定心跳的系统,不用timer属于折腾自己。
本帖最后由 jarlyyn 于 2024-3-11 04:54 PM 编辑
看我无敌的手速
命令输出系统的话,比较简单。
首先要有限制流。我是通过0.6s的令牌桶系统,也就是每0.6s补满桶里令牌的机制来限流的。
然后是限流后命令要有个分组功能,要么同一个心跳发出去,要么都等下一个心跳,避免蛋疼状况。
再加上简单的别名系统,一般就ok了。
参考:
令牌桶:https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6/12715076?fr=ge_ala
结语
终于,我也逼逼叨叨的说完了。
玩北侠本来就是实践一把机器的新想法,现在发了这个帖子也算有始有终。
有了总结,机器应该还会再写,毕竟mud那么多,一个一个写过来能写到天荒地老。
这个机器本身,因为是边写边用,很多底层的东西哪怕重构过一次也改不掉,所以也总有不完美的地方。
不过,这本身也是写代码有乐趣的地方,有想法,实现它,完善它,犹如生物的进化,那一刻,你就是造物主。
页:
1
[2]