查看原文
其他

专治各种不平衡!游戏数值“疑难杂症”解答

2018-03-15 了不起的折耳猫 Gad-腾讯游戏开发者平台

导语:如何选择战斗伤害公式?战斗属性建模与经济属性建模该从哪儿开始?怎样计算战斗力?怎样计算角色的成长线?属性、道具的价值该怎么算?关于游戏数值,大家想必有许多疑问,而本文作者将以对答的方式和大家谈谈游戏数值的建模。


正文:


出于直觉,我加强游戏数值建模的能力是通过大量的公开课复习、学习数学课程。这或许是我在工作中感到许多数值策划存在不少进步空间、网络流传的数值文章也过于零碎和浅显的原因。


但是,我对写一篇系统性的、模拟实际工作那般的游戏数值文章实在缺乏文笔,因而想到,为什么不用对答的方式来谈谈游戏数值的建模呢?这不失为一个有趣的文章形式,写起来方便多了,就阅读来说,也会感到轻松不少。


而我相信首先会产生的问题是:


Q:看你说的那么牛,你经手的游戏流水有几个0啊?


A:很遗憾,我经手过的项目最大只有三百万(没有分到钱),如果容许我为此申辩一番,你们会或多或少感同身受并加以理解。


【1】游戏在利润上的成功取决于太多的因素,国内游戏的成功率也不敢恭维。数值在其中的作用仅仅是“利润成功”这个多元函数的一个偏导数罢了,这意味着其他的因素会共同叠加来影响项目的成功率,也意味着数值做得再成功会存在一个被未知的约束函数限制的极值。


【2】我的游戏数值工作还是相对成功的,目前是主数值的身份。我做游戏数值,1个月可给出正式战斗数值,再1个月可给出正式经济数值,并且调整得很少,有调整往往出现在错误理解系统含义、领导意图上。而且设计原理通俗易操作,如计算闯关杀怪,可以由一个不懂数值的人来填写想要的战斗感受,我给定的函数会自动计算出结果。


Q:你出于什么动机写这篇文章?居高临下教育我们?


A:我的专业是心理学,我想,那是因为当一个人对某件事有一定的理解和领悟时,会本能的想要告知,来获得他人的赞赏。也许这是演化赋予我们博得地位与名声的心理的适应器官吧~~


现在,我假设你们对我上面的2个回答还算满意,那么,我们便可以着手对答了。出于惯例,我决定将对答内容分为三大类:①战斗数值;②经济数值;③其他


战斗数值


Q:我该如何选择战斗伤害公式?


A:网络文章、Q群经常可见这类讨论,但事实是,如果你把玩过这些战斗公式,你会和我一样得出以下结论:


【1】减法和除法伤害公式是乘法伤害公式的化简形式。对形如“攻击-防御”的减法公式提取公因式,可得“攻击*(1-防御/攻击)”,显然,括号内是受伤率,防御/攻击是免伤率。除法伤害公式是攻击这个变量直接乘以了受伤率函数的显式表达式。


【2】函数性质最好的是乘法伤害公式,最差的是减法。乘法伤害公式满足线性代数运算的“可加性”原则。设n个怪总计有A点攻击力,角色受伤率为P,伤害为D,则满足A*P/n=D/n,不论n是多少,与攻击力A都是线性关系,我们可以简单的将A除以n来获得不同怪物数量但相同的D值。而减法,无需详说,便知道无法做到这一点。这样的函数性质,对于设计数量不一的战斗,有着显而易见的便捷性。


【3】最符合直观理解的是减法,最差的是除法。不论是乘法的免伤率,还是简单的防御可抵消等量攻击的减法,它们都表现得那么直接,而其中减法对于防御属性的投放没有限制,则对销售这块儿相当友好。乘法可以在计算免伤率的函数里做一些运算让防御属性有无穷的可累积性,但终究封装了一层,不便于下蛋时的“广而告之”。至于除法伤害公式,则干脆毫无直观表现,其函数性质又介于乘法和减法之间。因此,建议要么选择好处理的乘法,要么选择直观+销售最友好的减法。


Q:我该从哪儿开始对战斗属性建模?


A:well~~这个问题要宽泛一些,我会选取几个建模的节点为基础来作答。


【1】首先,衡量你的战斗数值关于生命周期的感受良好程度。


1>>别被“生命周期”这个毫无实质内涵的术语吓倒了,对于建模,只能是经济产出填满所需消耗的时间。而玩家们的生命周期远非填满消耗这个单变量所能囊括。


2>>设生命周期为N天,最大的战斗属性K倍于1级角色,付费深度为R。则平均每日战斗数值增量为△K=K/N,平均每日对应的付费额度为△R=R/N。设小额付费是△R的3倍,中额5倍,大额10倍,则3△R/R算出在付费深度中的占比,心算可得3/N,小额付费的玩家剩余生命周期=N*(1-3/N),替换△K=K/N中的N,再除以△K=K/N,可化简为N/ N*(1-3/N),其他额度计算同理。该式在乘法伤害公式下算出的值,对应的现实意义是小额付费玩家可击杀X名非付费玩家,取X的倒数则是与非付费玩家单挑,损失百分之多少的生命值为代价击杀对方。显而易见,击杀玩家数量越多,单挑损失生命值越少,付费深度与最大战斗属性的设置值可认为在感受上越良好


——瞧,乘法伤害公式的优良性质在此处有了体现。至于这个算法,当然是简单的建模,可是,当前我们也没有更好、更易操作的算法,近似至少可得近似的结果,要知道,当你学习数学建模的课程时,可是用矩形来代替人的腿计算做功呢~~


【2】其次,计算1级角色的具体值。


1>>向你的领导和同事们征集希望的单挑战斗时间,取平均值作为标准战斗时间。这么做是统计取样的数学思想,找出多数人对游戏项目认可的战斗时间,避免你基于自己的经验带来的偏差。


2>>给定免伤率、攻击力,结合伤害公式与战斗时间算出防御值和生命值,1级角色的具体值便算好了。我使用了“给定”这个词,而不是“拍脑袋”这样戏谑乃至贬义的词汇。原因在于,在数学的许多应用里,甚至许多推导里,都会存在这样的“给定”行为,如最小二乘解令方程式导数为0,机器学习的超参数,贝叶斯统计的先验分布,线性代数则称呼为“自由变量”。事实上,给定具有数学or现实上的意义。这里我们给定的几个属性,除了在战斗时间的约束下计算出其他属性外,还在于定好属性的数量级。我私底下认为,那些称呼和接受“拍脑袋”这种词汇的人,对数学工作是不晓世务的。因此,请挺直腰杆给定数字并使用它们。


【3】第三,求出标准技能伤害。


1>>任何伤害技能都有一个释放规则,否则它会变成加强版的普通攻击,标准技能的释放规则最常见的是CD冷却时间。因而,我们可求出标准战斗时间可释放的技能数量,剩余时间则求出普通攻击的次数。则可得


 

A为我们给定有技能的战斗比单纯普攻战斗输出强多少倍,f是普攻次数,s是标准技能次数,w为我们要求的标准技能伤害是普攻伤害的多少倍,1是指普攻伤害是自己的1倍。


标准战斗时间/A便等于有技能的战斗导致战斗时间减到了多少,那么为了让标准战斗时间不变,将你算出的1级角色的生命值*A倍即可。你可以依据标准战斗时间,对不同职业的伤害技能进行符合数学法则的处理。尝试把玩公式,可以发现更多的性质。


2>>范围伤害、长时施法和非伤害技能怎么办?攻击多个目标、长时施法的技能所面临的问题其实是未足量命中目标、施法时间过长而导致的风险,该数学推论我将在别处讲述(你会发现同样的数学原理竟然可以运用在看起来完全不相干的东西上)。非伤害技能不必强求建模,我将技能区分为数值技能和规则技能,闪烁和冲锋这种规则技能,我无法想象它们有一般方法可得出解析解,而昏迷这样的规则技能,可通过释放次数*控制时间占标准战斗时间的比例来大致定量解答。


【4】最后,将K倍于1级角色这个K值分配给所有系统。这样每个系统都是1级角色的倍数,它们去乘以1级角色的具体值便可以算出该系统的具体值。


【5】我有像宠物这样的玩意儿该怎么办呢?给定宠物以百分之多少生命值为代价击败角色,来量化宠物和角色的强弱关系,对其取倒数便可知道宠物属性应当是角色的多少倍。


Q:可我选择的是减法公式!o(>﹏<)o


A:由于某些项目的数值工作存在问题,我救场过一些项目,这些项目全部使用的都是减法。在这种情况下,我使用泰勒展开的思想推导出一些公式,使得减法伤害公式可部分的实现乘法公式那样的函数性质,实际应用表现良好。


1>>若攻击力提高k倍,则伤害提高的倍数≈k^2,新战斗时间T≈原战斗时间t/k^2。


2>>若防御力提高j倍,则伤害降低1/j倍,T≈t*j。


3>>若攻击和防御同时变化,伤害倍数变为(k^2/j)^0.5,T≈t/(k^2/j)^0.5。


4>>若角色P0的属性是角色P1的m倍,则P0可击杀m^3个P1,损失1/m^3百分比的生命值。


【1】以上公式误差最小的是k,最大的是攻击和防御同时变化来预测T。“4>>”是一个固定的近似解,它能较好近似的前提是减法伤害公式的免伤率最好≤0.45,即防御/攻击≤0.45。原因在于,若免伤率基础大,属性有倍数差异的防御与对比角色的攻击比值会更大,那么伤害→0,则T→∞。无穷大在函数上叫“发散”,泰勒逼近的应用前提是函数至少在取值点处是收敛的。


【2】有人会说我既然知道具体的属性值,干嘛不具体算。我认为那是复杂而没有效率的,数学应用够用就好,此外当这些倍数差距较大时误差不可接受,但现实里是属性碾压了,得知碾压时的解析解对我们没有应用价值。


Q:怎么让不懂数值的人填写战斗感受,然后自动算出想要的值?


A:ha!你开始从通俗+效率的角度思考游戏数值的工作了。要回答这个问题,得分开来说。


【1】选取量化“感受”的数学指标。击杀时间越少,感受越好,损失生命越多,难度越大,击杀时间少+损失生命多则战斗越刺激。这说明,我们可以通过击杀时间和损失生命%来量化“感受”这种模糊的描述。


【2】从一场战斗的角度设计。似乎所有数值策划都是以杀死1个怪需要多久,这个怪杀死玩家的角度对战斗建模。我认为这种角度过于细致、缺乏普适性和操作性。而抽象为一场战斗,这样的建模角度更可取。


1>>一场战斗定义为开始战斗到结束战斗。而开始战斗可以一个关卡里开始,关卡里有n个怪,结束战斗则是关卡成功or失败。也可以是野外面对n个怪,杀死or被杀死为结束。显然,这种角度涵盖了面对1个怪的情况。


2>>从杀死1个怪和这个怪杀死玩家的角度来算,会导致不同关卡、野外的怪群根据怪物数量算出不同的战斗时间、生命损失。若关卡A1有10个怪,关卡A2有8个怪,反而靠后的关卡难度比靠前的关卡简单。而想要避免这种情况,就不得不去调整怪物数量or换怪物类型。更糟糕的是还要根据怪物数量和类型来统计该关卡、野外怪群的感受的数学指标,这无疑缺乏可操作性。


【3】从一场战斗的角度建模:对玩家同时面对不同数量的相同怪进行建模。不同数量的相同怪物同时对抗玩家时,其输出能力随着玩家逐渐杀死怪物而衰减,为了计算并弥补这个衰减,使其能稳定==单怪单挑时的输出,就必须对其建模。我称之为“n集群”,n指同时面对几个一样的怪。首先集群里单个怪物的生命值分配==1/n,1代表100%生命。输出衰减最大为(n-1)/n,因为杀死最后一只怪时战斗便结束了,所以不属于衰减范围。既然最大衰减这么多,我们提前给怪物加上会衰减的值即可:1+(n-1)/n,其中1代表100%输出。又(n-1)/n=1-1/n,则带入化简为2-1/n。然后除以n,分配给单个怪物。其中(n-1)/n,n→∞时,n集群怪物的输出==单怪单挑时的输出。也就是说(2-1/n)/n的分配是有误差的,n==2时误差最大,原因在于将连续可微的函数差分化处理了。这样得出的公式简洁容易计算,如果你想精确算分配给n集群单个怪的输出,你会发现计算复杂度随n变大。效率和够用才是首要的,即便是计算机也是进行差分化来计算。


1>>这种衰减然后弥补的思想可以应用到范围伤害上,范围伤害可以给定该技能是用来命中多少个目标的标准,然后算出若未命中这么多,最大会亏损多少输出量,从而弥补。


2>>同样的,我们也可以应用到长时间施法的技能上,它们的风险可以用时间来衡量,你给定一个临界风险施法时间,判断超出这个时间的部分占施法时间的比例,来量化其风险,然后补足即可——持续伤害同理。


【4】从一场战斗的角度建模:对玩家轮流面对怪物进行建模。我称之为“m波次”,不同于“n集群”,集群反映的是n个怪物同时面对玩家,其中导致的输出衰减问题。而“m波次”反映的是怪物轮流面对玩家,分界线为是否全击杀or接近全击杀才出现下一批怪物。用你写入一场战斗的期望战斗时间/标准战斗时间=u,然后u/m便是每波次怪分配到的生存能力,这是平均,你也可以使用加权平均,如1个集群的怪物占30%的u/1,然后70%的u/(m-1),1指你将1个集群的怪物单独划分出去计算了——这主要用于计算精英战和首领战,因为它们的战斗显然不能和普通怪那样被平均。接着,你写入的一场战斗的期望损失生命%除以u/m便计算出怪物是单怪单挑输出的多少倍。为什么?如果你把玩过最基本的公式,你便不难得出原因,基本公式为:


 

t为攻击间隔,T指生存时间,同时:



自己显然等于自己,而敌人不过是Hp和Dps不同的自己罢了,则:


 

等式右边的1是指1个自己,但1个自己也代表100%的生命值,当和自己对抗时,会损失100%生命值,也输出了100%的伤害,这就是等式右边数字1的含义。不难得出,若等式右边的数字是你写入的期望损失的生命%,则给定Hp的倍数(倍数==分子分母的Hp相除)可算出Dps*t的倍数,Dps*t显而易见是输出能力,因此,我们根据衡量战斗感受的数学指标完成了对怪物战斗能力的计算,算出的值再乘以“n集群”对应的输出能力,完成自动化求解过程,只需写入期望的战斗时间和期望玩家损失的生命%即可。


【5】野外怪物呢?野外怪物无需波次,但需要集群,集群反映了你期望玩家可以一次性应付的数量n。需要注意的小细节是n+1造成的生命%损失要≥100%。


【6】友好npc和陷阱怎么处理?我说过,我对系统性、模拟实际工作那样写文章缺乏能力,因此这种细节留给你来推导,但我可以给一些启发。


1>>友好npc应区分作战or非作战友军。非作战友军涵盖怪物攻击的目标,如护送、栅栏、要保护的基地,根据给定的损失生命%和战斗时间来算出非作战友军的生存能力。作战友军给定其强度后,让怪物获悉作战友军的强度和数量的存在,以修正计算结果。


2>>陷阱应区分针对玩家or怪物。针对怪物时,应告知陷阱针对的是哪种集群的怪物,期望怪物损失的生命%。不管是针对玩家还是针对怪物,陷阱的特点是每次攻击造成生命%的损失值,因此它必须求解析解。


Q:我认为从不同怪物类型的击杀时间的角度设计更合理!ヽ(#`Д´)ノ!因为我能区分精英和普通怪! 


A:well~~首先你并没有意识到精英怪or首领本质是一种语言上的定性描述,数学上的量化不过是不同的战斗时间和损失生命%罢了。其次,从单个不同类型的怪角度设计,然后再统筹怪物数量和类型是十分没有效率的。要知道,某些函数从这个角度算容易,从那个角度反推却难,这就是密码学的基本原理,为什么不选择效率更高,更便捷的建模角度呢?


Q:怎样计算战斗力? 


A:这取决于你如何定义战斗力,定义必须有现实、数学法则上的合理性。从这个角度看,我认为“战斗力==输出能力*生存能力”没有现实合理性。因为生命除以单次伤害得出受击次数和生存时间,P0的“输出能力*生存能力”除以P1的得出可击杀几个P1,和P1单挑损失多少生命%,这些都有意义,而 “输出能力*生存能力”单独看找不出现实意义。


【1】定义战斗力:评价角度。你已经计算出1级角色的具体值,而且知道任意系统是1级角色的w倍,则战斗力==评价总分*w。你给定1种属性的标准评分,如1级角色生命值为500,评分为100,其他属性同理。那么评价总分为sum(每个属性的标准评分),属性的标准评分/1级角色的具体值==该属性的系数。那么战斗力==系数a*属性a的值+系数b*属性b的值………..系数z*属性z的值。


1>>评价角度将战斗力定义为玩家成长情况是多少个于1级模板,评价即衡量玩家的属性成长有多标准——标准指1级模板


2>>无法和不同战斗力的玩家对比来定位自己的实际强弱。解决方案放在“3>>”。


3>>评价角度计算战斗力的问题在于,它将每个属性对1级模板的值加和了,但真正的评价应当是每个属性对1级模板的倍数是否相等,来衡量每个属性成长得有多标准,加和掩盖了某属性成长不足的情况。因此可以将战斗力/属性个数求出均值来一定程度解决这个问题,这么做让评价角度的战斗力一定程度的可对比不同玩家之间的实际强弱,但缺陷是未考虑到不同属性实际上对战斗的贡献并不相等。


【2】定义战斗力:全微分角度。已知输出是一个多元函数f(a~z),其中a~z为输出型属性。设输出增量为△f,则△f≈∂a+∂b+∂c…….. ∂z。∂是偏导符号。


1>>对不同输出型属性求偏导数,用偏导做系数,乘以具体值后加和,这样的角度意味着将战斗力定义为输出量的积,显而易见的,不同输出量的积可进行线性运算,给予了玩家根据自己与他人战斗力的值来定位实际强弱的数学基础。


2>>生存型属性该怎么办?事实上,生存增量△l是△f取负数罢了。数学原理很简单:受到的伤害==总伤害-吸收的伤害。不同正负号反映的是这些属性对伤害的互反方向的影响,对这个减法形式求偏导可看出两者对总伤害的贡献是相等的。你在这里可能发现了,为什么“输出*生存”不能定义为战斗力,它在数学上是不牢靠的。因此,对生存型属性求偏导后,与输出型属性的结果加在一起组成多项式。


3>>暴击、抗暴甚至别的奇奇怪怪的属性该怎么办?well~~只要这些属性影响战斗结果,那么它们总是能求偏导,所要注意的细节是类似暴击算出暴击率,暴击率才影响战斗结果,这是一个复合函数。复合函数求全导数+多次运用链式法则,你有微积分基础的话,这一点并不难。


4>>该角度的战斗力计算公式,缺陷在于若某个属性的数量级较低,而偏导的值又和其他属性差不多(如减法伤害公式,攻击和防御的偏导均为1,但防御的数量级<攻击),则该属性累积出的战斗力会少。这符合逻辑,但分配到不同系统上时,可能导致这个系统提升后看起来得到的战斗力很少,而评价角度计算的战斗力没有这个问题。


【3】权值战斗力。你可以将2个战斗力计算结果进行权值分配(权值和==1),然后求和。权值代表你多大程度上倾向于评价,多大程度上倾向于表达实际强弱。


Q:K值分配完了,那新开系统怎么办? 


A:的确,数值策划们会预留一定比例的战斗属性不投放,留给可能新开的系统。但从下面的角度来做,你会发现是更好的选择。


1>>给定新系统的玩家以损失多少生命%为代价击败旧系统的玩家,从而得出新系统玩家是旧系统玩家属性的w倍,则新系统需要投放的属性==K*(W-1)。


2>>第一,符合现实。新开的系统需要量化相比旧系统的重要程度,同时也要让玩家感受到你希望新系统多么有吸引力——损失生命%越少,新系统就越有吸引力。


3>>第二,避免了预留的比例用完的尴尬。


4>>第三,避免了预留比例部分的分配给新系统,却不知晓有多大吸引力的问题。我们不能简单的认为新系统占30%,某个旧系统也占30%认为他们同等有吸引力——新旧更替期间的老玩家,他们是先感受到旧系统的和,再感受新系统。而K值本身很大时,想要获得同等的战斗感受,给的属性需要更大。你已经有1000W的情况下是不认为1W对自己多有用的。


Q:怎样计算角色的成长线? 


A:得知角色的成长线,可算出怪物、AI在给定战斗感受下的具体属性值。我的做法仍然是“将连续可微函数差分化处理”。


【1】规划好游玩节奏。游玩节奏指第X天,普通玩家的等级、各个系统的进度情况。如第1天玩家20级,蓝色武器,宠物10级。节奏给定后,便可以算出多少倍于1级模板。


【2】选择游玩节奏的节点。通常我选取的节点是第1、2、6、14和第29天。原因在于,我们最常关注的是首日、次留、3留、7留、15留和30留这些留存数据。那么15天的玩家会上线的可能性我们可合理推测部分取决于第14天他们的成长是否满意,这是节点减去1天的原因。


【3】线性插值。显然,这些分段的节点对应的玩家等级不是连续的,等级对应的强度自然也不连续。但成长线是每级有对应的强度,其强度是1级模板的w倍。你可以给每级规划好系统进度来算出每级强度,但这是极其痛苦的。幸运的是,数值分析领域的工作者们已经发展出了许多函数逼近的方法,可以根据已知点来拟合近似函数,其中最基础的是线性插值。使用Excel的“TREND”函数,你便可以求出第1天最大等级的强度与第2天之间所有等级对应的强度值。


【4】二次多项式插值。尽管各个系统的成长是线性的、分段线性的(分段线性其实是对曲线的近似),线性插值已然足够,不过,如果你有如下需求呢?那么你会意识到,计算成长线具有了新的含义:游戏难度系数线。


1>>我希望在若干节点对应的不是普通玩家,而可能是小额付费、中额付费玩家的强度,但我想避免线性插值让普通玩家陡然感受到难度递增,而是希望逐渐感觉到,该怎么做?这时,你需要二次乃至n次多项式插值,通过给定节点对应的强度,曲线拟合出成长线,就能满足你的需求。Excel没有相关函数,这方面的知识请学习数值分析插值法的内容。


2>>将仅有普通玩家的线性插值成长线的图表和有不同付费额度多项式插值成长线重叠对比,可以较为直观的展示普通玩家在游玩过程中的难度感受。


经济数值


Q:怎样对经济这块儿建模呢?


A:又一个宽泛的问题!和战斗数值一样,我选取几个节点作答。


【1】经济建模是求解Ax=0的齐次方程组的过程。在单位时间内某物品产出然后消耗,再产出再消耗,毫无疑问结果总是==0,它反映的现实意义是在数值层面游戏最大可游玩的时间,在线性代数里是一个齐次方程组。方程组的性质告诉我们非零解在经济数值建模里是必定存在的,且有无穷多解(受自由变量约束),这意味着其实经济数值在很大程度上是自由设定的。若游戏系统相对简单或你真的列出包含所有系统进度的方程组,你可以在Mathematica里求出产出与消耗,用Excel的函数链接,你只需改变自由变量、游玩节奏(游玩节奏抽象为齐次方程组),便自动改变产出和消耗。


1>>理论可行,实际操作困难重重。就像数学推导很优美,求解却太复杂,我们必须另辟蹊径,绕过求解Ax=0,欣慰的是,数值分析领域正是干这个的。


【2】经济建模的数值解基础——插值法。当你规划好游玩节奏,理论上给定产出,通过游玩节奏算出消耗,或反过来。但实际工作中很难吻合,或是会得出不符合直觉的结果,工作难度随着系统规则的复杂而提高。比方说,宠物系统有几十个品质可提升,你要定出几十个品质对应的游玩节奏,才能根据你给定的消耗规划出产出,或给定产出规划出消耗(也有人给定产出和消耗计算游玩节奏,这个角度不符合实际,我们想要的往往是定好的游玩节奏)。这种做法低效、误差不便于求解和控制,甚至完全不可行,不可行时常用做法是用权重将所有量分配给不同品质。此外还有一个问题:怎样与计算出的成长线吻合呢?如果成长线要求的强度经济没跟上,甚至相差甚远,将严重影响游戏的方方面面。想要解决这些麻烦,提高你的工作效率、稳健性程度,插值法是不错的选择,它有这些特点:


1>>插值法可求解误差范围,控制了整个战斗和经济吻合的质量。


2>>角色成长线最后一个节点一定等于经济消耗最后一个节点,而两者第1、2天也往往吻合良好。因此,角色成长线的插值只是比经济的插值多了几个数据点(比如成长线包括了第6、14天的节点,但生命周期最后一天两者节点必定相同),于是两者对未知点的预测在数学上是最优的,而未知点正是要求解的消耗值——我们成功绕过了求解Ax=0。


【3】先定产出。我注意到,数值策划们大多是先规划消耗,再求产出,虽然在数学基础上,给定其中可求出另一个,似乎从哪个方向上推算都可行。但正如我在战斗数值对答里提到的:某些函数反过来算容易,正面计算难。这意味着选择哪个方向计算,存在效率甚至精度上的区别。


1>>先定产出的原因是,产出的规则往往比消耗复杂,比方说不同排名的人得到的奖励不同,多人战中给一个最佳表现奖,更高的建筑等级产出更大如此种种。相比之下,略复杂的消耗规则也只是概率。这种不对等,首先导致数字的给定和计算,必须结合人的认知,难以通过简单的数学工作自动化完成。第二,先定消耗给产出在种种规则限制下又多了消耗这一限制——这实在是雪上加霜。


2>>产出应当以一个时间为单位线性增长,然而在复杂的系统规则下,它无法保证。如果建筑等级越高产出越大,那么选择第1天可达到的最大建筑等级为该系统的单位增长,低于该建筑等级的以一个线性递减给出,再给出最高建筑等级的产出是单位增长的k倍,用下列公式求解该产出类型的最小生命周期。


 

3>>M是该产出类型新的生命周期,N为规划的生命周期,q为该产出类型在本系统占所有产出的比例。该产出类型的生命周期一定在N和M之间,如果你可以再获知一些玩家在该系统的进度,算出不同的M,然后对它们进行拟合,求定积分,即可得出该产出系统的生命周期。


【4】对消耗插值。我们已经知道产出的单位线性增长,可算出第1、2天不同系统进度的相关消耗,而生命周期最后一天的消耗必定等于总产出量。则我们有个3个数据点,对其插值,用插值给出的多项式公式反算未知系统进度应该对应的消耗即可,有几个细节值得注意:


1>>你计算的是不同进度的累积消耗量。如强化1消耗10金币,强化2消耗20金币,强化2累积消耗了30金币,你的插值法算出的结果应当减去前1等级的累积消耗量,便得出本级的消耗量。


2>>若系统进度是类似装备品质这种概念,则不能用天数来做自变量x求出y。而应该是根据战斗数值给出的不同装备品质分配的权重作为x来插值求未知y,这么做不难发现,暗含了恒定性价比的需求在这里。


3>>品质这样的概念怎么对应累计消耗量?不同品质用的不同材料!这一点,你应当想到可以把不同材料互相建立倍数关系来解决问题。


Q:我不懂你说的什么插值法!


A:Excel工具是数值策划用的最多的,你可以用对图表添加趋势线的方式来拟合,其数学思想是不一样的。尽量不要使用太高次项的拟合,因为会出现过度拟合,犯错的可能性会更大。此外,不论是插值还是拟合,有时出现算的未知数反而比前面的少。这种情况有如下原因:


1>>任何数值分析手段都存在自身构造函数理论带来的系统误差。


2>>你的节点对应的战斗数值、消耗产出量大小互相之间太接近了,也许你应该审视你给的数字是不是在数量级差异上有些吝啬。

3>>当出现计算的值比前面少时,先找出最靠近+大于前面的系统进度的值,以该值为终点,结合前面的值进行线性插值,求出它们之间的未知数。


Q:属性、道具的价值该怎么算呢?


A:这个问题是最容易解决的,但也是最容易引起分歧的,但我们要明白一点,所谓的价值无非是一个函数关系,函数关系怎样取决于我们从什么角度建模,我不知道各位从什么角度建模,但我无法想象除了下面的角度及其变种之外还能有什么角度。


【1】真实利润角度。我是一个商人,我有k个货物,想要赚取Q的利润,那么货物的单价就是Q/k。几乎没有什么游戏的系统不是通过道具来提高属性的。如果强化需要强化石,那么强化石的单价==利润/需要的强化石数量。瞧,现实和游戏是一样的,现实无法售卖卡路里,是通过食品来间接售卖,同样的,游戏一般不直接卖属性,而是要求玩家付出成本收集一定的道具做到这一点。


1>>如果A系统只提供A属性,B系统只提供B属性。那么承载AB系统的道具必须经过属性价值的换算得出总利润后才能算出道具的单价。AB属性的价值怎么算呢?和战斗力完全一样!因此,你的战斗力怎么算的,其系数就是该属性的价值,该属性的价值占全部属性价值的和的比例,乘以总利润,再乘以AB系统被分配到的属性比例,便得到对应系统的总利润。


2>>如果你采用了权值战斗力,即,将评价战斗力和强弱战斗力混合,那么属性的价值也必须是混合系数。这么做,本质就是保证性价比的需求,在付费带来的战斗力增长的感官体验上,会较为稳定,让人感觉合理。


【2】虚拟利润角度。有人曾经很生气的反驳过“利润角度”思路,认为那些不是道具付费的游戏,比如war,怎么办?我知道他很生气是因为他把我踢出了他的群。其实不论什么样的游戏,一定有货币的象征物存在,只不过这个象征物不像道具付费那样对现实产生影响罢了——游戏里再有钱,也跑不过房价。所以,利润角度处理非道具付费游戏是一样适用的——这也反映了数学的抽象是多么有用的东西啊~~


Q:喂!我照你的方法算出来的数字完全不可理喻,他们说太便宜/贵了!

 

A:这是一个非常棒的问题,我也遇到过,那时我便意识到,这方面的经济建模还缺乏让普通人能加以理解的封装,所以我有如下声明:


【1】你算出的道具价格,是一个简单模型。你只是根据利润、战斗数值的分配来计算道具价格,但事实上人类对价格的感知绝不是这般冰冷与理性的,他们还受到自身收入水平、对游戏认可、对花钱的生理痛感、攀比与虚荣、信息有限等等的影响——令人高兴的是我们永远不必对这些玩意儿建模——其中的影响一定有战斗数值越多,价格越贵这样的函数关系。我们的建模虽然简单,但至少固定了这一点。


【2】你算出的道具价格,可以视为基函数。当某些人指摘你的道具价格太贵,太便宜,太不整齐时,你可以告诉他们:“这是一个基数,如果你认为1块钱不正确,应该是卖10块钱。那么事实上就是翻了10倍,则数学和现实意义是将付费深度提高10倍”。同时你还需要告诉他们,如果这个道具的单价翻10倍,那么理论上所有道具都应该翻10倍左右(至少是这个道具所处系统的其他道具)。这样才能不过度扭曲依据战斗数值为自变量的价格建模基础,如果扭曲太多,则不同系统给出的相同属性在性价比上不一样,这将影响玩家对付费的感知和判断。


【3】不同系统翻不同倍数的现实意义。尽管理论上应当将所有道具价格翻倍以保证性价比的稳定,但其实不同系统有自己的倍数,其现实意义是我们创造了一个付费吸引力的梯度,A系统不翻倍,B系统翻了5倍,显然玩家不多久会互相告知A系统附带的道具性价比很高——有对比才有差异,这能刺激玩家的消费欲望。


1>>一个or多个系统单独翻倍,其对付费深度的影响是可以换算出来的,换算的过程需要考虑到不同系统被分配的战斗数值比例。换算出来后再与“战斗数值关于生命周期的感受良好程度”链接在一起,可以帮你自动计算新的付费深度对感受良好程度的影响,从而衡量“叫价10块钱”的人将使整个游戏变得多糟糕or多良心。


其他


Q:你把这个叫对答录(编注:本文原标题为《游戏数值对答录》),你的意思是你还有哲学思想?


A:ha~~当然不是!不过你可以看出,对高数(不是高中数学)及其方法有一定了解,生活会更精彩一些~~O(∩_∩)O


Q:我该怎样提高游戏数值建模的能力?


A:数学是自然的语言,也是应用的工具。工作中遇到问题,我首先思考的是有没有某种数学方法可以解决或能帮助理解,如果我对此一无所知,我就会随意查看公开课,遇到不了解的数学术语时百度一下,以粗浅的理解大致判断有没有可能有用,再去深入学习。


Q:我认为你有些东西说的不细致!


A:well~~因为我信奉的是一句工程应用的名言:close enough is good enough。这一点体现在了本文中“近似”、“差分处理”、“不求解析解”字眼里。


今日推荐

多人FPS游戏的关卡设计要点

超全!盘点MOBA类游戏的深度分析

小团队做游戏这么难吗?创业者亲述血泪史

一键添加

加小编微信,享双重福利

1.加入GAD策划交流群,获取行业干货;

2.领取17G腾讯内部分享等独家策划资料。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存