newtonerdai 发表于 2020-4-28 19:48:41

[UP1.5] AI的瞬间循环结构

本帖最后由 newtonerdai 于 2020-6-13 11:25 编辑

;///////////////////////////////////////////////////////////
;//                        循环结构                     //
;//                                     适用于UP/WK/LK/DE //
;//                                    制作 newtonerdai //
;///////////////////////////////////////////////////////////
;循环执行是代码界非常重要的一种功能。在 Userpatch 问世之前,帝国的AI要做出瞬时循环,想要循环N次,就需要N+个规则。
;拜 Userpatch 的新AI语句所赐,帝国的AI也拥有了只需寥寥数个规则,就能简单实现瞬时循环的方法!
;这里提供了2种瞬时循环N次的方式。给大家学习。
;【注:本文仅作教程用,不适合直接套用】

(defconst i 100)    ;示例①
(defconst k 101)    ;示例②

;初始化。让循环从第1次开始,而非第0次
(defrule
    (true)
=>
    (set-goal i 1)
    (set-goal k 1)
    (disable-self)
)

;① 跳出条件是大于5时的结果是:循环到5后,直接跳出循环。最终只循环4次
(defrule
    (up-compare-goal i c:< 5)               ;对比,当i<5时执行规则
    (taunt-detected 1 1)                  ;测试用。玩家1输入 1 时启动循环
=>
    (up-chat-data-to-all "第%d次循环" g: i) ;每次循环开始时,报告是第几次循环
    (up-modify-goal i c:+ 1)                ;每次循环,记数+1
    (up-jump-rule -1)                     ;重复本条规则
)
(defrule
    (goal i 5)                              ;i = 5 时执行报告规则
=>
    (chat-to-all "i循环了4次,已结束")
    (acknowledge-taunt 1 1)               ;注销 1 号嘲弄,重置为初始状态
    (set-goal i 1)                        ;重置循环次数为1
)

;② 跳出条件是大于等于5时的结果是:循环到5后,再循环一次才结束。最终循环5次
(defrule
    (up-compare-goal k c:<= 5)            ;对比,当k≤5时执行规则
    (taunt-detected 1 2)                  ;测试用。玩家1输入 2 时启动循环
=>
    (up-chat-data-to-all "第%d次循环" g: k) ;每次循环开始时,报告是第几次循环
    (up-modify-goal k c:+ 1)                ;每次循环,记数+1
    (up-jump-rule -1)                     ;重复本条规则
)
(defrule
    (goal k 6)                              ;k = 6 时执行报告规则
=>
    (chat-to-all "k循环了5次,已结束")
    (acknowledge-taunt 1 2)               ;注销 2 号嘲弄,重置为初始状态
    (set-goal k 1)                        ;重置循环次数为1
)




页: [1]
查看完整版本: [UP1.5] AI的瞬间循环结构