SDL中文论坛

标题: 函数:analyze_targets [打印本页]

作者: admin    时间: 2020-8-24 16:50
标题: 函数:analyze_targets
analyze_targets,以本AI中各个单位为攻击方,枚举出“所有”攻击目标。

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

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

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

analyze_targets实现的就是第一步骤工作。
作者: admin    时间: 2020-8-24 16:52
标题: 实例,一次执行analyze_targets之后结果
(, 下载次数: 3044)
轮到草绿色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)

一、输出格式说明
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)攻击鲁肃

二、为什么会有这么多可能目标
对于可能的攻击目标第一直观能想到的是正面攻击:
     出发       移动到       目标
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]处设置。

三、analyze_targets中do_attack_analysis进入次数减去要被分析敌对单位数等于可能目标数
要被分析敌对单位:不是地图上所有敌对单位,而是满足了可分析条件后进入analyze_targets中的。
要被分析敌对单位数的几次是外面进入do_attack_analysis,其它则都是由递归造成,即对应着形成了一个目标后而进入

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

五、当计算出的累计攻击目标已大于1000时,将开始忽略接下的计划攻击。
作者: admin    时间: 2020-8-24 16:52
标题: 缺陷
一、不能实现先后撤再攻击。
例如上面,要乐进先撤到(0, 3),满宠进驻(0,1)进攻。程序就没法枚举出这种可能性。对于先移的单位只能进攻不能后撤。
作者: admin    时间: 2020-8-24 16:53
标题: 最优值
analyze_target得出{attack_analyze}集合后,那哪里要选出一个最优目标,有一个最优比较。在analyze_target内部也存在要选出一个最优,那就是当攻击单位和被攻击单位确定之后,攻击单位要在被攻击单位毗邻的N(最多6)个格子内选出一个最“优”格子。

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

这个最优相关因素:

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

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

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

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




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3