文明4-战斗系统深入分析
2014-03-29 01:31:07 作者:webadmin
概述
战斗其实就是两个数值之间的较量,攻击方的力量A和防守方的力量D。这两个数值
受到各种情况的修正,比如树林给予50%额外的防御加成,将会修正防守方的力量D。
一旦修正后的A和D被用来计算胜率,以下的公式将对双方都生效,不管谁是进攻方
,谁是防守方。
每个单位开始战斗时都有100点HP,并且在战斗后损失一定量的HP。一旦HP在战斗中
降至0,这个单位就会死亡。如果一个力量3的弓箭手在战斗中损失了40点HP,战斗结束
后他的力量会降至3*(1-0.4)=1.8。如果这个弓箭手开始战斗时只有2.5的力量,他还是
有100点HP,如果这次也损失了40点HP,战斗结束后他的力量会降至2.5*(1-0.4)=1.5。
战斗是一轮一轮进行的,每一轮都会掷一次骰子,由A和D决定谁赢得这一轮。输掉
的一方将会失去部分HP。之后进行下一轮的战斗。一旦某一方的HP降至0或负数,战斗结
束并且这个单位被消灭。
先攻给予一个“自由”轮。这意味如果某一方有两次先攻,这两轮仍然如同原先一
样战斗,但是如果先攻方输掉了这轮他不会受伤,而赢了他可以对对方正常造成伤害。
撤退对于胜率没有影响,它只发生在进攻方将要死亡的一轮。
如果一个单位有5-7的先攻,那么它究竟有几次先攻?
(这一段原文比较繁琐,我翻译得简单一点)
每个单位实际上有两个相关的参数:确定先攻和先攻机会。
先攻=确定先攻+先攻机会
所以5-7的先攻就是在每次战斗中选取一个5-7之间的随机数作为先攻次数。
一旦战斗开始,第一个要检查的是对方是否拥有免疫先攻能力,如果没有,先攻正
常运作。
接下来要检查对方是否也拥有先攻,如果也有的话,两者先攻的差将会在战斗计算
被应用。比如一个6次先攻的部队面对一个2次先攻的部队,相当于前者拥有4次先攻。
基本公式
修正值
攻击方和防守方会从一些升级(比如1级战斗+10%力量)和位置(比如树林给防守方
50%防御加值)得到奖励。这些加到单位的基本数值上,基本数值是指受伤时的力量(如
果单位受伤的话)。一旦修正后的力量计算出来后,我们把攻击方数值叫做A,防守方叫
做D,之后计算伤害时就只需要这两个数值了。
举个例子,一个受伤的2.5力量的弓箭手有一级战斗(+10%),并且在树林中防守(
+50%),那么D=2.5*(1+10%+50%)=2.5*1.6=4
回合
决定每一轮成功的机会只是掷一个骰子。攻击方赢得这一轮的概率是A/(A+D),防守
方相对地是D/(A+D)。
每一轮都会造成一个固定量的伤害。这个伤害从开始时总的100点HP中减去,伤害的
数值由双方的力量决定(见下)。如果上面的D=4的弓箭手被一个A=6的弓骑兵(先不考
虑先攻的因素,所以选用一个免疫先攻的兵种)攻击,在一轮中被击中造成的伤害是24
点,这轮结束后弓箭手还有76点HP。
一轮造成的伤害
一轮造成的伤害的基本值是20点,也就是1/5的HP,但是双方的A和D也会影响各自造
成的伤害。
进攻方对防守方一轮造成的伤害是:20*(3*A+D)/(3*D+A)
防守方对进攻方一轮造成的伤害是:20*(3*D+A)/(3*A+D)
结果会被四舍五入成整数。所以,弓箭手一轮对弓骑兵的伤害是20*9/11=16,而弓
骑兵一轮对弓箭手的伤害是20*11/9=24。
可能的命中数
因为每一击都会造成固定的伤害,这就是说一个单位在死亡之前接受的命中数也是
固定的。这个数值只取决于A和D的对比。
还举上面的例子,弓箭手一次受伤24点,也就是说它会在第5次被命中的时候死亡。
4次之后它只剩4点HP,第5次是致命的。
类似的,弓骑兵一次受伤16点,第7次被命中将会死亡。
因为这个数值已经确定,最终影响结果的只取决于双方的命中数。
基本胜率计算
现在需要的东西都齐全了,就可以开始计算基本胜率。
弓箭手要胜弓骑兵,需要在自己被命中5次之前,先命中弓骑兵7次。也就是说,胜
率是在11轮战斗中至少赢得7次,而每次的胜率都是D/(A+D)=0.4。我们先计算刚好11轮
赢7次的概率,然后按同样的算法计算在11轮中赢8,9,10,11次的概率,然后全部相加
,就是最终的胜率。
概率论中有一个伯努利过程,可以用一连串的事件X0X1..Xn来模拟一轮轮的战斗。
每一个事件发生的概率都是p=D/(A+D)。那么在n=11轮中赢k=7次的概率符合二项式分布
,f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k))。这里C(n,k)是二项式系数,用代数式表达就
是(n!)/(k!*(n-k)!)。
把数字带入得f(7;11,0.4)=C(11,7)*(0.4^7)*((1-0.4)^(11-7)) = 0.0701
这是11次刚好赢7次的概率7%
然后同理计算其他几种情况,最终胜率是
f(7;11,0.4)+f(8;11,0.4)+f(9;11,0.4)+f(10;11,0.4)+f(11;11,0.4) = 0.0701 +
0.02336 + 0.00519 + 0.000692 + 0.0000419 = 0.09935
所以弓箭手赢弓骑兵的概率大约是9.9%
然后我们再来看一下如果弓箭手赢了它还会剩下多少力量。在赢的情况下,有70%的
可能性被击中4次,23%被击中3次,5%被击中2次,其余忽略不计。那么加权平均值是0.7
*(100-4*24)+0.23*(100-3*24)+0.05*(100-2*24)=2.8+6.4+2.4=11.64 HP。转化成力量
来看,2.5*11.64%=0.3。它平均只剩下0.3的力量了。这只是假设它获胜,因为90%的情
况下它会输掉。
先攻的作用
假设这个弓箭手有两次先攻,这次进攻他的是一个剑士,力量和弓骑兵一样也是6,
但是没有免疫先攻的能力。
那么,前两轮的战斗和之前不一样,弓箭手如果赢了,会正常造成伤害;如果输了
,不会受到伤害。之后的战斗就和以前一样了。
计算的时候把前两轮分成三种情况考虑,第一种情况是头两轮弓箭手一箭都不中,
出现这种情况的概率是36%,然后接下来的情况就和上面的例子完全一样,0.09935的胜
率。第二种情况是中一箭,发生的概率是48%,接下来就要在10轮中至少赢得6轮,0.194
的胜率。如果两箭都中,发生概率16%,接下来要在9轮中至少赢得5轮,0.404的胜率。
总胜率就是0.36*0.0707 + 0.48*0.194 + 0.16*0.404 = 0.183
这次弓箭手有18.3%的概率获胜。
撤退
(这个我也简单翻译一下)
撤退只在攻击方的最后一轮生效(防守方不能撤退)。仍然按照通常的战斗进行,
万一攻击方这一轮会被打死时,根据这个兵种的撤退概率随机。如果成功,退回来;失
败就死了。
战斗其实就是两个数值之间的较量,攻击方的力量A和防守方的力量D。这两个数值
受到各种情况的修正,比如树林给予50%额外的防御加成,将会修正防守方的力量D。
一旦修正后的A和D被用来计算胜率,以下的公式将对双方都生效,不管谁是进攻方
,谁是防守方。
每个单位开始战斗时都有100点HP,并且在战斗后损失一定量的HP。一旦HP在战斗中
降至0,这个单位就会死亡。如果一个力量3的弓箭手在战斗中损失了40点HP,战斗结束
后他的力量会降至3*(1-0.4)=1.8。如果这个弓箭手开始战斗时只有2.5的力量,他还是
有100点HP,如果这次也损失了40点HP,战斗结束后他的力量会降至2.5*(1-0.4)=1.5。
战斗是一轮一轮进行的,每一轮都会掷一次骰子,由A和D决定谁赢得这一轮。输掉
的一方将会失去部分HP。之后进行下一轮的战斗。一旦某一方的HP降至0或负数,战斗结
束并且这个单位被消灭。
先攻给予一个“自由”轮。这意味如果某一方有两次先攻,这两轮仍然如同原先一
样战斗,但是如果先攻方输掉了这轮他不会受伤,而赢了他可以对对方正常造成伤害。
撤退对于胜率没有影响,它只发生在进攻方将要死亡的一轮。
如果一个单位有5-7的先攻,那么它究竟有几次先攻?
(这一段原文比较繁琐,我翻译得简单一点)
每个单位实际上有两个相关的参数:确定先攻和先攻机会。
先攻=确定先攻+先攻机会
所以5-7的先攻就是在每次战斗中选取一个5-7之间的随机数作为先攻次数。
一旦战斗开始,第一个要检查的是对方是否拥有免疫先攻能力,如果没有,先攻正
常运作。
接下来要检查对方是否也拥有先攻,如果也有的话,两者先攻的差将会在战斗计算
被应用。比如一个6次先攻的部队面对一个2次先攻的部队,相当于前者拥有4次先攻。
基本公式
修正值
攻击方和防守方会从一些升级(比如1级战斗+10%力量)和位置(比如树林给防守方
50%防御加值)得到奖励。这些加到单位的基本数值上,基本数值是指受伤时的力量(如
果单位受伤的话)。一旦修正后的力量计算出来后,我们把攻击方数值叫做A,防守方叫
做D,之后计算伤害时就只需要这两个数值了。
举个例子,一个受伤的2.5力量的弓箭手有一级战斗(+10%),并且在树林中防守(
+50%),那么D=2.5*(1+10%+50%)=2.5*1.6=4
回合
决定每一轮成功的机会只是掷一个骰子。攻击方赢得这一轮的概率是A/(A+D),防守
方相对地是D/(A+D)。
每一轮都会造成一个固定量的伤害。这个伤害从开始时总的100点HP中减去,伤害的
数值由双方的力量决定(见下)。如果上面的D=4的弓箭手被一个A=6的弓骑兵(先不考
虑先攻的因素,所以选用一个免疫先攻的兵种)攻击,在一轮中被击中造成的伤害是24
点,这轮结束后弓箭手还有76点HP。
一轮造成的伤害
一轮造成的伤害的基本值是20点,也就是1/5的HP,但是双方的A和D也会影响各自造
成的伤害。
进攻方对防守方一轮造成的伤害是:20*(3*A+D)/(3*D+A)
防守方对进攻方一轮造成的伤害是:20*(3*D+A)/(3*A+D)
结果会被四舍五入成整数。所以,弓箭手一轮对弓骑兵的伤害是20*9/11=16,而弓
骑兵一轮对弓箭手的伤害是20*11/9=24。
可能的命中数
因为每一击都会造成固定的伤害,这就是说一个单位在死亡之前接受的命中数也是
固定的。这个数值只取决于A和D的对比。
还举上面的例子,弓箭手一次受伤24点,也就是说它会在第5次被命中的时候死亡。
4次之后它只剩4点HP,第5次是致命的。
类似的,弓骑兵一次受伤16点,第7次被命中将会死亡。
因为这个数值已经确定,最终影响结果的只取决于双方的命中数。
基本胜率计算
现在需要的东西都齐全了,就可以开始计算基本胜率。
弓箭手要胜弓骑兵,需要在自己被命中5次之前,先命中弓骑兵7次。也就是说,胜
率是在11轮战斗中至少赢得7次,而每次的胜率都是D/(A+D)=0.4。我们先计算刚好11轮
赢7次的概率,然后按同样的算法计算在11轮中赢8,9,10,11次的概率,然后全部相加
,就是最终的胜率。
概率论中有一个伯努利过程,可以用一连串的事件X0X1..Xn来模拟一轮轮的战斗。
每一个事件发生的概率都是p=D/(A+D)。那么在n=11轮中赢k=7次的概率符合二项式分布
,f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k))。这里C(n,k)是二项式系数,用代数式表达就
是(n!)/(k!*(n-k)!)。
把数字带入得f(7;11,0.4)=C(11,7)*(0.4^7)*((1-0.4)^(11-7)) = 0.0701
这是11次刚好赢7次的概率7%
然后同理计算其他几种情况,最终胜率是
f(7;11,0.4)+f(8;11,0.4)+f(9;11,0.4)+f(10;11,0.4)+f(11;11,0.4) = 0.0701 +
0.02336 + 0.00519 + 0.000692 + 0.0000419 = 0.09935
所以弓箭手赢弓骑兵的概率大约是9.9%
然后我们再来看一下如果弓箭手赢了它还会剩下多少力量。在赢的情况下,有70%的
可能性被击中4次,23%被击中3次,5%被击中2次,其余忽略不计。那么加权平均值是0.7
*(100-4*24)+0.23*(100-3*24)+0.05*(100-2*24)=2.8+6.4+2.4=11.64 HP。转化成力量
来看,2.5*11.64%=0.3。它平均只剩下0.3的力量了。这只是假设它获胜,因为90%的情
况下它会输掉。
先攻的作用
假设这个弓箭手有两次先攻,这次进攻他的是一个剑士,力量和弓骑兵一样也是6,
但是没有免疫先攻的能力。
那么,前两轮的战斗和之前不一样,弓箭手如果赢了,会正常造成伤害;如果输了
,不会受到伤害。之后的战斗就和以前一样了。
计算的时候把前两轮分成三种情况考虑,第一种情况是头两轮弓箭手一箭都不中,
出现这种情况的概率是36%,然后接下来的情况就和上面的例子完全一样,0.09935的胜
率。第二种情况是中一箭,发生的概率是48%,接下来就要在10轮中至少赢得6轮,0.194
的胜率。如果两箭都中,发生概率16%,接下来要在9轮中至少赢得5轮,0.404的胜率。
总胜率就是0.36*0.0707 + 0.48*0.194 + 0.16*0.404 = 0.183
这次弓箭手有18.3%的概率获胜。
撤退
(这个我也简单翻译一下)
撤退只在攻击方的最后一轮生效(防守方不能撤退)。仍然按照通常的战斗进行,
万一攻击方这一轮会被打死时,根据这个兵种的撤退概率随机。如果成功,退回来;失
败就死了。