游戏开发论坛

 找回密码
 立即注册
搜索
查看: 14802|回复: 25

[分享] 游戏数值:10分钟学会屠龙刀强化计算

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2016-9-12 17:07:59 | 显示全部楼层 |阅读模式
QQ截图20160912170521.png

  文/破戒僧

  1.前言

  必须在开篇解释一下,工具是服务于设计目标的,

  写作本篇的目的,只是希望能帮大家节约工作时间,减少计算量,而并非鼓吹工具的重要性(但如果有同学因此喜欢上mathematica,我还是很高兴的);后续将整理一些常用概率、统计公式或是其它可被数值设计工作使用的基础知识。


  2.问题

  某游戏有一种稀有武器——屠龙刀,屠龙刀可以强化到10级(初始1级),对应的强化规则如下:

1.png

  求得到一把+10的屠龙刀所需的强化次数

  3.背景

  这个问题,涉及到随机过程——马可夫过程的计算,步骤较复杂,容易出错。相对于这个计算和学习的成本,其应用场景又较单一,一般仅用于装备强化或是占星猎命。

  但这个问题又必须有一个解决的方法,无论是用于面试还是满足项目的实际需求。通常,大部分数值策划,会选择编写VBA进行模拟运算,少部分人使用excel矩阵运算。前者通常不便于复用(少部分vba达人可以写出较通用的代码),后者要求具备一定的数学功底。

  于是,我推荐大家使用mathematica来解决这个问题。解答步骤仅3步,完整解答如下(详细步骤及解释见下文):

phpJ0exEK471.png

  4.解答步骤

  STEP1:

  列出状态转移矩阵:

phpJ0exEK496.png

  行的1~10代表抵达状态,第一列的1~10代表出发状态

  如图第2行第3列的值0.7,表示的是:从状态1状态2的概率是0.7(强化成功事件),状态1状态2的概率是0.3(强化失败事件)

  保证每一行的概率之和为1

  该矩阵表示每次强化只有成功和失败退回到指定等级这2种事件,可自行定义升级暴击等事件(有很小几率从1升到3之类)

  STEP2:

  在Mathematica中读取表格数据:

  xlsxPath = "C:\\Users\\Administrator\\Desktop\\屠龙刀强化.xlsx";

  m = Import[xlsxPath, "Data"][[1]][[16 ;; 25, 2 ;; 11]]

  第一行指定excel文档的路径

  第二行从指定excel读取数据,16;;25表示16~25行,2;;11表示2~11列(这是直接读取xlsx文件的写法,若使用mathematica link for excel加载宏,可以使用Excel[“A1:C1”]这种更好理解的语法)

  Mathemaitca读取表格数据截图:

phpJ0exEK963.png

  STEP3:

  定义一个马尔科夫过程:

  markovProcess = DiscreteMarkovProcess[1, m];

  DiscreteMarkovProcess(Mathematica内置的离散马科夫过程函数),接收2个参数:初始状态和状态转移矩阵

  赋值这个离散马科夫过程到变量markovProcess

  一句话的计算:

  Mean[FirstPassageTimeDistribution[markovProcess, 10]]

  Mean用于计算分布的期望值

  FirstPassageTimeDistribution是求首次通过指定状态的时间分布的函数,接受2个参数:马可夫过程和最终状态(这里的最终状态是10,)

  计算如下:

phpJ0exEK1284.png

  也可以求出在各状态的停留次数(1~9):

phpJ0exEK1307.png

  5.问题推广:

  在定义了马可夫过程之后,也可以进行模拟,如图模拟了10个分别强化10次的过程:

phpJ0exEK1355.png

  可以统计一下1000把屠龙刀分别强化10次后停留等级的分布:

phpJ0exEK1388.png

  也可以计算100次强化到+10的概率:

phpJ0exEK1410.png

  还可以计算每个等级不同的花费下,强化到+10的总费用,或是指定总费用,到达各等级的分布等等,有兴趣的同学可以自行研究。

  相关阅读游戏数值策划属性篇(一):关于属性设计的几点思考

via:GAD


屠龙刀强化.xlsx

10.62 KB, 下载次数: 518

1

主题

147

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2016-9-13 08:54:56 | 显示全部楼层
额。这么麻烦,那还不如手动去输入一下公式

概率计算也不麻烦,简单几个公式乘法公式运算一下就好

0

主题

88

帖子

1488

积分

金牌会员

Rank: 6Rank: 6

积分
1488
发表于 2016-9-13 09:15:23 | 显示全部楼层
这样算起来才能显得高深

1

主题

37

帖子

277

积分

中级会员

Rank: 3Rank: 3

积分
277
发表于 2016-9-13 09:15:58 | 显示全部楼层
故弄玄虚,而且也没解释清楚。

8

主题

48

帖子

233

积分

中级会员

Rank: 3Rank: 3

积分
233
发表于 2016-9-13 14:13:38 来自手机 | 显示全部楼层
mathemaitca矩阵运算怎么能比得上matlab,矩阵运算本来就产生了大量额外运算,用做转移矩阵的时间excel托表都做完了

0

主题

15

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2016-9-13 18:26:51 | 显示全部楼层
初始等级为1,强化到10:                                       
等级        成功率        失败后等级        消耗材料        强化次数        材料数量
1        70        1                       
2        60        1                       
3        50        1                       
4        40        2                       
5        30        3                       
6        25        4                       
7        20        5                       
8        15        6                       
9        10        7                       
10        最高级        最高级                93069.669       

Sub 初始为1模拟强化()
Dim data, i, 当前等级, r
    data = Range("h3:j12")
    Dim 模拟次数, 强化总次数 As Long
    模拟次数 = 1000
    For i = 1 To 模拟次数
        当前等级 = 1
        Do Until 当前等级 = 10
            强化总次数 = 强化总次数 + 1
            r = Rnd * 100
            If r < data(当前等级, 2) Then
                当前等级 = 当前等级 + 1
            Else
                当前等级 = data(当前等级, 3)
            End If
        Loop
    Next i
    Range("l12") = 强化总次数 / 模拟次数
End Sub


为什么我算出来的是90000多次?

0

主题

15

帖子

241

积分

中级会员

Rank: 3Rank: 3

积分
241
发表于 2016-9-14 15:17:58 | 显示全部楼层
。。。。没有VB大神么,问什么楼上算的结果和楼主的不一样????

0

主题

14

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2016-9-18 10:29:55 | 显示全部楼层
陶哥哥 发表于 2016-9-14 15:17
。。。。没有VB大神么,问什么楼上算的结果和楼主的不一样????

看你是模拟了1000把刀的强化
暂时看不出问题在哪

你可以尝试加一个判断,把强化次数超过150000的实验舍弃。因为这个已经是极端数据了其次就是加大一下模拟次数,1000还是偏少

0

主题

33

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2016-9-18 14:03:36 | 显示全部楼层
陶哥哥 发表于 2016-9-13 18:26
初始等级为1,强化到10:                                       
等级        成功率        失败后等级        消耗材料        强化次数        材料数量
1        70        1                        



Public Sub 求强化到加10期望()

Dim i, j, k, n As Integer

Dim NowLevel, TryCount, TotalCount

For n = 1 To 100
    NowLevel = 1
    TryCount = 0
    Do While NowLevel < 10
        If Rnd <= Range("J9").Offset(NowLevel - 1, 0).Value Then
            NowLevel = Range("H9").Offset(NowLevel - 1, 0).Value
            TryCount = TryCount + 1
        Else
            NowLevel = Range("I9").Offset(NowLevel - 1, 0).Value
            TryCount = TryCount + 1
        End If
    Loop
   
    TotalCount = TotalCount + TryCount
    Debug.Print n & "-" & TryCount

Next n


Debug.Print TotalCount / 100

End Sub



机器比较卡,我只算了100次,算出来也是9W多,这篇文章算出来的是错误的。
建议作者自己再重新算算,小编看到后把这篇文章下了吧。
这种东西骗骗GAD那帮傻缺还可以,gameres怕是有点难骗

9

主题

55

帖子

294

积分

中级会员

Rank: 3Rank: 3

积分
294
发表于 2016-9-18 15:54:56 | 显示全部楼层
陶哥哥 发表于 2016-9-13 18:26
初始等级为1,强化到10:                                       
等级        成功率        失败后等级        消耗材料        强化次数        材料数量
1        70        1                       

楼出算出来的也是 90000 左右啊。
难到是我看错了?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-24 08:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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