[ai] 函数:analyze_targets

analyze_targets,以本AI中各个单位为攻击方,枚举出“所有”攻击目标。

程序发现当前团队是AI,它首先进入战斗阶段(do_combat),即判断是否有单位可以对敌对单位执行攻击。要做出这个判断,需要分两步:

一、枚举出所有可能的攻击目标{attack_analyze};

二、在{attack_analyze}中选中一个最优目标;

analyze_targets实现的就是第一步骤工作。

 

一、实例,一次执行analyze_targets之后结果

轮到草绿色AI时,经过analyze_targets之后,它将输出24个目标:

attack_analysis, #0, 1 ----> (1, 0)
    move, #0, (1, 1) ---> (1, 1)
attack_analysis, #1, 2 ----> (1, 0)
    move, #0, (1, 1) ---> (1, 1)
    move, #1, (0, 1) ---> (0, 1)
attack_analysis, #2, 3 ----> (1, 0)
    move, #0, (1, 1) ---> (1, 1)
    move, #1, (0, 1) ---> (0, 1)
    move, #2, (1, 2) ---> (2, 1)
attack_analysis, #3, 2 ----> (1, 0)
    move, #0, (1, 1) ---> (1, 1)
    move, #1, (1, 2) ---> (2, 1)
attack_analysis, #4, 3 ----> (1, 0)
    move, #0, (1, 1) ---> (1, 1)
    move, #1, (1, 2) ---> (2, 1)
    move, #2, (0, 1) ---> (0, 1)
attack_analysis, #5, 1 ----> (1, 0)
    move, #0, (0, 1) ---> (0, 1)
attack_analysis, #6, 2 ----> (1, 0)
    move, #0, (0, 1) ---> (0, 1)
    move, #1, (1, 1) ---> (1, 1)
attack_analysis, #7, 3 ----> (1, 0)
    move, #0, (0, 1) ---> (0, 1)
    move, #1, (1, 1) ---> (1, 1)
    move, #2, (1, 2) ---> (2, 1)
attack_analysis, #8, 2 ----> (1, 0)
    move, #0, (0, 1) ---> (0, 1)
    move, #1, (1, 2) ---> (2, 1)
attack_analysis, #9, 3 ----> (1, 0)
    move, #0, (0, 1) ---> (0, 1)
    move, #1, (1, 2) ---> (2, 1)
    move, #2, (1, 1) ---> (1, 1)
attack_analysis, #10, 1 ----> (1, 0)
    move, #0, (1, 2) ---> (2, 1)
attack_analysis, #11, 2 ----> (1, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (1, 1) ---> (1, 1)
attack_analysis, #12, 3 ----> (1, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (1, 1) ---> (1, 1)
    move, #2, (0, 1) ---> (0, 1)
attack_analysis, #13, 2 ----> (1, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (0, 1) ---> (0, 1)
attack_analysis, #14, 3 ----> (1, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (0, 1) ---> (0, 1)
    move, #2, (1, 1) ---> (1, 1)
attack_analysis, #15, 1 ----> (2, 0)
    move, #0, (1, 1) ---> (2, 1)
attack_analysis, #16, 2 ----> (2, 0)
    move, #0, (1, 1) ---> (2, 1)
    move, #1, (0, 1) ---> (3, 0)
attack_analysis, #17, 2 ----> (2, 0)
    move, #0, (1, 1) ---> (2, 1)
    move, #1, (1, 2) ---> (3, 0)
attack_analysis, #18, 1 ----> (2, 0)
    move, #0, (0, 1) ---> (2, 1)
attack_analysis, #19, 2 ----> (2, 0)
    move, #0, (0, 1) ---> (2, 1)
    move, #1, (1, 1) ---> (3, 0)
attack_analysis, #20, 2 ----> (2, 0)
    move, #0, (0, 1) ---> (2, 1)
    move, #1, (1, 2) ---> (3, 0)
attack_analysis, #21, 1 ----> (2, 0)
    move, #0, (1, 2) ---> (2, 1)
attack_analysis, #22, 2 ----> (2, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (1, 1) ---> (3, 0)
attack_analysis, #23, 2 ----> (2, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (0, 1) ---> (3, 0)

 

1.1 输出格式说明

attack_analysis, #23, 2 ----> (2, 0)
    move, #0, (1, 2) ---> (2, 1)
    move, #1, (0, 1) ---> (3, 0)

这是第23个可能目标,被攻击者是位在(2,0)上的单位,即鲁肃,AI攻击它分两步:

1)站在(1,2)的满宠移动到(2,1)攻击鲁肃

2)站在(0,1)的乐进移动到(3,0)攻击鲁肃

 

1.2 为什么会有这么多可能目标

对于可能的攻击目标第一直观能想到的是正面攻击:

     出发       移动到       目标
0:  (1, 1) ---> (1, 1) ====> (1, 0)
5:  (0, 1) ---> (0, 1) ====> (1, 0)
10: (1, 2) ---> (2, 1) ====> (1, 0)
15: (1, 1) ---> (2, 1) ====> (2, 0)
18: (0, 1) ---> (2, 1) ====> (2, 0)
21: (1, 2) ---> (2, 1) ====> (2, 0)

除去这个攻击,剩下就是计划攻击。即它是建立在正面或计划攻击基础上的,以上攻击个数大于1的都是计划攻击。

对于计划攻击,在判断是否是最优目标时,它使用的是合成的最优值;在执行具体移动、攻击时,例使用位在[0]处设置。

 

1.3 analyze_targets中do_attack_analysis进入次数减去要被分析敌对单位数等于可能目标数

要被分析敌对单位:不是地图上所有敌对单位,而是满足了可分析条件后进入analyze_targets中的。

要被分析敌对单位数的几次是外面进入do_attack_analysis,其它则都是由递归造成,即对应着形成了一个目标后而进入

1.4、attack_depth(攻击深度)是一个在*.cfg上给[ai]指定的一个参数,默认值:5。它指出了AI在考虑集到一个敌对单位时,它最大会考虑的深度。因为一个格子旁边最多六个格子,这个值最大值是6。

1.5、当计算出的累计攻击目标已大于1000时,将开始忽略接下的计划攻击。

 

二、缺陷

不能实现先后撤再攻击。

例如上面,要乐进先撤到(0, 3),满宠进驻(0,1)进攻。程序就没法枚举出这种可能性。对于先移的单位只能进攻不能后撤。

 

三、最优值

analyze_target得出{attack_analyze}集合后,那哪里要选出一个最优目标,有一个最优比较。在analyze_target内部也存在要选出一个最优,那就是当攻击单位和被攻击单位确定之后,攻击单位要在被攻击单位毗邻的N(最多6)个格子内选出一个最“优”格子。

例如以上确立了攻击方是徐晃,被攻击方是周瑜,那么就需要在(2,1),(1,1),(0,0)这三个格子选出一个最“优”格式。

这个最优相关因素:

一、攻击方到达那格子,能有“领导”加成;

二、攻击方到达那格子,能有“背刺”加成;

三、攻击方到达那格子,敌方可能造成攻击;

三、攻击方到达那格子,能得到的已方支援;

全部评论: 0

    写评论: