newtonerdai 发表于 2020-4-29 04:09:34

[UP1.5] AI的递进结构

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

;///////////////////////////////////////////////////////////
;//                        递进结构                     //
;//                                     适用于UP/WK/LK/DE //
;//                                    制作 newtonerdai //
;///////////////////////////////////////////////////////////
;【注】本文只作教程用,重在理解。请不要直接套用。
;这里的递进结构只是其中一种。本文中的例子,其多个选项之间是没有交集的,所以可以让AI每次遍历时都从头刷新一次。
;如果你的多个选项之间有交集或划分(比如战力碾压时可能会选择莽冲(淹没敌人),战力被碾压时也有可能会选择莽冲(放弃治疗)),那就需要自己思考做法了,动动脑筋吧~!

(defconst enemy-seen 100)
;enemy-seen = 0 —— 初始状态,代表未发现敌人
;enemy-seen = 1 —— 代表发现了敌人。
(defconst choice 101)
;choice = 0 —— 初始状态。未发现敌人时,不进行任何选择
;choice >= 1 —— 当发现敌人后,激活选择模块
;   choice = 10 —— 选择:进攻
;       choice = 11 —— 执行:莽冲
;            (choice = 11~14 —— 更细节的决定)
;       choice = 15 —— 执行:风筝绕圈
;            (同理,更细节的决定)
;   choice = 20 —— 选择:撤退
;       choice = 21 —— 执行:直撤
;       choice = 25 —— 执行:边打边退
;   战斗结束后,重置choice为0

(defconst gl-local-total 102)       ;本地搜索结果计数(即搜索AI玩家自己)
(defconst gl-local-last 103)
(defconst gl-remote-total 104)      ;远程搜索结果计数(可以是搜索任何玩家)
(defconst gl-remote-last 105)

;初始化
(defrule
    (true)
=>
    (set-goal enemy-seen 0)
    (set-goal choice 0)
    (disable-self)
)
;================== 判断战斗状态模块 ==================
;搜索敌人(玩家1)的最多40个弓兵系单位
(defrule
    (true)
=>
    (up-full-reset-search)                      ;搜索前需清空筛选和搜索结果
    (up-modify-sn sn-focus-player-number c:= 1) ;设置焦点玩家为玩家1(焦点即为观察)
    (up-find-remote c: archer-line c: 40)       ;搜索焦点玩家的弓兵系最多40个
    (up-get-search-state gl-local-total)      ;获取搜索结果计数到以gl-local-total开头的连续4个变量
)
;发现敌人时,设为1
(defrule
    (up-compare-goal gl-remote-total c:>= 1)    ;判断远程搜索结果计数,≥1时说明发现了敌人
=>
    (set-goal enemy-seen 1)
    (chat-to-all "发现敌人")
)
;没有发现敌人时,设为0
(defrule
    (up-compare-goal gl-remote-total c:== 0)    ;判断远程搜索结果计数,为0时说明没有发现敌人
=>
    (set-goal enemy-seen 0)
    (chat-to-all "没有发现敌人")
)
;搜索完成后清空搜索
(defrule
    (true)
=>
    (up-full-reset-search)
    (up-get-search-state gl-local-total)
)

;===================== 选择模块 =====================
;发现敌人时,开启模块
(defrule
    (goal enemy-seen 1)
=>
    (set-goal choice 1)
)
;没有发现敌人时,关闭模块
(defrule
    (goal enemy-seen 0)
=>
    (set-goal choice 0)
)
;+++++++++++++++++++++ 选择阶段 ++++++++++++++++++++

;----------- A. 决定进攻 ------------
(defrule
    (up-compare-goal choice c:>= 1)             ;大于等于1时成立。这么写可以让AI每次遍历规则时都做一次决定,无论已做的决定是如何的。
    (unit-type-count archer-line >= 5)          ;检测复杂,此处略写。假设是检测 “我方战力>敌方战力” 的语句。
=>
    (set-goal choice 10)
    (chat-to-all "我决定继续攻击")            ;【注】接下来这些chat-to-all会不断重复发出。如果想只说一次,可以自己思考哦~
)
    ;① 进攻 => 莽冲
    (defrule
      (up-compare-goal choice c:>= 10)
      (unit-type-count archer-line >= 20)   ;检测复杂,此处略写。假设是检测 “我方战力 碾压 敌方战力” 的语句。
    =>
      (set-goal choice 11)
      (chat-to-all "我优势很大,我要莽冲了")
    )
    ;② 进攻 => 风筝绕圈
    (defrule
      (up-compare-goal choice c:>= 10)
      (unit-type-count archer-line < 20)      ;检测复杂,此处略写。假设是检测 “我方战力 稍大于 敌方战力” 的语句。
    =>
      (set-goal choice 15)
      (chat-to-all "我优势不大,执行风筝战术")
    )

;---------- B. 决定撤退 -----------
(defrule
    (up-compare-goal choice c:>= 1)
    (unit-type-count archer-line < 10)          ;检测复杂,此处略写。假设是检测 “我方战力<敌方战力” 的语句。
=>
    (set-goal choice 20)
    (chat-to-all "我决定撤退了")
)
    ;① 撤退 => 直撤
    (defrule
      (up-compare-goal choice c:>= 20)
      (unit-type-count archer-line <= 6)      ;检测复杂,此处略写。假设是检测 “我方战力 远远小于 敌方战力” 的语句。
    =>
      (set-goal choice 21)
      (chat-to-all "我战力太弱了,我要直接撤退了")
    )
    ;② 撤退 => 边打边退
    (defrule
      (up-compare-goal choice c:>= 20)
      (unit-type-count archer-line > 6)       ;检测复杂,此处略写。假设是检测 “我方战力 稍小于 敌方战力” 的语句。
    =>
      (set-goal choice 25)
      (chat-to-all "我劣势不算太大,我要边打边退")
    )

cxt 发表于 2020-4-29 08:57:13

新桶又熬夜写AI了{:11_482:}
页: [1]
查看完整版本: [UP1.5] AI的递进结构