- 攻击分数必须>0才会执行该次攻击;
- 有多个分数>0时,选择最大分数的攻击;
- 存在多个节拍时,最后分数不是简单的各节拍分数乘;像chance_to_hit是累加;
- 初始形成的可攻击部队vector不能决定节拍序。例如有三个只或攻击部队:司马懿、张辽、乐进。
#1:以司马懿为第一部队为各个排列;
#2:司马懿被压回,改为以张辽为第一部队的各个排列;
#3:张辽被压回,改为以乐进为第一部队的各个排列;
程序发现当前团队是AI,它首先进入战斗阶段,即判断是否有单位可以对敌对单位执行攻击。
这个攻击就要使用特定算法,找到一个“最优”目标。为了找到个目标,一般分为几个步骤:
1、分析出当前AI集团能攻击到的所有目标,{UNIT_MY, UNIT_E}。
UNIT_MY:本团队中的所有单位;
UNIT_E:能到达的目标
2、在{UNIT_M, UNIT_E}中找到一个“最优”目标。
以rating来表示这个,rating越大,则移动到这一目标进行攻击的能获得的利益越大。
(1):rating = chance_to_kill*target_value - avg_losses*(1.0-aggression)
主要体现在花费的金的成本上。change_to_kill*target_value:此次攻击能造成对方损失多少金,avg_losses*(1.0-aggression)此次攻击能造成已方损失多少金。
(2):rating /= (resources_used + 2*terrain_quality) / 3;
把得到的优处分摊到每一单位钱上。resources_used是此次攻击使用了多少$,
一、分数
计算分数,商品交易来说,利润=收益-成本;在这当中同一利润要是不同成本,其结果也是不同,因而往往采用利润率:利润率=(收益-成本)/成本。把这概念扩展到此中的AI攻击中,利润率就是我们要计算的目标:分数;收益是攻击给我方带来的好处,相应地就是给对方造成的损失;成本是攻击时我方需付出的代价,像哪只部队HP降低多少。以下是计算分数采用的公式。[code]分数 = (攻击获得收益 - 攻击需付出代价) / 攻击需付出代价[/code]公式修正一:侵略指数(aggression)
aggression指示AI侵略程度,或叫冒险程度。aggression和某次攻击无关,它是全局参数,取值范围[0, 1]。当是1时,会“完全”顾虑攻已会给已方造成的损失,为0时一点都不顾给已方造成的损失。由于AI和玩家打时,往往都是以低素质部队对抗强素质,设1时往往AI都不进攻了(成本大于收收益,分数是负值),默认侵略指数是0.5(也是当前正在用的指数值)。修正后的公式。
分数 = (攻击带来收益 - (1 - aggression) * 攻击需付出代价) / ((攻击需付出代价 + 2 * 地形品质) / 3)
公式修正二:地形品质(terrain_quality)、地形品质指数
要是此次攻击我方会城站城墙、深水,在这两种地形上结果那是差别很大的。由于城墙防御、攻击都比深水高,这在收益、代价中或多或少已有体现,但这种体现往往是不够的。在公式中多加一个称做地形品质的参数,值越大表示品质越差,相应地结果计算出分数越低。地形品质融入公式是以着修正分母方式,去影响分母中“攻击需付出代价”,但不影响分子中那个代价。品质指数是1时,没加成也没减少,此时地形品质等于付出代价。修正后的公式。
分数 = (攻击带来收益 - (1 - aggression) * 攻击需付出代价) / ((攻击需付出代价 + 2 * 地形品质) / 3)
或攻击带来的好处、或攻击需付出的代价,代们需要统一用一个标准去计算,这个标准是什么:金。
攻击带来收益
攻击会让对方部队损失HP,甚至有可能消灭部队,招募部队是要钱的,这等于让对方损失金。在设计MOD时,某兵种需更多金时往往意味着该兵种越重要,这使得可以用金去衡量攻击带来的好处。当然,收益中只兵种成本是不够的,像一只多XP部队往往要比少XP部队重要,因为它花费了对方更多的战斗时间,此时就要把部队已有XP换算到以金为单位,换算采用2点xp等于1金。除了HP、XP这种“正常”收益,还要有额外部分,像攻灭一只部队,攻必灭往往要攻击时要追求目标,依据这条件原则,只要灭掉一只部队,要给好处加成。
攻击付出代价
攻击会让已方部队损失HP,甚至有可能因为对方反击被灭部队,招募部队是要钱的,这等于让已方损失金,类似衡量收益,这使得可以用金去衡量攻击需付出的代价。当然,代价中只兵种成本是不够的,像一只多XP部队往往要比少XP部队重要,因为它花费了已方更多的战斗时间,此时就要把部队已有XP换算到以金为单位,换算采用2点xp等于1金。除了HP、XP这种“正常”损失,还要有额外部队,像被灭一只部队,被灭部队加重代价。
有了衡量标准,接下是具体参数。
归属 | 变量名 | 语义 | 公式 | 注释 |
收益 | target_value | 防御部队成本、XP价值 | (1 + 0.5 * double(experience()) / double(max_experience())) * cost() | |
收益 | chance_to_kill | 防御部队被杀死机率(注1) | 累积值。杀掉HP占当前HP的百分比 | |
成本 | resources_used | 攻击部队成本、XP价值 | (1 + 0.5 * double(experience()) / double(max_experience())) * cost() | 要表示的语义上类同target_value |
成本 | avg_losses | 攻击需付出兵种成本、XP代价 | 要表示的语义上类同chance_to_kill * target_value | |
成本 | terrain_quality | 地形品质,它是包含地形因素的“防御部队造价+xp” | 所有“节拍攻击部队成本、XP * 节拍地形品质指数”和 | 累积值,品质指数为1时等于resources_used |
注:
1:兵种中设定的成本是满HP时造价,攻击只是造成损失一部分HP,因而不能以满HP时的造价作为攻击收益。杀死防御部队机率指的是杀死防御部队可能性,但我们知道要是此次攻击造成的最多只能48HP,而防御部队当前有67点,那无论怎么杀也不可能杀死,即杀死防御部队可能性就是零。处此机率不是指这个可能性,而是杀掉HP占当前HP的百分比,有了这个百分比、加上总造价,就能计算出此次攻击能带来的好处。
chance_to_kill * target_value就可形成攻击带来好处一个主要部分。它计算了部队造价、部队XP给带来收益。
为加深理解,以韩嵩攻击诸葛亮例说明各参数的计算过程。

[table=50%,Silver]
[tr][td]韩嵩攻击[/td][td]诸葛亮反击[/td][/tr]
[tr][td]3x8[/td][td]3x9[/td][/tr]
[/table]
韩嵩攻击 | 诸葛亮反击 |
3x8 | 3x9 |
数据
参数 | 值 | 说明 |
target_value | 34.2073 | (1 + 0.5 * double(1) / double(82)) * 34 |
chance_to_kill | 0.2621 | |
resources_used | 50.263 | (1 + 0.5 * double(2) / double(190)) * 50 |
avg_losses | 12.897 | |
target_starting_damage | 0 | |
avg_damage_inflicted | 27 | |
avg_damage_taken | 20 | |
terrain_quality | 10.052 | 韩嵩站城墙上,地形品质等于0.2 * (110 / 100) * resources_used |
value | 0.1802 |
table