newtonerdai 发表于 2020-5-20 23:50:36

[UP1.5] 寻找并攻击血量最低的前几个单位的AI(简单版)

本帖最后由 newtonerdai 于 2020-5-20 23:53 编辑

如果不用考虑未找到任何单位的情况,可以只用一条规则:
(defrule
    (taunt-detected 1 9)            ;(测试用)发出数字9后开始运行。
    (up-timer-status 10 <= 1)       ;10 = 定时器10号。<=1 :禁用或已触发
=>
    (up-full-reset-search)          ;使用DUC前先完全重置
    (set-strategic-number sn-focus-player-number 1)
    (up-find-remote c: -1 c: 40)    ;-1 = 任何单位
    (up-clean-search 2 10 1)      ;2 = 远程搜索。10 = 当前HP。1 = 正序(血量最少排最前)
    (up-remove-objects 2 -1 c:> 1);2 = 远程搜索。-1 = 索引。1 = 只保留前2个远程结果

    (up-find-local c: -1 c: 40)   ;-1 = 任何单位
    (up-target-objects 0 0 -1 -1)   ;第二个0 = 右键。
    (enable-timer 10 2)             ;10 = 定时器10号。2 = 两秒执行一次
)
如果需要考虑没有搜索到单位的情况,则加一条规则来检测:
(defconst gl-local-total 300)
(defconst gl-local-last 301)
(defconst gl-remote-total 302)
(defconst gl-remote-last 303)

(defrule
    (taunt-detected 1 9)            ;(测试用)发出数字9后开始运行。
    (up-timer-status 10 <= 1)       ;10 = 定时器10号。<=1 :禁用或已触发
=>
    (up-full-reset-search)          ;使用DUC前先完全重置

    (up-find-local c: -1 c: 40)   ;-1 = 任何单位
    (set-strategic-number sn-focus-player-number 1)
    (up-find-remote c: -1 c: 40)    ;-1 = 任何单位
   
    (up-get-search-state gl-local-total)    ;获取搜索计数
)

(defrule
    (taunt-detected 1 9)            ;(测试用)发出数字9后开始运行。
    (up-timer-status 10 <= 1)       ;10 = 定时器10号。<=1 :禁用或已触发
    (up-compare-goal gl-local-total c:> 0);只有有单位时才执行排序和指派
    (up-compare-goal gl-remote-total c:> 0) ;同上
=>
    (up-clean-search 2 10 1)      ;2 = 远程搜索。10 = 当前HP。1 = 正序(血量最少排最前)
    (up-remove-objects 2 -1 c:> 1);2 = 远程搜索。-1 = 索引。1 = 只保留前2个远程结果

    (up-target-objects 0 0 -1 -1)   ;第二个0 = 右键。
    (enable-timer 10 2)             ;10 = 定时器10号。2 = 两秒执行一次
)

chifeiyen 发表于 2020-5-23 21:08:23

如果想改成攻击血量最多单位,需要改动哪里?改成什么数值?

chifeiyen 发表于 2020-5-23 21:08:28

如果想改成攻击血量最多单位,需要改动哪里?改成什么数值?

blazefires 发表于 2020-5-24 03:23:04

chifeiyen 发表于 2020-5-23 21:08
如果想改成攻击血量最多单位,需要改动哪里?改成什么数值?

最好别用命令攻击,比如你AI弓兵选择到冲车血量最高,就会一直对冲车射箭射到冲车垮掉喔
这义味着过程中就算看见敌人一般部队或村民都会完全无视的,会一直射冲车

chifeiyen 发表于 2020-5-24 05:27:10

blazefires 发表于 2020-5-24 03:23
最好别用命令攻击,比如你AI弓兵选择到冲车血量最高,就会一直对冲车射箭射到冲车垮掉喔
这义味着过程中 ...

我就是想要这个效果啊,这样我的冲车也能更好当肉盾掩护步兵。

newtonerdai 发表于 2020-5-24 11:13:20

chifeiyen 发表于 2020-5-23 21:08
如果想改成攻击血量最多单位,需要改动哪里?改成什么数值?

(up-clean-search 2 10 1)改为 (up-clean-search 2 10 2)
1表示正序(从小到大)
2表示倒序(从大到小)

chifeiyen 发表于 2020-5-24 12:05:51

newtonerdai 发表于 2020-5-24 11:13
(up-clean-search 2 10 1)改为 (up-clean-search 2 10 2)
1表示正序(从小到大)
2表示倒序(从大到小) ...

谢谢!我想把DE默认AI也改成这样,我看了下AI文件里的up-clean-search策略后没有参数,但有以下两个策略值参数:
        (up-target-objects 0 action-garrison -1 -1)
        (up-target-objects 1 action-default -1 -1)
请问大大这俩策略是不是影响这个问题的?这里的-1是代表什么?改成攻击血量最大单位应该改成什么?

newtonerdai 发表于 2020-5-24 12:35:09

chifeiyen 发表于 2020-5-24 12:05
谢谢!我想把DE默认AI也改成这样,我看了下AI文件里的up-clean-search策略后没有参数,但有以下两个策略 ...

你可以试试用NotePad++来在整个文件夹的文件中搜索。找到挺多的。



修改思路是:找到up-target-objects action-default,在它之前用主楼第二个方法里的up-clean-和up-remove-来筛选。

不过前提是你得知道哪些up-target-objects action-default是用于攻击的,而且在攻击之前筛选得怎样。

-1是会被忽略的参数。你列举的两条语句里的第一个-1表示阵型,第二个表示攻击姿态。一般用不到。

另外,这个不叫“策略值”,叫“动作”或者“语句/指令”,策略值是sn-开头的那种

chifeiyen 发表于 2020-5-24 13:05:12

本帖最后由 chifeiyen 于 2020-5-24 13:10 编辑

newtonerdai 发表于 2020-5-24 12:35
你可以试试用NotePad++来在整个文件夹的文件中搜索。找到挺多的。



好的,我研究一下,谢谢大大!
up-clean-search我倒是找到了,但它这里后面并不是1或2这种数字啊,这个也没法修改吧?

newtonerdai 发表于 2020-5-24 14:02:56

chifeiyen 发表于 2020-5-24 13:05
好的,我研究一下,谢谢大大!
up-clean-search我倒是找到了,但它这里后面并不是1或2这种数字啊,这个也 ...

这个你可以去看看UserPatchConst.per(论坛就有,搜索即可),或者Promisary文件夹里似乎有个叫“const.per”的文件,里面定义了很多的常数(其实就是用一串英文来指代一个数字,比如action-default表示的就是数字0,这方面可以去看看“CPSB”官方教程,在本版块的置顶帖里就有)
页: [1]
查看完整版本: [UP1.5] 寻找并攻击血量最低的前几个单位的AI(简单版)