jarlyyn 发表于 2024-3-11 16:49:02

每个人是自己的第一责任人

好了,除了最初的问题,其他问题都解决了,剩下的问题就是,最终串起整个机器的流程的责任人是谁?

除非我们能用人工智能自动推算出最优的流程,这个责任人当然是机器最终的用户,亲爱的您阿。

我的机器里设置了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,从上到下一次挑一个最合适的。

进入具体任务,由任务来负责创建状态列表。

这个模式有个缺陷,只能僵化的执行队列,没发最优化,比如同时接几个任务同时做。

如果要最优化,就要废弃整个体系的优点推翻重来。

但如之前所说,我追求的是“高可维护性的机器”,不是“高性能的机器”。

所以,得到一些,放弃一些,虽然是成年人,我也没法选择全都要。

jarlyyn 发表于 2024-3-11 16:49:33

理想很丰满,现实很骨感。

到这一步,通过状态及状态队列驱动的机器看似跑通了。

但还是有个问题没解决。

怎么应对意外状况。

比如死了,比如断线了,比如遇到野外boss了。

状态机和状态队列的模式天生不适合处理意外状况。

这时候,我加入很多其他监听指定事件的意外处理守护程序。

当意外发生时,快照或者直接清理掉当前任务。

意外处理完时。由当前任务决定是否能够继续。不能继续就重新走任务队列。

很脏,很暴力,但有效。

凡事都有代价,我选择接受这个代价。

jarlyyn 发表于 2024-3-11 16:50:14

这样写机器,要多少触发啊?

恩,做一个全能机器人的话,100多个吧。

曹丞相不可能.gif

其实是可能的。所有的触发都是事件。所以,我有个^.*$的事件,叫做line,参数是当前文本。

对,全局事件统一规划,非全局的代码自己监听online事件。

online事件的监听主要由4个地方负责

1.当前状态,离开状态时自动失效。一般用来做任务等待确定的恢复。
2.当前任务,结束任务时自动失效。用来做不定时的触发。比如新任务的线索。
3.当前房间,离开房间时自动失效。当一个房间涉及到多个状态切换时使用。
4.当前战斗,战斗结束时自动失效。用来做特殊的战斗触发,比如偷学。

对的,只要有责任人,偶尔跨界一次,未必不好。

我们只是写一个机器人,不是玩代码宗教,不必过于强调纯洁性。

jarlyyn 发表于 2024-3-11 16:50:45

外面的世界很大,我想走一走

整个逻辑系统讲完了,剩下的就是房间系统了。

房间系统对于mud来说是很独立的一块,因为不走标准的心跳拿一块。

对于北侠来说,房间系统就是 敏感词敏感词敏感词,所以细节不多说了。

八仙过海,各显神通吧。

就是说几个基本点


[*]不要用数字id命名,维护起来要哭。我喜欢地区+房间的拼音简称,能直接看房间说命名。
[*]要维护当前房间信息。包括当前房间ID,描述,对象列表,变量空间(方便写机器),触发
[*]要记录当前房间ID,没有移动,或者标记过look的话不清楚ID,实现论坛上说的“惯性定位”。每次都要定位的话很蛋疼
[*]房间出口要有标签。有些出口乞丐能走,别的不行。有些出口女的能走,男的不行。
[*]尽量实现动态生成路径。就是能把制定几个房间,周围制定的N格,根据标签动态生成固定路径。如果能实现按剩余房间而不是路径动态遍历更好。


有条件再开帖子细化下不敏感的内容

protectqiqi 发表于 2024-3-11 16:51:18

膜拜下大佬,什么时候我才能看懂大佬写的东西呢。

jarlyyn 发表于 2024-3-11 16:51:19

战,我要战

战斗系统,没啥好说的。

Timer,永远的timer

抓起足够多的变量,设置一个根据变量和cd,有优先级的战斗策略系统,就差不多了。

锚定心跳的系统,不用timer属于折腾自己。


jarlyyn 发表于 2024-3-11 16:51:59

本帖最后由 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

jarlyyn 发表于 2024-3-11 16:52:32

结语

终于,我也逼逼叨叨的说完了。

玩北侠本来就是实践一把机器的新想法,现在发了这个帖子也算有始有终。

有了总结,机器应该还会再写,毕竟mud那么多,一个一个写过来能写到天荒地老。

这个机器本身,因为是边写边用,很多底层的东西哪怕重构过一次也改不掉,所以也总有不完美的地方。

不过,这本身也是写代码有乐趣的地方,有想法,实现它,完善它,犹如生物的进化,那一刻,你就是造物主。

页: 1 [2]
查看完整版本: pkuxkx.noob机器人架构剖析