03丨游戏AINPC设计:人如何应对插入事件?
创建日期:2025-01-11
更新日期:2025-02-04
阅读次数:49
需求
当收到建议时,回复是否答应。
一阶:事件
OnGetSuggest(t => Reply(t));
这有一个问题:瞬间回复,不需要思考吗?
二阶:延迟动作
OnGetSuggest(t => Random(1, 5).SecondsThen(() => Reply(t)));
随机延迟1到5秒后回复,明明瞬间就能得到答案却非要装出一副思考的样子,类似于阿尔法狗固定两分钟走一步棋。虽然后台粗暴失真,但前台看来勉强能用。 但还有一个新问题:忙起来怎么办?收到建议时,忙碌的人会说稍等。
三阶:分类讨论
OnGetSuggest(t => {
if (IsBusy) {
Speek(SpeekType.Wait);
WaitFor(() => !IsBusy).Then(() => GetSuggest(t));
} else {
Speek(SpeekType.Emmm);
Random(1, 5).SecondsThen(() => Reply(t));
}
});
思路:受到建议时,如果忙碌,那么说稍等,然后等到不忙时再重新处理建议。如果不忙,那么说Emmm,然后随机一到五秒后回复。 这还有一个新问题:如何学习?例如后天签订了一个卖身协议:你要拒绝一切除我之外的人给你的提议。 不定时签协议,不定时撕毁协议,协议内容不定、上面只是一个特例。 目前的架构无法兼容这个新的需求,扩展性不够,因此还需要再修改。
四阶:临时记忆
OnGetSuggest(t => Memory.InstantAdd(t));
AddRule(() => Memory.InstantHave<Suggest>(), () => {
var A = Memory.InstantGet<Suggest>();
if (IsBusy) {
Speek(SpeekType.Wait);
WaitFor(() => !IsBusy).Then(() => GetSuggest(A));
} else {
Speek(SpeekType.Emmm);
Random(1, 5).SecondsThen(() => Reply(A));
}
});
临时记忆容量为3到6,新增新内容时自动挤掉旧的内容。 当获得提议时,自动加入临时记忆。使用规则的形式实现对记忆的处理:如果记忆中有提议,那么分类讨论。 这样可以方便的实现规则的新增、修改、删除。要签订卖身协议,那么只需要这样:
OnGetSuggest(t => Memory.InstantAdd(t));
AddRule(() => Memory.InstantHave<Suggest>(), () => {
var A = Memory.InstantGet<Suggest>();
if (IsBusy) {
Speek(SpeekType.Wait);
WaitFor(() => !IsBusy).Then(() => GetSuggest(A));
} else {
Speek(SpeekType.Emmm);
Random(1, 5).SecondsThen(() => Reply(A));
}
});
(已屏蔽)
AddRule(() => Memory.InstantHave<Suggest>(), () => {
var A = Memory.InstantGet<Suggest>();
if(A.Sender != X.PartyA) {
Speek(SpeekType.Reject);(已屏蔽)
Memory.InstantRemove(A);
}
}, RuleType.High);(已屏蔽)
这个结构还有其他好处,例如加入临时记忆时可以对提议进行预处理。
总结
上述结构还不与人脑完全一致,但足以实现现阶段的风神界DEMO设计,可以让AI能够处理提议。