blazefires 发表于 2020-6-24 14:04:02

[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)
)

是不是很简单呢,搭配上次学习的阵列,即可制作一个排序函数了

newtonerdai 发表于 2020-6-24 17:27:47

妙啊,编程思想在AI里的运用!

关键在于利用up-get-rule-id 和 up-jump-direct来定位、直接跳转到特定的规则。

而且由于每次调用 [函数规则块] 之前都会更新一次主程式的规则id——


[*]因此,我们可以在第100条规则处调用函数,函数执行完毕后会返回到第101条规则;
[*]接着在第200条规则处即使又调用一次,函数又会返回到第201条规则。——也就是说,无论在哪里调用函数,函数结束后都会返回调用前的主程式处,继续执行。

我之前一直不知道这两个语句该怎么用,现在懂了。


那我就补充一下这两个语句的作用解释吧!——
(出自UserPatch 1.5 脚本编写参考 - 2020.06.15)






另外再附赠两个跳转规则的语句说明吧——



页: [1]
查看完整版本: [UP1.5] 函数的呼叫与使用