【Paotin++】爵位任务辅助机器人思路的改进
基于doumimi的原帖https://pkuxkx.com/forum/thread-49270-1-1.html 做了进一步的改进。总体上和原帖的思路一致,但是判断原则改成基于wiki的对这个任务的二个原则:
1、路人A提供特征X,那么除了路人A外,所有不符合特征X的其他路人都不是盗贼。
盗贼只说假话或者不说,而只有一个盗贼,那么如果他是盗贼,则其他路人都不是,如果他不是盗贼,那不符合特征X的路人则都不是。
2、路人A提供特征X,而路人A自身符合特征X,则路人A不是盗贼,特征X为真。
基本思路是:
1. 第一步look luren 分析出路人的所有特征,和原帖一致
2. 第二步询问luren,得到路人的回答,同时根据以上的原则2来尝试排除被询问的人是盗贼的可能性
3. 把所有的路人都做了look和询问后,得到2个表结构,一个表结构记录当前所有人的所有特征,key是人的名字 ,第二个表结构得到是所有询问得到的询问结果,key也是人的名字
4. 对这2个表结构进行匹配过滤,按照以上原则1,把所有相关人的特征和询问结果做比较,最后把可以排除的人的 possible 属性改成0,最后剩下一个人的 possible 属性为1,就找到了
二个数据结构的示例
#var dt1.trait
{
{chai piaodan}
{
{key} {shoe}
{value} {靴子}
}
{jiang qianxue}
{
{key} {sex}
{value} {女}
}
{kong lanjie}
{
{key} {body}
{value} {瘦}
}
{qin qian}
{
{key} {height}
{value} {高}
}
{zheng yijia} {
{key} {cloth_color}
{value} {浅色衣服}
}
{zou bingya}
{
{key} {shoe_color}
{value} {浅色鞋子}
}
};
#var dt1.lurens
{
{chai piaodan}
{
{age} {五十}
{body} {胖}
{cloth} {布衣}
{cloth_color} {深色衣服}
{height} {矮}
{possible} {1}
{sex} {女}
{shoe} {凉鞋}
{shoe_color} {深色鞋子}
}
{gu muguan}
{
{age} {二十}
{body} {瘦}
{cloth} {夹袄}
{cloth_color} {深色衣服}
{height} {高}
{possible} {1}
{sex} {男}
{shoe} {靴子}
{shoe_color} {深色鞋子}
}
{jiang qianxue}
{
{age} {四十}
{body} {瘦}
{cloth} {布衣}
{cloth_color} {浅色衣服}
{height} {高}
{possible} {1}
{sex} {男}
{shoe} {靴子}
{shoe_color} {浅色鞋子}
}
{kong lanjie}
{
{age} {四十}
{body} {胖}
{cloth} {布衣}
{cloth_color} {深色衣服}
{height} {矮}
{possible} {1}
{sex} {女}
{shoe} {布鞋}
{shoe_color} {浅色鞋子}
}
{pan qian}
{
{age} {四十}
{body} {胖}
{cloth} {丝绸}
{cloth_color} {深色衣服}
{height} {矮}
{possible} {1}
{sex} {女}
{shoe} {靴子}
{shoe_color} {浅色鞋子}
}
{qin qian}
{
{age} {五十}
{body} {瘦}
{cloth} {丝绸}
{cloth_color} {""}
{height} {高}
{possible} {0}
{sex} {女}
{shoe} {布鞋}
{shoe_color} {""}
}
{wu biaoke}
{
{age} {二十}
{body} {胖}
{cloth} {夹袄}
{cloth_color} {浅色衣服}
{height} {矮}
{possible} {1}
{sex} {男}
{shoe} {凉鞋}
{shoe_color} {深色鞋子}
}
{zheng yijia}
{
{age} {三十}
{body} {瘦}
{cloth} {丝绸}
{cloth_color} {浅色衣服}
{height} {矮}
{possible} {0}
{sex} {女}
{shoe} {靴子}
{shoe_color} {深色鞋子}
}
{zou bingya}
{
{age} {四十}
{body} {瘦}
{cloth} {布衣}
{cloth_color} {浅色衣服}
{height} {矮}
{possible} {1}
{sex} {女}
{shoe} {靴子}
{shoe_color} {深色鞋子}
}
};
可以看到初始所有人的 possible 属性都是1,最终的目的就是排除,把可以排除的人一个个去掉。
几个比较方法参考如下:
#var tempi "";
#alias dt1.match {
#FOREACH {*{dt1.trait[]}} {i} {
#var tempi $i;
dt1.match1 $dt1.trait[$i] $dt1.trait[$i];
}
dtp1;
}
#alias {dtp1} {
#FOREACH {*{dt1.lurens[]}} {i} {
#local temp_possible $dt1.lurens[$i];
#if {$temp_possible == 1} {
okLog $i;
}
};
}
#alias dt1.match1 {
#local key %1;
#local value %2;
okLog ...... $key $value $tempi;
#FOREACH {*{dt1.lurens[]}} {i} {
#local temp_possible $dt1.lurens[$i];
#if {$temp_possible == 1} {
okLog 循环 $i $tempi;
#if {"$i" == "$tempi"} {
okLog 需屏蔽提供任务信息的询问者;
#continue;
};
#nop 先假设不匹配,将 possible 设为 0;
#var dt1.lurens[$i] 0;
okLog xxx $i $value $dt1.lurens[$i][$key] $dt1.lurens[$i];
#regexp {$value} {%*$dt1.lurens[$i][$key]%*} {okLog 根据规则1,不可排除;#var dt1.lurens[$i] 1;}
}
};
okLog 循环结束;
};
#alias dt1.match2 {
#local key %1;
#local value %2;
#nop okLog 尝试判断被询问者是否可以排除 $dt.luren $dt.lurens[$dt.luren][$key] $key $value;
#regexp {$value} {%*$dt.lurens[$dt.luren][$key]%*} {okLog 根据规则2,可排除;#var dt.lurens[$dt.luren] 0; }
};
其中 match1 就是按第一个原则按一个特征属性过滤
match2 就是按第二个原则过滤
match就是最后把2个表结构循环遍历 其中匹配的方法用函数更合适,但是函数使用多参数的时候,执行能成功,但是总是触发奇怪的指令,后来改成 alias 了,但是 alias 传输参数的时候,参数里不能包含空格,所以还得用全局变量,很是不爽 非常非常厉害,比我的那个破机器强多了哈。加油 先赞后看{:7_277:} 首先,北侠记得不能无限制的贴机器人,这个自己注意分寸。
第二,多跑测试,这任务如果没改过的话年龄这块做法是错的。
页:
[1]