游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6016|回复: 6

[分享] 数值路上(二)处理数值问题的四种方法

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2016-4-18 15:42:55 | 显示全部楼层 |阅读模式
QQ截图20160418154103.jpg

  文/张小勇

  我在上一篇文章《数值路上(一)做数值就是做体验》中写了个人对于游戏数值设计的核心认识:一切数值设计的落脚点都应该是体验。在游戏开发过程中总会遇到各种各样的数学问题,往往解决这些数学问题就是实现期望体验的必要环节。总结了一下平时处理数学问题时常用的四种方法。

  一、数学是一切的基础

  处理数学问题固然需要用到数学,个人以为数值策划并不需要太高的数学水平,熟练掌握高中数学就基本够用,但如果对于概率、期望、常见方程的解法等基础知识都不能熟练运用的话,那做起数值来肯定会十分吃力。

  举个一个常见的笔试题为例:马戏团来到了小镇上,他们出售漂亮的英雄卡片,卡牌一套为6张,每次只能随机抽取一张,每次抽取时抽到每张卡牌的概率都相同,请问在数学期望上,需要抽取多少次才能集齐所有的卡牌?

  如果我们熟练地掌握了高中数学,那么这个问题就十分简单:

  抽到第一张未拥有牌的概率为:P1=卡牌种类总数/未拥有的卡牌种类总数=6/6,则抽中第一张未拥有的卡牌所需次数的期望E1=1/P1=1/(6/6)

  同理我们可以得出P2、P3…P6

  最终可得

  E=1/(6/6)+1/(5/6)+1/(4/6)+1/(3/6)+1/(2/6)+1/(1/6)=14.7

  如果对于概率和期望了解甚少,那这道题可能就会无从下手。一般来说数学能力越强,处理开发过程中遇到的数学问题就越轻松,也就能将更多的精力放在做好数值体验上,数学能力的强弱是辨别数值策划好坏的重要指标。

  只有夯实了数学基础,才有能力调整好数值体验。

  二、EXCEL是个好助手

  EXCEL是数值策划平时工作最常用的软件,很多问题借助EXCEL会变得无比简单,比如我们已经计算得出了每级的升级时间如下图,现在需要得出玩家在游戏中每一天的等级数据。

1.png

  天数和对应等级的关系很简单,当天数≥45时,对应等级为16级,当天数<45时,对应等级为满足(天数<累积升级天数)这一条件中最小的累积升级天数所对应的等级。这时候可以用excel中的countif函数来解决这个问题,在B20中输入函数如下,然后一拉就能解决这一问题

  =IF(A20>=45,16,COUNTIF($C$2:$C$16,"<="&A20))

  得出的结果如图

2.png

  EXCEL中有很多方便好用的函数,熟练使用EXCEL中的这些函数可以让我们的工作更加简单高效,在此简单地列举一些平时个人常用的函数:

  剑的攻击。

  Index:根据相对的行列位置找到区域内的某个值。

  Countif:计算区域内符合要求的单元格个数,我经常用这个去推算玩家在不同天数时的成长)

  D4、$D4、D$4、$D$4的区别:$这个符号代表拖动不会发生改变,合理使用$能让处理表格的过程事半功倍。

  以上函数帮助我解决了很多的问题,之后有机会我会分享一个相对完善的数值框架,其中能看到这些函数的具体用法,网上有很多EXCEL的相关教程,在此不再复述。

  三、VBA简单粗暴

  做数值时经常会遇到一些比较复杂的问题,有些问题可能会超出我们所掌握的数学能力。我们可以通过学习数学中相应的知识来解决这些问题,但多数情况下这样的学习周期都比较长,而项目开发的时间不会等人,这种时候使用VBA模拟来解决是最好的选择。VBA是EXCEL中编程用的语言,语法简单易学,即使是零基础的人,用心学习一个星期左右应该就能用VBA解决一些实际问题。以强化为例:

  假设现在我们有一个强化系统,其逻辑如下:

  1.每次强化消耗1个强化石

  2.生成随机数R∈(0,100),若R<成功率,则强化成功,强化等级提升一级,否则强化等级变为失败后等级

  现在我们有强化的数据表如下

3.png

  现在需要知道玩家将一件装备强化到10级平均需要消耗多少个强化石,我们可以通过EXCEL拉表解决这个问题,但若一时半会理不清头绪或不确定自己的算法对不对时,使用VBA模拟来解决这个问题就再好不过了。

  模拟这个问题的VBA代码如下:

  1. Sub 模拟()
  2.     data = Range("a2:c12")
  3.     Dim 模拟次数, 强化总次数 As Long
  4.     模拟次数 = 1000
  5.     For i = 1 To 模拟次数
  6.         当前等级 = 0
  7.         Do Until 当前等级 = 10
  8.             强化总次数 = 强化总次数 + 1
  9.             r = Rnd * 100
  10.             If r < data(当前等级 + 1, 2) Then
  11.                 当前等级 = 当前等级 + 1
  12.             Else
  13.                 当前等级 = data(当前等级 + 1, 3)
  14.             End If
  15.         Loop
  16.     Next i   
  17.     Range("a15") = 强化总次数 / 模拟次数
  18. End Sub
复制代码

  模拟出来的结果大概是5000左右,计算得出的精确结果为5053,误差1%左右。

  VBA解决问题的好处在于不需要太多的数学知识,也基本不需要思考,只要理清系统的逻辑然后用代码将过程模拟出来就可以得到一个与标准结果十分接近的近似值。VBA具体怎么写可以在网上找到很多的资料,有时间的童鞋可以找本书完整地学习一遍。用VBA求解有两种常用方法:模拟和穷举,以一道题为例:一根一米长的棍子,随机在一个位置上砍一刀将其砍为两段,再将其中较长的一段在随机位置上砍为两段,则最后剩下的三根棍子中最短的一段的长度期望是多少?

  方法一:直接模拟N次过程

  1. Sub 模拟1()
  2.     Dim 最短棍长之和 As Double
  3.     For i = 0 To 1000000
  4.         a = Rnd
  5.         b = 1 - a
  6.         If a > b Then
  7.             c = a * Rnd
  8.             d = a - c
  9.             最短棍长之和 = 最短棍长之和 + Application.WorksheetFunction.Min(b, c, d)
  10.         Else
  11.             c = b * Rnd
  12.             d = b - c
  13.             最短棍长之和 = 最短棍长之和 + Application.WorksheetFunction.Min(b, c, d)
  14.         End If
  15.     Next i
  16.     Range("a1") = 最短棍长之和 / 1000000
  17. End Sub
复制代码

  方法二:按一定误差穷举

  Sub 模拟2()

  1. Sub 模拟2()
  2.     Dim 最短棍长之和 As Double
  3.     For i = 1 To 1000
  4.         a = i / 1000
  5.         b = 1 - a
  6.         For j = 1 To 1000
  7.             If a > b Then
  8.                 c = a * j / 1000
  9.                 d = a - c
  10.                 最短棍长之和 = 最短棍长之和 + Application.WorksheetFunction.Min(b, c, d)
  11.             Else
  12.                 c = b * j / 1000
  13.                 d = b - c
  14.                 最短棍长之和 = 最短棍长之和 + Application.WorksheetFunction.Min(b, c, d)
  15.             End If
  16.         Next j
  17.     Next i
  18.     Range("a2") = 最短棍长之和 / 1000000
  19. End Sub
复制代码

  模拟法简单易理解,不过误差有波动,有时模拟出来的值误差会大一点。穷举法相对精确,误差不会波动,但有的时候效率较低,而且有些问题是无法用穷举法解决的。灵活使用这两种方法可以解决绝大部分的数值计算问题~

  四、统计调整是最终武器

  前面讲了一下一般数值问题的处理方法,这些问题无论是简单还是复杂,都能用数学或模拟的方法来解决。还有一些问题则必须要统计数据再反复调整才能解决,比如:5个elo值为1500的玩家在网吧五连坐开黑,这支队伍的实际elo值为多少?以下是一段LOL设计师对匹配机制的讲解,简单点说就是用统计数据解决了问题

  我们大多数情况下,会通过将5人组队的队伍匹配给另外一个5人组队的队伍来避免这种情况的发生(几乎是所有情况下)。

  对于“部分”组队,我们进行了大量的研究,发现优势并没有想象的那么大,所以我们也会把他们混到solo(单排)的玩家里。我们发现有大量的因素会影响到组队优势的大小:从预先组队的规模(比如2、3、4、5组队),到组队玩家的水平,到高玩带菜鸟的组合,到玩家水平不同而导致的情况不同,以及其他的一些必须考虑到的微妙因素。这个要比一些我们曾见过的点对点算法-将任意的统计数据杂糅在一起猜测分数-要可靠的多

  发现这些优势,我们就知道对于预先组队的队伍,需要提高多少elo值,来达成一个公平的匹配,确定一个适当的,在数学上合理的调整。结果在有些情况下非常令人惊讶(同时会校正统计数据)。

  虽然我们不会给出精确的数值,因为这是商业机密,但是我们可以告诉您:

  *5人组队只是比5个路人稍强。

  *部分组队只是比5个路人略强。

  *菜鸟5人组队并不会带来太大的优势,但是高玩组队会有很大的优势。

  *团队实力方差高的队伍,会比方差低的队伍更强。(方差简单来说,是在平均值相同的情况下反应各个元素的大小差异,方差大表示差异大,高方差的队伍类似高玩带低玩,低方差的队伍各个队员实力接近。)

  *这说明了大体上,高水平玩家的Carry作用(可以理解为带领或者大腿),比低水平玩家的送人头作用(feeder)要强力。

  其实无论什么游戏,统计数据然后调整都是必须的,因为体验是一个难以量化的值,我们需要知道实际的玩家行为数据才能更加靠谱地把游戏数值做好。

  实际的工作中会出现的数值问题多种多样,很难一一详解,所以这章的《数值路上》只是简单地介绍了处理数值问题的四种方法。灵活运用这四种方法之后,多数的计算问题就都不是问题了,就可以安心地面对数值策划的终极问题:“如何用数值做出好体验?”。之后的《数值路上》系列将主要探讨体验问题,中间偶尔穿插一些具体数值计算的方法,如果大家遇到了难以处理的计算问题,可以去找个数值策划的群,一般都会有人给出详细的解法。

  相关阅读数值路上(一):做数值就是做体验

via:GAD

1

主题

27

帖子

766

积分

高级会员

Rank: 4

积分
766
发表于 2016-4-18 17:23:54 | 显示全部楼层
不错,学习了

1

主题

67

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
发表于 2016-4-19 09:57:32 | 显示全部楼层
这个。。不懂的人看不懂。。懂的人没必要看。。。╮(╯▽╰)╭。。。。
所以说的都对然并卵

1

主题

92

帖子

1577

积分

金牌会员

Rank: 6Rank: 6

积分
1577
发表于 2016-4-19 13:40:46 | 显示全部楼层
谢谢分享

0

主题

1

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2016-4-21 17:49:06 | 显示全部楼层
楼主是来误人子弟的吧。。第一题就在瞎计算,这数学基础也好意思出来混

0

主题

26

帖子

364

积分

中级会员

Rank: 3Rank: 3

积分
364
发表于 2016-4-22 10:10:54 | 显示全部楼层
学习了 前阵子做看经验得对应等级 脑袋里一直想直接输出表格中的等级 一直百思不得其解 看了你用countif算单元格数量来判断等级 豁然开朗 谢谢啦

0

主题

8

帖子

443

积分

中级会员

Rank: 3Rank: 3

积分
443
发表于 2016-4-22 18:32:46 | 显示全部楼层
懵懵懂懂的看了跟着学就好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 15:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表