作为一名数值策划,不仅要学会如何搭建游戏数值架构这类宽而泛的事物,也应该要懂得针对系统策划设计出来的单个系统或者单个玩法,进行单个系统或玩法内部的数值建模,以及数值调优,以满足系统策划对其的各种合理预期。在进行数值建模的过程中,你需要针对提供的这个系统或玩法,事先考虑在数值上预留一定的扩展性(如果单个系统或玩法的规则有修改,则不是数值上的问题,需要修改代码逻辑),让我们在数值参数的调整上提升效率。
以下就某游戏的一个玩法来进行单玩法的数值建模及后续数值调优设计。
熟悉的同学应该都知道这是《神武2》中的幸运转转乐玩法,大致讲一下这个玩法内容以及规则:
- 玩家每天完成一些任务或者活动,能够获得一定点数的活跃度
- 每满50点活跃度获得1次掷骰子机会
- 每天最多可获得4次机会,显示在【剩余机会】中
- 剩余机会仅当天有效,如果没有用完,隔天会重置为0
- 掷骰子时,2个骰子的总点数就是小鸡在环形图中走的步数
- 小鸡走到某个格子处,就能获得相应格子里的奖励
- 如果遇到高级奖励(珍兽之灵、神兽之灵、高级兽决),会在传闻频道中进行公告(上电视)
- 如果小鸡走到了【起点】处,没有奖励,并额外获得1次掷骰子机会
- 格子中的奖励有碎片,集齐一定数量的碎片可以兑换右下角相应的奖励
- 好了,整个的玩法规则就是这样,现在开始进行数学模型的建立。
数学模型建立的目的
这个玩法中,我主要是想知道在多次掷骰子的情况下,平均一次我能够获得多少价值的奖励。
需要用到的输入数据
基于上面建模的目的,玩法中的某些数据是用不到的。
- 活跃度:这个数据只会影响掷骰子的机会次数,而建模时掷骰子次数是作为输入项,因此不需用到。
- 兑换所需数量:跟建模无关,不需用到
用到的数据列表如下
说明一下,输入数据统一用绿色标识,建模后需要查看的数据统一用橙色标识;格子数量和格子价值在Excel表中用两列来输入数据(这里为了显示方便做了分列处理)
可以看到,在这样的输入数据下,我们可以对骰子个数进行改动(以前一次只能掷2个骰子,现在可以修改为掷任意多个骰子)、对总的格子数进行改动、对每个格子里物品的价值进行改动。这样,即是为建模做了数值上的扩展,但如果你想让玩家能够选择掷一个或者两个骰子,那么就需要到代码中进行规则的修改。以上,是对输入数据上的数值扩展,后面会讲到对结果数据上的扩展。
编写代码进行规则模拟
以下,开始编写代码进行模拟。模拟过程主要分为3部分:数据录入、数据处理(逻辑规则运算)、输出结果并显示。这3部分都会在下面的代码中得以展示。
1 Option Explicit 2 3 Sub shenwu() 4 Dim pos() As Integer, value() As Integer 5 Dim startPos As Integer, times As Integer 6 Dim n As Integer, i As Integer 7 8 n = Application.WorksheetFunction.count(Range("J:J")) 9 10 ReDim pos(0 To n - 1) As Integer 11 ReDim value(0 To n - 1) As Integer 12 13 For i = 0 To n - 1 Step 1 14 pos(i) = Range("J" & i + 2).value 15 value(i) = Range("K" & i + 2).value 16 Next 17 18 startPos = Range("O1").value 19 times = Range("O2").value 20 21 Dim totalValue As Long 22 Dim random As Integer 23 Dim midPos As Integer 24 25 totalValue = 0 26 27 For i = 1 To times Step 1 28 random = Application.WorksheetFunction.RandBetween(1, 6) + Application.WorksheetFunction.RandBetween(1, 6) 29 startPos = (startPos + random) Mod n 30 While startPos = 0 31 random = Application.WorksheetFunction.RandBetween(1, 6) + Application.WorksheetFunction.RandBetween(1, 6) 32 startPos = (startPos + random) Mod n 33 Wend 34 totalValue = totalValue + value(startPos) 35 Next 36 37 Range("O4").value = totalValue 38 Range("O5").value = Round(totalValue / times, 0) 39 End Sub
可以看到,最开始的几行代码是将Excel中的数据保存到代码的相关变量中,For循环这段代码开始对我们设定的掷骰子次数进行一次次的模拟运算,最后将结果保存在totalValue中。For循环外下面的几行代码,则是将结果显示到Excel表中,方便结果分析优化。
这段代码没有去用骰子个数,而是直接用2个randbetween()函数来实现掷骰子行为;如果需要进行骰子个数扩展,可以使用For循环实现。
输出数据扩展
上面的代码已经能够满足我建模的目的:得到多次掷骰子情况下,平均一次能够获得的物品价值。不仅如此,如果我们需要观察每一次掷骰子的结果,上述代码也是可以实现的。每次更新startPos后,将这个startPos以及对应的value(startPos)输出显示到Excel上即可。这样,就对输出数据进行了一定程度的扩展。
对于输出数据的扩展,基本上都需要改动代码,但尽量保证在原有的代码上进行代码添加,而不是修改代码,这是在建模过程中的一个好习惯。
数值调优
数值调优过程,是一个在现有规则不变的情况下,不断调整优化输入数据,使输出数据满足策划预期的一个过程。
这里,我们可以通过不断的调整格子的数量以及每个格子里的物品(即物品价值),使最终的平均价值达到给定的预期为止。到这一步,就是纯工作量的问题了,就不细说了。
后续额外需求
一般而言,当你建模完成后,还是会遇到策划临时添加其他需求的情况,那么此时应该怎么处理?假如这个时候有一个需求,我希望有5%的机会能上电视(上面规则有提到,如果获得高级物品,能够上电视)。那么,如何完善之前的建模来满足这个需求呢?
- 首先,记录格子里的高级物品数量以及所在格子位置。
- 然后,在每次的掷骰子模拟中,对获得高级物品事件进行计数。
- 再次,打印显示上电视的次数。
- 最后,不断进行数值调优,调整高级物品数量和位置,使上电视次数/模拟次数接近5%(肯定有浮动)。
以上,将之前的模型加以了补充和完善,满足了后续的额外需求。
后话
当完成一个系统或者一个玩法的时候,系统策划、数值策划最好能够事先就把数值需求确定清楚、完整,后面数值策划在进行建模的时候,就不用过多的修改代码,而只需要进行数值调优,快速的完成一个系统或一个玩法的数值工作,这样,效率才会大大提升。