时间
总览
日记
Add Text
index
parentId
name
date
update
https://zhuanlan.zhihu.com/p/439300738 一、伤害公式 公式1、总伤害公式 [公式] 其中: f1为兵力伤害公式,见 公式二; f2为武将伤害公式,见 公式三。 Inc、Dec为增减伤,共有4类:己方增伤、己方减伤(伤害降低)、敌方增伤(易伤)、敌方减伤。增减伤主要来自于战法、城内建筑,同类增减伤之间加算。 R为技能系数,即战法中的伤害系数,普攻默认为100%。 Crt为会心伤害,即会心时触发的会心伤害加成。 ri为其他的额外增减伤乘区,同类乘区内加算。不同乘区包括兵种克制系数,士气减伤,兵书,州战法等。 公式2、兵力伤害公式 [公式] (幂函数) Num是己方武将带兵数量。 Atk-Def是属性差。造成兵刃伤害时=我方武力-敌方统率;造成谋略伤害时=我方智力-敌方智力。 该公式将在第二部分【兵力】中详细说明。 公式3、武将伤害公式 [公式] 其中 [公式] 即武将伤害只与双方属性差值有关。 该公式将在第三部分【武将伤害】中详细说明。 二、兵力伤害(公式二的解释和测试过程) 经测试推导,兵力对伤害的影响有两种可能的形式: 1、幂函数 2、对幂函数的优化:分段线性函数 本文对两种函数的拟合结果都给出了公式。 (1)幂函数公式推导 经过多次严格控制变量测试,并使用不同的拟合函数,得到以下结果: 线性函数,拟合优度0.9226 对数函数,拟合优度0.9194 多项式拟合(2次),拟合优度0.9852 幂函数拟合,拟合优度0.9617 可见,幂函数和多项式的拟合优度均高于0.95。 理论上来说,多项式的拟合精度能达到无限高,但会导致过拟合,且不易于控制曲线的后续拓展(不方便微调参数,高阶导数难以控制)。 因此,综合考虑其他游戏的兵力-伤害公式,幂函数作为公式更简明。 再经过计算,得到系数约为0.1877。 则可得兵力-伤害的幂函数公式: [公式] (2)分段线性函数公式推导 幂函数已经能很好地描述兵力和伤害的关系。 但在实际的开发过程中,需要综合考虑以下因素: 游戏性能。线性函数的计算是最快的;而多项式、幂函数不太可能在游戏内实时运算,因此只能配表存储值。在野外有0~30000个兵的情况下,需要配的值太多。 便于兵力拓展。分段的线性函数在兵力数量拓展时,可以设置新的分段斜率;而调整幂函数会导致前面的伤害跟着变化; 便于微调。在三战里增强、削弱大小R体验,可以通过微调斜率实现。这是因为当斜率低时,兵力对伤害的衰减更小,大R能更容易一穿多。 在2000兵力以下,线性拟合效果最好,拟合优度可达到0.993。 因此我们还可以选择分段线性函数。 以每2000兵力为分界点,作分段线性拟合: 分段线性拟合,每2000兵力为分界点。在0~2000兵的拟合优度为0.993 公式: [公式] (分段线性函数) 其中 [公式] (10,000 兵是玩家可携带兵力的上限) k0,k1,k2,k3,...,kn为每段线性函数的斜率,且递减 b0,b1,b2,...,bn为每段线性函数的截距 其中b0是【武将自身伤害】,与兵力无关,在第三部分中介绍。 (3)测试过程 测试环境 首先,根据游戏经验,同条件下的伤害会有不同,有的游戏是正态分布取整、加入随机因子等。 而为了得到较精确的数值,在【试炼】中构建稳定环境测试。 挑战失败便可无数次挑战,无需消耗体力。 测试方法 我方主将选择【赵云】,副将根据测试过程中调整,需求:能给【赵云】减伤,以测试不同的兵力;但不能有增伤战法,且不为同一阵营,无任何伤害、武力加成。 敌方3个将领,选其中之一当作测试对象,需要满足: 无减伤战法(包括自身和敌方减伤) 兵书无减伤(本赛季为S2,在测试中还需要考虑到兵书的影响) 统率值固定 根据这些条件,找到了试炼中的【张姬】队,选取赵云对张姬的伤害,并记录。 敌方3人兵力均为7000,枪均为S级。 为了避免兵种克制,我方【赵云】也使用枪兵,S级。 排除回合数对伤害的影响 在收集数据过程中,多次发现兵力近似相同时,在不同回合不影响伤害,这是本实验能够控制变量的基础。 测试结果分析 为了确定战斗中数值,先用【太史慈】降统率测试,得到敌方每个武将的真实战斗中【统率值】。 (这一步是由于【试炼】中看不到敌方装备属性,但事实上是有穿装备的) 为了控制变量,只选取赵云对张姬的伤害记录。 最终,得到数百条(兵力,伤害)数据,兵力分布在区间[0~7000],部分数据如下: 作(兵力,伤害)xy散点图,然后拟合曲线。 在xy散点图中发现:兵力几乎为0时仍有接近200的伤害 这部分伤害,合理猜测是来源于武将本身,属于【武将伤害】,与兵力无关。 分段线性函数的参数计算 从兵力0~7,000,我设置了3个兵力分段点:2000、4000、6000,将函数分为4段。 根据假设,1w兵力为玩家的满兵力,则上述分段点可变为:0.2、0.4、0.6 用python的numpy拟合公式、再经过计算后得到k0~k3、b0~b3的值: 其中b0=196.05,即: 200.17属性差 约等于 196.05的武将伤害。 (4)验证 对分段线性拟合,在2000兵力以下的全新场景进行验证。 己方武将 【张飞】。自带战法【燕人咆哮】,稳定2、4回合出手。 敌方武将 3个武将均无减伤、增减三维的战法。 使用5级的张飞,在【普通】试炼里进行测试 为了测试不同兵力下伤害,每隔10次,给张飞升级【暂避其锋】战法进行减伤,以在2/4回合得到差异性更大的血量。 测试结果线性拟合 拟合优度 R²均大于0.99。 因此可认为线性方程可非常好地描述2000兵力以下的【伤害-兵力】关系。 以此类推,每2000兵力做一次分段线性拟合是比较合理的。 三、武将伤害(公式三的解释和测试过程) 回到开头的那张战报 3兵力的张飞,打出1000+伤害 正是由于有独立于兵力的【武将伤害】的存在,当部队残血时,造成的伤害仍然不低,这是大R能够残血一穿多的重要条件。 (1)结论 武将伤害公式 [公式] 其中x是属性差。 (2)测试过程 测试方法 用不同武力值的武将,分别携带少量兵力(10~15个兵)攻打不同的野外部队 注意:先侦查,然后携带相同兵种,避免兵种克制; 由于野外部队的属性值固定,更改我方武力值即可得到多条不同数据。 武将的士气值保持在100以上,且无兵书加成。 (由于无法做到每个武将携带同等兵力,又有伤害浮动的影响,故这部分测试不会特别精准) 拟合函数 根据上述方法,得到25条数据。部分数据如下: 绘制xy散点图,并拟合 两种拟合效果都很好。 但考虑到: 边界值:在原点附近,2阶函数拟合效果更好; 从设计目的上:2阶函数拟合可以让属性值发挥更大作用,有利于大R的高红武将。 因此选择2阶多项式拟合作为公式: [公式] 在该公式下,属性差500时,武将伤害能达到580。 (3)验证 在第2小节中,我们得到0兵力赵云的数据: (x属性差,y伤害)=(200.17,196.05) 将x=200.17代入公式得y=204.9 而(204.9-196.05)/196.05=0.045 误差小于伤害浮动值的8.8%,故在误差范围内可认为该公式是正确的。 四、伤害浮动 在【三国志战略版】中,伤害并不是固定值,而是有个浮动范围。 本文中详细测试了伤害浮动范围。 (1)伤害浮动公式 [公式] 即:所有条件都相同时,最终实际伤害值有上下4.4%的浮动。 实际伤害值均匀分布在9个离散点上,每个点的伤害相差1.1%,并取整。 (2)测试与分析 测试环境 首先,根据游戏经验,同条件下的伤害会有不同,有的游戏是正态分布取整、加入随机因子等。 而为了得到较精确的数值,在【试炼】中构建稳定环境测试。 挑战失败便可无数次挑战,无需消耗体力。 测试方法 从【战报】中获取所需数据。 用高速武将【赵云】,不吃控,第一回合稳定出手,保证所有变量一致。 分别记录赵云对三个敌方武将的首次普通攻击伤害,测满100个数值,并作伤害值-频度直方图。 测试结果直方图 图表中,只出现9个数值,而有10个数值的概率为(0.9)^100=0.000026<0.999,因此认为是9个离散数值。 由于伤害不集中在均值附近,且分布无明显规律,因此合理猜测是离散均匀分布。 由于极差除以均值≈0.088,0.088/8=0.011,因此得到上面的结论。 (3)验证 验证方法 选取完全不同的兵力、武将,在【试炼】中进行验证。 我方武将选择张飞,兵力1800。 由于我方【张飞】的速度值最高,保证了每场战斗都能第一次出手普攻。 同样作直方图 测试结果为9个离散分布的数据;极差/均值分别为8.64%和8.8%, 与开头提到的结论非常吻合,因此可认为伤害浮动公式是正确的。 五、其他属性对战斗伤害的影响 1、三维属性 兵刃伤害 【武力-统率】既影响兵力伤害,也影响武将伤害。 见开头的公式2和公式3。 谋略伤害 待测。 猜测智力差的计算为:【c1*智力-c2*智力】,c1/c2为智力属性的影响系数。 通过影响三维间接影响伤害 装备。属于武将面板伤害。特技不显示在面板。 兵种适应性。兵种适应性系数:S/A/B/C分别是1.2,1,0.85,0.7,乘以武将的面板得到三维。 城内建筑-兵战。在兵种适应性乘算后加算。 2、战报中可见的增减伤 共有4类:己方增伤、己方减伤(伤害降低)、敌方增伤(易伤)、敌方减伤。 该类增减伤主要来自于战法、城内建筑加成,且同类增减伤之间加算。 该类增伤上限未知,减伤上限90%。 3、独立增减伤 这部分增减伤属于独立乘区,主要包括: 兵种克制系数 简单测试: 猜测克制增伤11%、减伤百分11%。 1.11/0.89=1.247 即兵种克制带来接近25%的总影响。 士气减伤 y=(1-0.007x); 4、技能系数 战法中写明的百分比系数。 普攻默认为100%兵刃伤害。 (可能存在战法大类的隐藏系数,便于微调) 5、会心伤害 基础会心伤害为100%。 期望伤害为1+crt*crt_rate 6、其他存疑的增减伤 州战法; 装备特技; 兵书。兵书中存在两类增减伤:进阶一次2%、特定的兵书增减伤。 这些百分比系数比伤害波动更小,难以测算是属于独立乘区or加算。 7、验证后无影响项 等级压制 测试:0级刘巴、24级诸葛亮,骑兵都为c,调整至武力相差0.22,均为满兵打典韦。 伤害:刘巴302,诸葛亮299。 故认为无等级压制系数。 回合数、打平后再战 在测试中,多次发现第3、4回合满兵,仍和第1回合伤害近似一致; 打平后再战和上次的第8回合伤害近似。 故认为无影响。 六、总结 1、 本文中对测试数据的拟合偏向【让大r爽】的函数公式,这和三战中不少设计目的相符合,如:兵书的红度增减伤、同类减伤加算等。 正是由于【武将伤害】的存在,当部队残兵时,造成的伤害仍然不低。这也是大R能够残血一穿多的重要条件之一。 2、在野外pve上,十级城单支部队就有3w兵,是玩家带兵上限的3倍。 在本文的计算出的公式中,由于伤害增长随兵力增长放缓,3w兵的伤害不会高于1w兵太多。 (可计算出同等属性下,3w兵的伤害是1w兵的1.42倍) 玩家面对的是3倍血量+1.42倍伤害的部队,这也是大R们能凭借比野怪更高的属性和兵种克制,打穿高级城的重要条件。 3、由于存在8.8%的伤害浮动,给测试过程造成了较大困难。 任何伤害测试都至少需要同条件下的10个以上数据才能给到比较准确的均值。 4、游戏中还可能存在一些隐藏伤害系数,以及边界情况下的配表特殊处理,给拟合的精确度带来阻碍。 例如,【率土之滨】中就有技能内置伤害率,且对玩家不可见。 5、三战里的战斗过程,符合兰彻斯特定律的规定范围(交战双方充分接触)。 因此,如果按符合直觉的方式构建公式,即:兵力同时代表伤害和血量,则会导致兵力对战斗结果的影响是平方级别。那么携带兵力多的平民玩家也可以轻松战胜兵少的大R。 这是策划所不希望看到的。 于是在公式中,对兵力伤害作出削弱,使其造成的影响为0.32次方; 而武将属性对伤害的影响约为1次方。
Upload File
File
Image