newtonerdai 发表于 2020-3-21 16:08:33

[UP1.5] 收到gg后发送gg的AI模块




;预定义文本“gg”为一个常数"text"(可以类比数学中的代数)
(defconst text "gg")

;这是之后往前跳转-3条后回到的规则
(defrule
    (true)
=>
    ;时刻储存最后一个且是来自于焦点玩家的聊天单词(空格分隔,如“AA BB”为两个单词,“我是new123”是一个单词)到缓存区。注意只能储存最后一个,如果发出"gg"后瞬间又有人发了一条"nice bro",那就会获取到"bro",而非"gg"。
    (up-store-player-chat focus-player)
)
(defrule
    ;检测缓存区里的内容是否包含text里的关键词"gg"。不包含gg时对应-1,包含时为首次出现处前面的字符数量,所以无法检测含有多少条“gg”。
    (up-compare-text c: text >= 0)
    ;检测自己对焦点玩家的外交状态,只有敌人发出的gg才会回应
    (stance-toward focus-player enemy)
=>
    ;测试用,可以发送出缓存区里的内容。%s和c: 7031232是用来调用缓存区的指令符。
    ;(up-chat-data-to-all "text: %s" c: 7031232)
    ;向所有人发送“gg”
    (chat-to-all "gg")
    ;跳过下面那一条规则,结束整个检测模块
    (up-jump-rule 1)
    ;只回应一次
    (disable-self)
)
(defrule
    (up-compare-sn sn-focus-player-number c:< 8)
=>
    ;在焦点玩家为8之前,让焦点玩家不断+1,结合下面的跳转语句,实现瞬时遍历8个玩家。
    (up-modify-sn sn-focus-player-number c:+ 1)
    ;往前跳转3条规则(包括本条规则)
    (up-jump-rule -3)
)

(defrule
    (true)
=>
    ;整个模块结束后,还原焦点玩家为1
    (up-modify-sn sn-focus-player-number c:= 1)
)




这样,只要任一敌对玩家发出“gg”“gg!”“wow!gg”这类包含gg的内容,AI就会立刻回应一个gg。(注意,如果是发送了“gg! bro”因为空格分开导致只提取了“bro”,这时无法回应gg)


同理,(defconst text "gg")里的gg可以换成任何你想要的关键词。


如果有心做,你甚至可以把你的AI做成微软小冰/小娜这样的聊天AI!
{:10_440:}


newtonerdai 发表于 2020-3-21 18:33:19

更新了一下,现在功能更齐全了。

newtonerdai 发表于 2020-4-29 05:26:02

更新了一下,现在阅读更方便了。

newtonerdai 发表于 2020-5-25 17:01:05

更新了一下最新的规则说明和注释。
前段时间测试发现:
up-store-player-chat获取的是以空格作为分隔符的最后一个单词
up-compare-text返回的是文本首次出现时匹配的索引值
具体请看帖子。

Nero§Claudius 发表于 2020-9-3 22:30:26

啊这,我有一个大胆的想法

ex17889 发表于 2020-10-28 01:14:52

帝国女友指日可待
页: [1]
查看完整版本: [UP1.5] 收到gg后发送gg的AI模块