[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 "我劣势不算太大,我要边打边退")
)
新桶又熬夜写AI了{:11_482:}
页:
[1]