北大侠客行MUD论坛

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

【Paotin++】爵位任务辅助机器人思路

[复制链接]
发表于 2024-6-20 15:16:57 | 显示全部楼层 |阅读模式
本帖最后由 doumimi 于 2024-6-20 03:55 PM 编辑

萌新分享一下的做爵位任务的辅助机器人的思路。  

最近总算慢慢的玩到了50多万经验,想升级到11级, 无奈发现声望不够。 参考了newbie:fuli [北大侠客行MUD百科] (pkuxkx.net)  这篇wiki 说萌新前期要想获取声望,比较推荐去做爵位任务。 好吧,那就开始吧。任务内容就不细说了,wiki里面有。先自己做几遍任务熟悉一下情况, 分析提炼一下任务的流程。 task:cajwrw [北大侠客行MUD百科] (pkuxkx.net)

别忘了pt有逍遥行, 我们通过 "xy 金光门" 来到附近, 然后再通过e;e;e;s;w 来到京兆府侧厅接取任务就行。

在手动做任务的过程中,有2个痛点:1. 对比耗时且麻烦。
2. 容易出错, 有时候对比着就晕了,感觉是他,但是没想到有另外一个人会比他多一个线索这样。

这个任务是要分为3个阶段。 我称之为【寻踪问迹】【观心辨影】【剑指真凶】 。那么下面来就任务的三个阶段分别来说明一下如何通过机器来搞定上面的痛点。


【寻踪问迹】
首先我们要通过#action来捕捉到用户说的具体的内容。  此时我们需要根据用户话中的内容, 提炼出来【特征真值】。
  1. 颜真说道:「前几天我去那家店里买东西的时候总有一个矮个子的流民在附近转悠。」
  2. 郝宏说道:「我记得当时有一个身穿浅色衣服的人非常值得怀疑」
  3. 樊晓圣说道:「我感觉这些路边的流浪汉嫌疑非常大。」
  4. 黄辉说道:「我啥消息也不了解啊。」
  5. 戴馨慧说道:「只记得当时那个人身穿夹袄,非常破旧了,就这点印象非常深刻。」
  6. 侯欣惠说道:「当时晚上我看见有一个脚上穿着一双凉鞋的人总在附近出没。」
复制代码

我们可以看到,这些特征对应的词是固定的,那么此时我们需要这样一个功能:  "只要这句话中,出现了一个特定词,那么就把这个特征加入到特征集合里面" .   那么在paotin里面如何实现这个地方呢?
通过if, switch case, regexp 都是可以的。  在这里,我主要是通过 regexp来实现的这个功能。  先贴一下介绍,




ok,看完了介绍, 那么我们来试一试这个方法要如何用。
  1. 2024-06-20 15:23:03 INPUT: #regexp {阮晓琼说道:「我记得当时有一个脚上穿着深色鞋子的人非常值得怀疑。} {%*深色鞋子%*} {okLog 发现深色鞋子!!!} {okLog 没有穿深色鞋子}
  2. 发现深色鞋子!!!
复制代码

上面实现发现这个功能是可行的。那么就对照wiki,把用户特征都给抓出来就可以, 我这边抓出来之后,放到了一个list 里面备用。 下面举例一部分特征, 这个不是全部的,全部的请读者自己完善。

  1. #alias jw.get-ask-trait {
  2.     #local find_trait false;
  3.     #regexp %1 {%*{女|男}%*} {#var find_trait true; #list trait add {&2}};
  4.     #regexp %1 {%*{高|矮}%*} {#var find_trait true; #list trait add {&2}};
  5.     #regexp %1 {%*{竹竿|猴子|偏瘦}%*} {#var find_trait true; #list trait add {瘦}};
  6.     #regexp %1 {%*{胖|发福}%*} {#var find_trait true; #list trait add {胖}};

  7.     #regexp %1 {%*花白%*} {#var find_trait true; #list trait add {六十} {七十}};
  8.     #regexp %1 {%*白发苍苍%*} {#var find_trait true; #list trait add {六十} {七十}};
  9.     #regexp %1 {%*非常年轻%*} {#var find_trait true; #list trait add {二十}};
  10.     #regexp %1 {%*年轻人%*} {#var find_trait true; #list trait add {二十} {三十}};
  11.    
  12.     #regexp %1 {%*{深色衣服|浅色衣服|深色鞋子|浅色鞋子}%*} {#var find_trait true;#list trait add {&2}};
  13.     #regexp %1 {%*{靴子|布鞋|凉鞋}%*} {#var find_trait true;#list trait add {&2}};
  14.    
  15.     okLog 找到特征: $find_trait;
  16.     jobLog $trait;
  17. };
复制代码



最终问完一遍之后,最终收集的【特征真值】如下所示:



【观心辨影】
上面我们已经找到了真凶的所有特征值。 现在要做的事情就是获取路人的特征值, 那么其实思路跟上面是一样的, 就要在look luren 的时候,通过action来获取到响应的内容, 然后通过#regexp来提取出来特征。
我们可以看到,特征集中在这几个地方。 年龄,性别,高矮,胖瘦,衣服,鞋子,衣服颜色,鞋子颜色。
(哦,这里插一句, 看高矮胖瘦是要通过用户头像下面的那个句话判断 。 【这是一位身材异常魁梧高大的行人】 这种描述对应的就是 女人、高、胖 。  这个内容wiki里面也有)。
其中 大部分内容我相信大家都能够抓到, 其中比较特殊的就是颜色字段。   颜色触发怎么搞呢 ? 分享一个10w经验的明教小萌新PaoTin++成长之路 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.net) 这个文章里面有讲。 用%c匹配颜色, 用%u匹配汉字。  然后匹配颜色的时候,我发现有些内容是 1;37m 有些是2;37m. 这个地方我还不太了解是啥意思(猜测可能是字体?),不过用%*还是能把想要的东西匹配出来。
  1. #action {~%*身穿一件%c%+2..4u%c(%*%c)%*} {
  2.     #nop okLog 衣服是:%%3;
  3.     #regexp %%3 {{丝织长衫|丝绸短襦|绸袍|丝织儒衫|轻罗纱|旗袍}} {#var cloth 丝绸} {};
  4.     #regexp %%3 {{坎肩|圆领衫|灰布衫|灰马褂|百褶裙|蓝马褂|短打劲装|天蓝锦袍}} {#var cloth 布衣} {};
  5.     #regexp %%3 {{鹤氅|长袄|棉袄|狼皮袄|短袄|比甲}} {#var cloth 夹袄} {};
  6.     #nop okLog 衣服种类是: $cloth;
  7.    
  8.     #nop okLog 衣服颜色是:%%2颜色;
  9.     #nop 深色组: 黑30、红31、蓝34、紫35;
  10.     #nop 浅色组:绿32、黄33、青36、白37;
  11.     #regexp %%2 {%*{32|33|36|37}%*} {#var cloth_color 浅色衣服} {};
  12.     #regexp %%2 {%*{30|31|34|35}%*} {#var cloth_color 深色衣服} {};
  13.     #nop okLog 衣服颜色是: $cloth_color;
  14. };
复制代码


同理, 鞋子也可以用类似的方法匹配出来了,那么最终实现的效果就是如下所示。


【剑指真凶】
最后一部分就是特征的匹配啦, 我这边的实现方案还是通过#regex。我把嫌疑人的特征链接成一个字符串,然后遍历所有【特征真值】,判断每一个【特征真值】是否出现在嫌疑人的所有特征中。 如果出现了,证明特征匹配到。  当然通过两个list遍历判断也行,可能性能会更好。
  1. #function jw.match {
  2.     #local temp_trait %1;
  3.     okLog $temp_trait;
  4.     #local match_cnt 0;
  5.     #FOREACH {$trait} {i} {
  6.         #REGEXP {$temp_trait} {%*$i%*} {okLog 一样的:$i; math.Inc match_cnt} {};
  7.     };
  8.     okLog 这个人的特征值匹配到: $match_cnt 个;
  9.     #return $match_cnt;
  10. };
复制代码
最终实现效果如图所示:


当然,这个还可以升级,比如把凶手可能说假话也算进去,自动寻路啥之类的,就不在本帖展开了。
好啦,本帖到此结束。






北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 15:19:43 | 显示全部楼层
抢个沙发
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 16:02:41 | 显示全部楼层
占位再看啊,大佬辛苦了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 16:19:55 | 显示全部楼层
思路清晰,非常专业
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 16:47:24 | 显示全部楼层
爵位的核心有两点

1.逻辑冲突证否
2.年龄的不确定性
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-6-20 17:10:34 | 显示全部楼层
本帖最后由 doumimi 于 2024-8-20 07:26 PM 编辑
jarlyyn 发表于 2024-6-20 04:47 PM
爵位的核心有两点

1.逻辑冲突证否

体会了一下你说的逻辑冲突证否, 醍醐灌顶。 只要有一个人有2个特征不满足,那么一定不是真凶。 可以用排除法来搞。
我上面还是有很小概率会出现分值一样的人(因为凶手说谎)。 结合证否, 应该能100%确定真凶。


北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 17:15:56 | 显示全部楼层
根据任务机制和保证失败率原则
没有100%任务成功的可能,大部分成功即可
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-6-20 17:18:02 | 显示全部楼层
doumimi 发表于 2024-6-20 05:10 PM
体会了一下你说的逻辑冲突证否, 醍醐灌顶。 只要有一个人有2个特征不满足,那么一定不是真凶。 可以用排 ...

wiki上分值的说法是有点问题的

本质来说,这个任务是找冲突

人的证词和自己的特征/别人的证词之间的冲突。

一旦有冲突,就可以确定冲突的总有一个有问题。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
回复 支持 2 反对 0

使用道具 举报

发表于 2024-6-21 09:50:37 | 显示全部楼层
jarlyyn 发表于 2024-6-20 05:18 PM
wiki上分值的说法是有点问题的

本质来说,这个任务是找冲突

我是按照WIKI上的这两条逻辑做的排除法
1、路人A提供特征X,那么除了路人A外,所有不符合特征X的其他路人都不是盗贼。
2、路人A提供特征X,而路人A自身符合特征X,则路人A不是盗贼,特征X为真。
这两条逻辑你自己稍微捋一捋会发现肯定是对的  基本上这两条逻辑筛一遍剩下的就是盗贼

有两个需要注意的问题:
1、太监性别是双性人  可男可女  这个要在逻辑判别中专门加上   可以用自己问路人的时候称呼来判定  叫公公的就是太监
2、年龄的判定不准确 据说内功深厚会导致看起来的年龄与实际年龄不符  这个就会有点要命  所以你如果用这两条判定 有可能会出现一个人都没有剩下的情形。。。。 但不管怎么说 大多数情况都还是能判断的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-6-21 10:53:00 | 显示全部楼层
本帖最后由 doumimi 于 2024-8-20 07:28 PM 编辑
devilkate 发表于 2024-6-21 09:50 AM
我是按照WIKI上的这两条逻辑做的排除法
1、路人A提供特征X,那么除了路人A外,所有不符合特征X的其他路人 ...

受教了,用排除法确实感觉更好,我抽空也改一下。

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

本版积分规则

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

GMT+8, 2024-12-26 08:52 PM , Processed in 0.011960 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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