单兵战术:残血收割
又来了~再次分享一段自己写的AI。逻辑:例遍每个正在战斗的单位,如果这个单位射程范围内有残血的敌人(一刀就死那种),立刻就得打死~
另外安利下新战役萨阿德王朝,其中的AI就是加入了这组战术。
;[残血收割]
(defconst gl-local-total 11)
(defconst gl-local-last 12)
(defconst gl-remote-total 13)
(defconst gl-remote-last 14)
(defconst answer 475)
(defconst reapers 476)
(defconst reaper-id 477)
(defconst reaper-type 478)
(defconst reaper-point 479)
(defconst reaper-range 480)
(defconst reaper-aggressivity 481)
(defconst preys 482)
(defconst prey-id 483)
(defconst prey-type 484)
(defconst prey-class 485)
(defconst prey-HP 486)
(defconst prey-armor 487)
(defconst prey-shield 488)
(defconst stop-attack-id 489)
(defconst next-reaper 490)
(defconst next-prey 491)
(defrule;搜索战斗单位
(true)
=>
(up-full-reset-search)
(up-filter-include -1 actionid-attack -1 -1)
(up-find-local c: castle c: 240)
(up-find-local c: tower-class c: 240)
(up-find-local c: siege-weapon-class c: 240)
(up-find-local c: archery-class c: 240)
(up-find-local c: cavalry-archer-class c: 240)
(up-find-local c: cavalry-class c: 240)
(up-find-local c: infantry-class c: 240)
(up-find-local c: 1126 c: 240)
(up-remove-objects search-local object-data-id g:== reaper-id)
(up-remove-objects search-local object-data-type == 1258)
(up-remove-objects search-local object-data-type == 422)
(up-remove-objects search-local object-data-type == 548)
(up-remove-objects search-local object-data-class == packed-trebuchet-class)
(up-remove-objects search-local object-data-class == unpacked-trebuchet-class)
(up-clean-search search-local object-data-action search-order-asc)
(up-get-search-state gl-local-total)
(up-modify-goal reapers g:= gl-local-total))
(defrule;例遍收割者置零
(up-compare-goal reapers c:<= next-reaper)
=>
(up-modify-goal next-reaper c:= 0))
(defrule;找不到收割者
(up-compare-goal reapers c:<= 0)
=>
(up-jump-rule 38)
(up-modify-goal reaper-id c:= -1)
(up-modify-goal next-reaper c:+ 1)
(up-modify-goal next-prey c:= 0))
(defrule;挑选收割者
(true)
=>
(up-set-target-object search-local g: next-reaper)
(up-get-object-data object-data-id reaper-id)
(up-get-object-data object-data-type reaper-type)
(up-get-object-data object-data-base-attack reaper-aggressivity)
(up-get-object-data object-data-range reaper-range)
(up-get-point position-object reaper-point-x))
(defrule;射程为0补偿为1
(up-compare-goal reaper-range c:< 1)
=>
(up-modify-goal reaper-range c:= 1))
(defrule;以收割者为中心,以其射程为半径搜索
(true)
=>
(up-set-target-point reaper-point-x)
(up-filter-distance c: -1 g: reaper-range))
(defrule;35
(stance-toward 1 enemy)
=>
(set-strategic-number sn-focus-player-number 1)
(up-find-remote c: -1 c: 40))
(defrule;34
(stance-toward 3 enemy)
=>
(set-strategic-number sn-focus-player-number 3)
(up-find-remote c: -1 c: 40))
(defrule;33
(stance-toward 4 enemy)
=>
(set-strategic-number sn-focus-player-number 4)
(up-find-remote c: -1 c: 40))
(defrule;32
(stance-toward 6 enemy)
=>
(set-strategic-number sn-focus-player-number 6)
(up-find-remote c: -1 c: 40))
(defrule;31
(stance-toward 5 enemy)
=>
(set-strategic-number sn-focus-player-number 5)
(up-find-remote c: -1 c: 40))
(defrule;30
(stance-toward 7 enemy)
=>
(set-strategic-number sn-focus-player-number 7)
(up-find-remote c: -1 c: 40))
(defrule;29
(stance-toward 8 enemy)
=>
(set-strategic-number sn-focus-player-number 8)
(up-find-remote c: -1 c: 40))
(defrule;28;搜索残血者
(true)
=>
(up-remove-objects search-remote object-data-id g:== stop-attack-id)
(up-get-search-state gl-local-total)
(up-modify-goal preys g:= gl-remote-total))
(defrule;27;找不到残血者
(up-compare-goal preys c:<= 0)
=>
(up-jump-rule 26)
(up-modify-goal reaper-id c:= -1)
(up-modify-goal next-reaper c:+ 1)
(up-modify-goal next-prey c:= 0))
(defrule;26;找到残血者
(up-compare-goal preys c:> 0)
=>
(up-clean-search search-remote object-data-hitpoints search-order-asc)
(up-set-target-object search-remote g: next-prey)
(up-get-object-data object-data-id prey-id)
(up-get-object-data object-data-type prey-type)
(up-get-object-data object-data-class prey-class)
(up-get-object-data object-data-hitpoints prey-HP)
(up-get-object-data object-data-strike-armor prey-armor)
(up-get-object-data object-data-pierce-armor prey-shield)
(up-modify-goal answer g:= reaper-aggressivity))
(defrule;25;例遍残血者置零
(up-compare-goal preys c:<= next-prey)
=>
(up-modify-goal next-reaper c:+ 1)
(up-modify-goal next-prey c:= 0))
(defrule;24;收割者是近战单位
(or (up-compare-goal reaper-type c:== 1126)
(up-compare-goal reaper-range c:<= 1))
=>
(up-jump-rule 1)
(up-modify-goal answer g:- prey-armor))
(defrule;23;收割者是远程单位
(up-compare-goal reaper-type c:!= 1126)
(up-compare-goal reaper-range c:> 1)
=>
(up-modify-goal answer g:- prey-shield))
(defrule;22;攻击力小于1视同为1
(up-compare-goal answer c:<= 1)
=>
(up-modify-goal answer c:= 1))
(defrule;21;收割者是长矛兵,残血者是骑兵
(up-compare-goal reaper-type c:== 93)
(or (up-compare-goal prey-type c:== 38)
(or (up-compare-goal prey-type c:== 283)
(up-compare-goal prey-class c:== scout-cavalry-class)))
=>
(up-jump-rule 18)
(up-modify-goal answer c:+ 15))
(defrule;20;收割者是长矛兵,残血者是战象;92
(up-compare-goal reaper-type c:== 93)
(or (up-compare-goal prey-type c:== 1132)
(or (up-compare-goal prey-type c:== 1134)
(or (up-compare-goal prey-type c:== 873)
(up-compare-goal prey-type c:== 875))))
=>
(up-jump-rule 17)
(up-modify-goal answer c:+ 30))
(defrule;19;收割者是长矛兵,残血者是骆驼
(up-compare-goal reaper-type c:== 93)
(or (up-compare-goal prey-type c:== 329)
(up-compare-goal prey-type c:== 330))
=>
(up-jump-rule 16)
(up-modify-goal answer c:+ 12))
(defrule;18;收割者是长矛兵,残血者是战船或渔船
(up-compare-goal reaper-type c:== 93)
(or (up-compare-goal prey-class c:== warship-class)
(up-compare-goal prey-type c:== 13))
=>
(up-jump-rule 15)
(up-modify-goal answer c:+ 9))
(defrule;17;收割者是步弓手或掷矛手,残血者是枪兵
(or (up-compare-goal reaper-type c:== 4)
(or (up-compare-goal reaper-type c:== 24)
(or (up-compare-goal reaper-type c:== 492)
(or (up-compare-goal reaper-type c:== 7)
(up-compare-goal reaper-type c:== 6)))))
(or (up-compare-goal prey-type c:== 93)
(or (up-compare-goal prey-type c:== 358)
(up-compare-goal prey-type c:== 359)))
=>
(up-modify-goal answer c:+ 3))
(defrule;16;收割者是掷矛手,残血者是弓兵种属;
(up-compare-goal reaper-type c:== 7)
(up-compare-goal prey-class c:== archery-class)
=>
(up-jump-rule 13)
(up-modify-goal answer c:+ 3))
(defrule;15;收割者是精锐掷矛手,残血者是弓兵种属;87
(up-compare-goal reaper-type c:== 6)
(up-compare-goal prey-class c:== archery-class)
=>
(up-modify-goal answer c:+ 4))
(defrule;14;收割者是精锐掷矛手,残血者是骑射手;86
(up-compare-goal reaper-type c:== 6)
(up-compare-goal prey-class c:== cavalry-archer-class)
=>
(up-jump-rule 11)
(up-modify-goal answer c:+ 6))
(defrule;13;收割者是骑射手,残血者是枪兵;85
(or (up-compare-goal reaper-type c:== 39)
(up-compare-goal reaper-type c:== 474))
(or (up-compare-goal prey-type c:== 93)
(or (up-compare-goal prey-type c:== 358)
(up-compare-goal prey-type c:== 359)))
=>
(up-jump-rule 10)
(up-modify-goal answer c:+ 2))
(defrule;12;收割者是斥候骑兵,残血者是僧侣;84
(up-compare-goal reaper-type c:== 448)
(up-compare-goal prey-class c:== monastery-class)
=>
(up-jump-rule 9)
(up-modify-goal answer c:+ 6))
(defrule;11;收割者是轻骑兵,残血者是僧侣;83
(up-compare-goal reaper-type c:== 546)
(up-compare-goal prey-class c:== monastery-class)
=>
(up-jump-rule 8)
(up-modify-goal answer c:+ 10))
(defrule;10;收割者是骆驼兵,残血者是骑兵;82
(up-compare-goal reaper-type c:== 546)
(or (up-compare-goal prey-type c:== 38)
(or (up-compare-goal prey-type c:== 283)
(up-compare-goal prey-class c:== scout-cavalry-class)))
=>
(up-jump-rule 7)
(up-modify-goal answer c:+ 9))
(defrule;9;收割者是骆驼兵,残血者是船只或者骆驼;81
(up-compare-goal reaper-type c:== 546)
(or (up-compare-goal prey-type c:== 546)
(or (up-compare-goal prey-type c:== 330)
(or (up-compare-goal prey-type c:== 13)
(up-compare-goal prey-class c:== warship-class))))
=>
(up-jump-rule 6)
(up-modify-goal answer c:+ 5))
(defrule;8;收割者是重装骆驼兵,残血者是骑兵;80
(up-compare-goal reaper-type c:== 330)
(or (up-compare-goal prey-type c:== 38)
(or (up-compare-goal prey-type c:== 283)
(up-compare-goal prey-class c:== scout-cavalry-class)))
=>
(up-jump-rule 5)
(up-modify-goal answer c:+ 18))
(defrule;7;收割者是重装骆驼兵,残血者是船只或者骆驼;79
(up-compare-goal reaper-type c:== 330)
(or (up-compare-goal prey-type c:== 546)
(or (up-compare-goal prey-type c:== 330)
(or (up-compare-goal prey-type c:== 13)
(up-compare-goal prey-class c:== warship-class))))
=>
(up-jump-rule 4)
(up-modify-goal answer c:+ 9))
(defrule;6;收割者是弩炮,残血者是战象系;78
(up-compare-goal reaper-type c:== 279)
(or (up-compare-goal prey-type c:== 1132)
(or (up-compare-goal prey-type c:== 1134)
(or (up-compare-goal prey-type c:== 873)
(up-compare-goal prey-type c:== 875))))
=>
(up-jump-rule 3)
(up-modify-goal answer c:+ 6))
(defrule;5;收割者是重型弩炮,残血者是战象系;77
(up-compare-goal reaper-type c:== 279)
(or (up-compare-goal prey-type c:== 1132)
(or (up-compare-goal prey-type c:== 1134)
(or (up-compare-goal prey-type c:== 873)
(up-compare-goal prey-type c:== 875))))
=>
(up-jump-rule 2)
(up-modify-goal answer c:+ 8))
(defrule;4;收割者是箭船,残血者是战船或渔船;76
(up-compare-goal reaper-type c:== 539)
(or (up-compare-goal prey-class c:== warship-class)
(up-compare-goal prey-type c:== 13))
=>
(up-jump-rule 1)
(up-modify-goal answer c:+ 8))
(defrule;收割者是瞭望箭塔,残血者是战船或渔船;75
(up-compare-goal reaper-type c:== 79)
(or (up-compare-goal prey-class c:== warship-class)
(up-compare-goal prey-type c:== 13))
=>
(up-modify-goal answer c:+ 7))
(defrule;可以致命;74
(up-compare-goal answer g:>= prey-HP)
=>
;(chat-to-player 1 "残血收割")
(up-jump-rule 1)
(up-full-reset-search)
(up-add-object-by-id 1 g: reaper-id)
(up-add-object-by-id 2 g: prey-id)
(up-target-objects 0 action-default -1 -1)
(up-modify-goal stop-attack-id c:= 0))
(defrule;不可以致命;73
(up-compare-goal answer g:< prey-HP)
=>
(up-modify-goal reaper-id c:= -1)
(up-get-object-data object-data-id stop-attack-id))
今天才看到你的文章~~ 应该是遍历而不是例遍。{:5_432:} 用筛选血量 升序就能找到最少血单位了 wangzhen 发表于 2021-4-10 14:07
用筛选血量 升序就能找到最少血单位了
不仅仅是找到血少的单位,还要知道能不能一击杀死。看127行,已经在用筛选血量了。 本帖最后由 xiaogaoyagn 于 2021-4-17 17:06 编辑
感谢感谢,我一直觉得我的敌人太弱了,正好可以体验一下。我复制到记事本,然后修改后缀为AI,不能用啊,是不是常数什么没定义,老大,你应该考虑下我这种文盲伸手党啊,怎么不成品打包一起发个
xiaogaoyagn 发表于 2021-4-17 16:56
感谢感谢,我一直觉得我的敌人太弱了,正好可以体验一下。我复制到记事本,然后修改后缀为AI,不能用啊,是 ...
这不是一个完整的AI,只是给供其他AI作者做歌参考而已。单位在战斗时有选择性的攻击某些目标。相当成对战靶子还是洗洗睡吧。后缀得是per 本帖最后由 xiaogaoyagn 于 2021-4-17 22:15 编辑
HudsonLee 发表于 2021-4-17 20:24
这不是一个完整的AI,只是给供其他AI作者做歌参考而已。单位在战斗时有选择性的攻击某些目标。相当成对战 ...
这什么情况 我的思路是:①远程搜索任何敌方正在进行攻击动作的军事单位,②剔除血量超过15点的敌人,③按血量从低到高排序,④逐一遍历残血敌人,以他为中心搜索8格范围内的己方正在战斗的军事单位,记录其剩余血量为变量<敌人剩余血量>,『次级遍历:逐一遍历范围内己方士兵,若射程<与该敌人的距离 且 <敌人剩余血量>大于0 且 其地图ID未被标记为“已派遣去收割”,则任命士兵去收割敌人,并登记其地图ID(通过指针&列表存取技术)以标记为“已派遣去收割”并附带被收割敌人的地图ID,并将<敌人剩余血量>减去<士兵攻击力>』,⑤遍历<收割者列表>中的各个“收割者”地图ID,如果其当前目标单位已不是之前“被收割者”的地图ID,则取消其“收割者”的标记及其附带的“被收割者”地图ID。
页:
[1]