本帖最后由 风雨技安 于 2012-6-30 16:27 编辑
这是鄙人写的第一篇ai经验之谈,希望大家能喜欢。 最近,无悔、SD和皮卡在测试我写的ai时,共同地提出了一个问题,那就是电脑玩家(以下简称CP)进攻过于脑残的问题。具体体现在,CP在发动一波进攻时,如果CP的部队还没到达进攻目的地,那么它们会无视任何的攻击,而且行军时还会一顿一顿的。于是我们就像打耙一样,毫无征服感可言。 那么,如何解决这个问题呢?或者说,如何让CP更smart点呢? 大家一定有印象,当我们在进攻CP时,敌人会如潮水般蜂涌过来,而且不会出现上述的症结。原来,CP在发现了已方城市范围内如果有敌军的部队或建筑时,它们会进入疯狂守城模式。 那么,我们能否把这个特点应用到进攻上呢? 然而,这个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人了,区别就在此。) 最后,如弟兄们看到以上有何错误的地方,麻烦指正我。 |