数值路上(二)处理数值问题的四种方法
第一篇文章见此:
数值策划入门指南(一):做数值就是做体验:http://gad.qq.com/article/detail/5896
数值路上(二)处理数值问题的四种方法
我在上一篇文章《数值路上(一)做数值就是做体验》中写了个人对于游戏数值设计的核心认识:一切数值设计的落脚点都应该是体验。在游戏开发过程中总会遇到各种各样的数学问题,往往解决这些数学问题就是实现期望体验的必要环节。总结了一下平时处理数学问题时常用的四种方法。
数学是一切的基础
处理数学问题固然需要用到数学,个人以为数值策划并不需要太高的数学水平,熟练掌握高中数学就基本够用,但如果对于概率、期望、常见方程的解法等基础知识都不能熟练运用的话,那做起数值来肯定会十分吃力。
举个一个常见的笔试题为例:马戏团来到了小镇上,他们出售漂亮的英雄卡片,卡牌一套为6张,每次只能随机抽取一张,每次抽取时抽到每张卡牌的概率都相同,请问在数学期望上,需要抽取多少次才能集齐所有的卡牌?
如果我们熟练地掌握了高中数学,那么这个问题就十分简单:
如果对于概率和期望了解甚少,那这道题可能就会无从下手。一般来说数学能力越强,处理开发过程中遇到的数学问题就越轻松,也就能将更多的精力放在做好数值体验上,数学能力的强弱是辨别数值策划好坏的重要指标。
只有夯实了数学基础,才有能力调整好数值体验。
EXCEL是个好助手
EXCEL是数值策划平时工作最常用的软件,很多问题借助EXCEL会变得无比简单,比如我们已经计算得出了每级的升级时间如下图,现在需要得出玩家在游戏中每一天的等级数据。
天数和对应等级的关系很简单,当天数≥45时,对应等级为16级,当天数<45时,对应等级为满足(天数<累积升级天数)这一条件中最小的累积升级天数所对应的等级。这时候可以用excel中的countif函数来解决这个问题,在B20中输入函数如下,然后一拉就能解决这一问题
Ø =IF(A20>=45,16,COUNTIF($C$2:$C$16,"<="&A20))
Ø 得出的结果如图
以上函数帮助我解决了很多的问题,之后有机会我会分享一个相对完善的数值框架,其中能看到这些函数的具体用法,网上有很多EXCEL的相关教程,在此不再复述。
VBA简单粗暴
做数值时经常会遇到一些比较复杂的问题,有些问题可能会超出我们所掌握的数学能力。我们可以通过学习数学中相应的知识来解决这些问题,但多数情况下这样的学习周期都比较长,而项目开发的时间不会等人,这种时候使用VBA模拟来解决是最好的选择。VBA是EXCEL中编程用的语言,语法简单易学,即使是零基础的人,用心学习一个星期左右应该就能用VBA解决一些实际问题。以强化为例:
假设现在我们有一个强化系统,其逻辑如下:
- 每次强化消耗1个强化石
- 生成随机数R∈(0,100),若R<成功率,则强化成功,强化等级提升一级,否则强化等级变为失败后等级
现在我们有强化的数据表如下
现在需要知道玩家将一件装备强化到10级平均需要消耗多少个强化石,我们可以通过EXCEL拉表解决这个问题,但若一时半会理不清头绪或不确定自己的算法对不对时,使用VBA模拟来解决这个问题就再好不过了。
模拟出来的结果大概是5000左右,计算得出的精确结果为5053,误差1%左右。
VBA解决问题的好处在于不需要太多的数学知识,也基本不需要思考,只要理清系统的逻辑然后用代码将过程模拟出来就可以得到一个与标准结果十分接近的近似值。VBA具体怎么写可以在网上找到很多的资料,有时间的童鞋可以找本书完整地学习一遍。用VBA求解有两种常用方法:模拟和穷举,以一道题为例:一根一米长的棍子,随机在一个位置上砍一刀将其砍为两段,再将其中较长的一段在随机位置上砍为两段,则最后剩下的三根棍子中最短的一段的长度期望是多少?
模拟法简单易理解,不过误差有波动,有时模拟出来的值误差会大一点。穷举法相对精确,误差不会波动,但有的时候效率较低,而且有些问题是无法用穷举法解决的。灵活使用这两种方法可以解决绝大部分的数值计算问题~
统计调整是最终武器
前面讲了一下一般数值问题的处理方法,这些问题无论是简单还是复杂,都能用数学或模拟的方法来解决。还有一些问题则必须要统计数据再反复调整才能解决,比如:5个elo值为1500的玩家在网吧五连坐开黑,这支队伍的实际elo值为多少?以下是一段LOL设计师对匹配机制的讲解,简单点说就是用统计数据解决了问题
我们大多数情况下,会通过将5人组队的队伍匹配给另外一个5人组队的队伍来避免这种情况的发生(几乎是所有情况下)。
对于“部分”组队,我们进行了大量的研究,发现优势并没有想象的那么大,所以我们也会把他们混到solo(单排)的玩家里。我们发现有大量的因素会影响到组队优势的大小:从预先组队的规模(比如2、3、4、5组队),到组队玩家的水平,到高玩带菜鸟的组合,到玩家水平不同而导致的情况不同,以及其他的一些必须考虑到的微妙因素。这个要比一些我们曾见过的点对点算法-将任意的统计数据杂糅在一起猜测分数-要可靠的多
发现这些优势,我们就知道对于预先组队的队伍,需要提高多少elo值,来达成一个公平的匹配,确定一个适当的,在数学上合理的调整。结果在有些情况下非常令人惊讶(同时会校正统计数据)。
虽然我们不会给出精确的数值,因为这是商业机密,但是我们可以告诉您:
*5人组队只是比5个路人稍强。
*部分组队只是比5个路人略强。
*菜鸟5人组队并不会带来太大的优势,但是高玩组队会有很大的优势。
*团队实力方差高的队伍,会比方差低的队伍更强。(方差简单来说,是在平均值相同的情况下反应各个元素的大小差异,方差大表示差异大,高方差的队伍类似高玩带低玩,低方差的队伍各个队员实力接近。)
*这说明了大体上,高水平玩家的Carry作用(可以理解为带领或者大腿),比低水平玩家的送人头作用(feeder)要强力。
其实无论什么游戏,统计数据然后调整都是必须的,因为体验是一个难以量化的值,我们需要知道实际的玩家行为数据才能更加靠谱地把游戏数值做好。
实际的工作中会出现的数值问题多种多样,很难一一详解,所以这章的《数值路上》只是简单地介绍了处理数值问题的四种方法。灵活运用这四种方法之后,多数的计算问题就都不是问题了,就可以安心地面对数值策划的终极问题:“如何用数值做出好体验?”。之后的《数值路上》系列将主要探讨体验问题,中间偶尔穿插一些具体数值计算的方法,如果大家遇到了难以处理的计算问题,可以去找个数值策划的群,一般都会有人给出详细的解法。