[UP1.5] 函数的呼叫与使用
本帖最后由 blazefires 于 2020-6-24 14:05 编辑这边以取两数(皆为正数)GCD(最大公因数为例):
注意:此范本为完整的,可直接复制进游戏里
(defconst t 1) ;暂存数
(defconst a 2)
(defconst b 3)
(defconst gcd 4) ;两数最大公因数
(defconst func-rule-id 5) ;呼叫函数
(defconst return-rule-id 6) ;返回主程式
(defrule
(true)
=>
(up-get-rule-id func-rule-id)
(up-modify-goal func-rule-id c:+ 1)
(up-jump-rule 3) ;函数区平时默认不执行,需要用时才执行
)
;--------------------函数开始----------------------------
(defrule
(up-compare-goal a g:< b) ;如果a<b 讓a成為被除數
=>
(up-modify-goal t g:= b)
(up-modify-goal b g:= a)
(up-modify-goal a g:= t)
)
(defrule
(up-compare-goal b > 0)
=>
(up-modify-goal t g:= a)
(up-modify-goal t g:mod b)
(up-modify-goal a g:= b)
(up-modify-goal b g:= t)
(up-jump-rule -1)
)
(defrule
(true)
=>
(up-modify-goal gcd g:= a)
(up-jump-direct g: return-rule-id)
)
;--------------------函数结束----------------------------
;--------------------主程式区----------------------------
(defrule
(taunt-detected my-player-number 200) ;输入200则开始求两数gcd
=>
(up-get-rule-id return-rule-id)
(up-modify-goal return-rule-id c:+ 1)
(set-goal a 837)
(set-goal b 1647)
(up-jump-direct g: func-rule-id) ;开始求gcd(837,1647)
)
(defrule
(taunt-detected my-player-number 200)
=>
(up-chat-data-to-all "gcd(1647,837) = %d" g: gcd) ;答案应为27
(acknowledge-taunt my-player-number 200)
)
是不是很简单呢,搭配上次学习的阵列,即可制作一个排序函数了
妙啊,编程思想在AI里的运用!
关键在于利用up-get-rule-id 和 up-jump-direct来定位、直接跳转到特定的规则。
而且由于每次调用 [函数规则块] 之前都会更新一次主程式的规则id——
[*]因此,我们可以在第100条规则处调用函数,函数执行完毕后会返回到第101条规则;
[*]接着在第200条规则处即使又调用一次,函数又会返回到第201条规则。——也就是说,无论在哪里调用函数,函数结束后都会返回调用前的主程式处,继续执行。
我之前一直不知道这两个语句该怎么用,现在懂了。
那我就补充一下这两个语句的作用解释吧!——
(出自UserPatch 1.5 脚本编写参考 - 2020.06.15)
另外再附赠两个跳转规则的语句说明吧——
页:
[1]