将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人了,区别就在此。)最后,如弟兄们看到以上有何错误的地方,麻烦指正我。 好高深! 回复 WTYTONY 的帖子
学点ai就懂了 几个疑问:
1、简而言之,就是Attack-now的同时扩大TSA范围,使其保护在TSA范围内的Attack-now部队?
2、这种保护是否会由于其他方向上有敌人而受到影响?
3、已经参与Attack-now的部队,是否在扩大TSA后,受到半途攻击时,进行反击? 貌似有问题……不过也可能是我记错……
(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
表示几乎看不懂……{:156:} 本帖最后由 风雨技安 于 2012-6-30 14:40 编辑
回规则兄:
1、是的,同时attack-now部队也会自保。
2、会
3、编入attack-now里的TSA范围内部队,也被视为TSA的对像,也就是说,他们自己保护自己。
回老胡:
常识性错误,我疏忽了。我的测试ai是直接写数字的,写教程时为了让其更直观,就改了这个,不好意思
不知道是否我测试方式有问题的缘故。
我在A方向上建立了一个城堡,让Ai发现。
然后Ai扩大TSA到这个城堡,几乎全兵都杀过来。
其中有attack now列队对来的。
我动用了B方向未被侦察的骑兵进行拦截,感觉好像没什么变化。
不知道技安兄有没有可以演示的战役? 回复 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指令,具体代码请看测试战役《美国的复仇》
不知楼主上面所列的策略值是否完整,小弟不才据我所知上面策略值并不能很好完成attack-now进攻,还缺少最大进攻部队规模,最小进攻部队规模,策略值sn-percent-attack-soldiers攻击士兵比率是控制参加TSA与attack-now士兵分配,设为80会不会太多士兵参加attack-now呢?
还有不管采用何种方式进攻的士兵,只要编入进攻队伍,中途遭遇敌兵都不会进攻遭遇的敌兵,除非进攻目标丢失并且AI将这个士兵设为闲置士兵才会进攻遭遇的敌兵(这个进攻距离跟敌视回应距离有关)。
人才济济啊~~ attack-now的部队会还击的原因:
1 如果这支部队以建筑物为攻击目标,通常中途被攻击而不会还击,但受到攻击的某个士兵有时会还击不过概率较少(攻城器除外,冲车对冲车又除外)
2 如果这支部队以某个敌对单位为攻击目标时,而这个某个敌对单位又突然消失时,这个部队会处于漫游(重编AI再次给定目标)或闲置状态时,一受到攻击就必定整队还击。
其实做AI最难就是界定部队与目标距离了。要了解AI定攻击目标,可以观看录像,记住选择阴影,注意AI视野变化。 这个思路或者在小型地图可能会较多出现反击,但大图,特大图或与敌对阵地较远时就比较难生效了
页:
[1]