风雨技安 发表于 2012-6-30 13:04:38

将TSA与attack-now相结合的进攻模式(TS-AN)——适合B&D剧情设计

本帖最后由 风雨技安 于 2012-6-30 16:27 编辑

这是鄙人写的第一篇ai经验之谈,希望大家能喜欢。最近,无悔、SD和皮卡在测试我写的ai时,共同地提出了一个问题,那就是电脑玩家(以下简称CP)进攻过于脑残的问题。具体体现在,CP在发动一波进攻时,如果CP的部队还没到达进攻目的地,那么它们会无视任何的攻击,而且行军时还会一顿一顿的。于是我们就像打耙一样,毫无征服感可言。那么,如何解决这个问题呢?或者说,如何让CP更smart点呢?大家一定有印象,当我们在进攻CP时,敌人会如潮水般蜂涌过来,而且不会出现上述的症结。原来,CP在发现了已方城市范围内如果有敌军的部队或建筑时,它们会进入疯狂守城模式。那么,我们能否把这个特点应用到进攻上呢?没错!就是TSA(town-size-attack)进攻方式!具体实现方法请看老胡的教程:https://www.hawkaoe.net/bbs/thread-26411-1-1.html然而,这个TSA有个缺陷,那就是兵力分散,容易被各个击破;这在通常的少部队战役制作中,非常不实用。这时我们会反过来想,attack-now具有了TSA所没有的部队集中进攻的优点。要是有一种进攻,能既有attack-now的部队集中,又能有TSA的智能攻击就好了。对,这就是我们今天要探讨的技术!鄙人虽不才,但想到了一种将attack-now与TSA相结合的进攻模式,现分享如下。先定义几个变量:(defconst YES 1)                                                          ;定义“是”(defconst NO 2)                                                         ;定义“否”(defconst ATTACK-GOAL 3)                                       ;定义“是否发动进攻”(defconst ATTACK-NOW-ON 4)                                       ;定义“是否发动attack-now模式”(defconst ATTACK-SIZE 200)                                       ;定义“TSA进攻范围为200”(defconst NORMAL-SIZE 30)                                       ;定义“CP城镇正常范围30”初始化:(defrule

(true)
=>
(set-strategic-number sn-maximum-town-size 30)                                        ;我们把城镇范围设置成30
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-enemy-sighted-response-distance 25)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(set-strategic-number sn-number-explore-groups 1)
(set-strategic-number sn-percent-attack-soldiers 80)
(set-strategic-number sn-attack-intelligence 1)
(set-strategic-number sn-garrison-rams 1)
(set-goal ATTACK-GOAL NO)
(set-goal ATTACK-NOW-ON NO)
(disable-self))大致的流程图是这样的(画得不好,见谅):注:时间器1代表离下一波进攻所需的时间,这里我们设为900;时间器2代表本波进攻所持续的时间,这里我们设为60;根据流程图,我们写出ai程序:(defrule
(true)
=>
(enable-timer 1 1200)                                       ;第一波进攻所需等待的时间,我们设为20分钟
(disable-self)
)

;--------------------------------------------------- TSA进攻部分
(defrule
(timer-triggered 1)
(goal ATTACK-GOAL NO)
=>
(disable-timer 1)
(set-goal ATTACK-GOAL YES)
)

(defrule
(goal ATTACK-GOAL YES)
(strategic-number sn-maximum-town-size == NORMAL-SIZE)
(not(enemy-buildings-in-town))
(not (town-under-attack))
=>
(set-strategic-number sn-maximum-town-size ATTACK-SIZE)
(enable-timer 2 60)                                                                   ;攻击持续的时间长
(set-goal ATTACK-NOW-ON   YES)                                       ;本句为连接attack-now的钮扣
)

(defrule
(timer-triggered 2)
(goal ATTACK-GOAL YES)
=>
(set-strategic-number sn-maximum-town-size NORMAL-SIZE)
(disable-timer 2)
(set-goal ATTACK-GOAL NO)
(enable-timer 1 900)                                       ;下一波进攻的时间,默认为900
)

;---------------------------------------------------
(defrule                                       ;attack now进攻部分
(strategic-number sn-maximum-town-size > NORMAL-SIZE)(goal ATTACK-NOW-ON   YES)
=>
(attack-now)
(set-goal ATTACK-NOW-ON   NO)                      ;这是一个自锁设置,令attack-now指令在一次进攻中执行一次
)

你看!这样就完成了TSA与attack-now相结合进攻模式(以下我们简称为TS-AN)的ai程序了!当此ai发动attack-now指令的士兵在中途被攻击时,CP会视为在城填内的单位受到攻击,所以被攻击的士兵就会反击!同时,TS-AN还使CP更智能,它不会只是单单进攻你的主城,也会袭击你在效区的采矿营地或军营!

下面是设置TS-AN的要注意的要点:1、first attack的时间要设在CP完成城市建设之后,因为这段时间是CP在建设城市的时间,如果城市还未构建完毕而发动TS-AN的话,就会造成CP农民在地图上乱建建筑物的情况。2、当然你可以设置一次TS-AN进攻中电脑发动多次attack-now进攻,时间关系,这点我以后有空再出教程。(有些同学可能会问,一次attack-now和两次有什么区别?技安在此回答,因为attack-now是CP控制一队已编号的部队进攻,所以人数最多只能是42人,如果两次就有84人了,区别就在此。)最后,如弟兄们看到以上有何错误的地方,麻烦指正我。

W.Claudius 发表于 2012-6-30 13:23:31

好高深!

六文丿鱼丸 发表于 2012-6-30 13:28:30

回复 WTYTONY 的帖子

学点ai就懂了

Ru43 发表于 2012-6-30 13:41:43

几个疑问:
1、简而言之,就是Attack-now的同时扩大TSA范围,使其保护在TSA范围内的Attack-now部队?
2、这种保护是否会由于其他方向上有敌人而受到影响?
3、已经参与Attack-now的部队,是否在扩大TSA后,受到半途攻击时,进行反击?

老胡V1 发表于 2012-6-30 13:42:25

貌似有问题……不过也可能是我记错……

(defconst ATTACK-SIZE 5)                                    
(set-goal ATTACK-SIZE 200)
(set-strategic-number sn-maximum-town-size ATTACK-SIZE)

5号GOAL的值变成了200 但是常数ATTACK-SIZE本身的值还是5没变吧
好比说 你把200这个数放进了5号箱子 但是你后面引用的是5不是200

☆狂龙☆ 发表于 2012-6-30 14:21:26

表示几乎看不懂……{:156:}

风雨技安 发表于 2012-6-30 14:28:32

本帖最后由 风雨技安 于 2012-6-30 14:40 编辑

回规则兄:
1、是的,同时attack-now部队也会自保。
2、会
3、编入attack-now里的TSA范围内部队,也被视为TSA的对像,也就是说,他们自己保护自己。

回老胡:
常识性错误,我疏忽了。我的测试ai是直接写数字的,写教程时为了让其更直观,就改了这个,不好意思

Ru43 发表于 2012-6-30 18:28:47

不知道是否我测试方式有问题的缘故。
我在A方向上建立了一个城堡,让Ai发现。
然后Ai扩大TSA到这个城堡,几乎全兵都杀过来。
其中有attack now列队对来的。
我动用了B方向未被侦察的骑兵进行拦截,感觉好像没什么变化。
不知道技安兄有没有可以演示的战役?

风雨技安 发表于 2012-6-30 23:37:37

回复 Ru43 的帖子

回规则兄,确实你说的问题症结还依然存在。
TS-AN在你不对attack-now部队发动袭击时,擦肩而过是我想破头皮也无法解决的问题。

关于半路伏击attack-now部队,此时电脑有同时要求它们进攻主基地和反击的命令,所以这个自我保护的机率是随机的,即是说既有可能停下来反击,也有可能继续前进。
而同时,你在进攻其中一个attack-now部队的时候,另外一支attack-now会结群来救援。
所以,解决的方法是,让电脑多编几个attack-now部队,并在进攻时多发几个attack-now指令。可以这样设:
(set-strategic-number sn-percent-attack-soldiers XX);让这个XX数的值设小点,就能保证结队前进的部队是小部队了;
然后就是在一波进攻中多发出几个attack-now指令,具体代码请看测试战役《美国的复仇》

忠实帝国粉丝 发表于 2012-7-1 19:03:50

不知楼主上面所列的策略值是否完整,小弟不才据我所知上面策略值并不能很好完成attack-now进攻,还缺少最大进攻部队规模,最小进攻部队规模,策略值sn-percent-attack-soldiers攻击士兵比率是控制参加TSA与attack-now士兵分配,设为80会不会太多士兵参加attack-now呢?
还有不管采用何种方式进攻的士兵,只要编入进攻队伍,中途遭遇敌兵都不会进攻遭遇的敌兵,除非进攻目标丢失并且AI将这个士兵设为闲置士兵才会进攻遭遇的敌兵(这个进攻距离跟敌视回应距离有关)。

sadam667 发表于 2012-7-1 20:20:58

人才济济啊~~

忠实帝国粉丝 发表于 2012-7-1 22:42:12

attack-now的部队会还击的原因:
1 如果这支部队以建筑物为攻击目标,通常中途被攻击而不会还击,但受到攻击的某个士兵有时会还击不过概率较少(攻城器除外,冲车对冲车又除外)
2 如果这支部队以某个敌对单位为攻击目标时,而这个某个敌对单位又突然消失时,这个部队会处于漫游(重编AI再次给定目标)或闲置状态时,一受到攻击就必定整队还击。
其实做AI最难就是界定部队与目标距离了。要了解AI定攻击目标,可以观看录像,记住选择阴影,注意AI视野变化。

忠实帝国粉丝 发表于 2012-7-1 23:00:31

这个思路或者在小型地图可能会较多出现反击,但大图,特大图或与敌对阵地较远时就比较难生效了
页: [1]
查看完整版本: 将TSA与attack-now相结合的进攻模式(TS-AN)——适合B&D剧情设计