SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3876|回复: 3
打印 上一主题 下一主题

[ai] 函数:analyze_targets

[复制链接]

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
跳转到指定楼层
楼主
发表于 2020-8-24 16:50:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
analyze_targets,以本AI中各个单位为攻击方,枚举出“所有”攻击目标。

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

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

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

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

使用道具 举报

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
沙发
 楼主| 发表于 2020-8-24 16:52:11 | 只看该作者

实例,一次执行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)

一、输出格式说明
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时,将开始忽略接下的计划攻击。
回复 支持 反对

使用道具 举报

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
板凳
 楼主| 发表于 2020-8-24 16:52:42 | 只看该作者

缺陷

一、不能实现先后撤再攻击。
例如上面,要乐进先撤到(0, 3),满宠进驻(0,1)进攻。程序就没法枚举出这种可能性。对于先移的单位只能进攻不能后撤。
回复 支持 反对

使用道具 举报

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
地板
 楼主| 发表于 2020-8-24 16:53:05 | 只看该作者

最优值

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

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

这个最优相关因素:

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

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

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

三、攻击方到达那格子,能得到的已方支援;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 03:34 , Processed in 0.057569 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表