随着春节假期日益临近,SIF也公告了将开启为期3天的10倍经验活动。本文将以Excel为主要工具,通过已知的经验公式,计算在不同等级、不同打歌次数情况下,最终能到的等级以及花费的爱心数。
1. 计算背景与设定
1.1 计算背景
在SIF中,每次打歌均需要消耗体力(LP),体力会随着时间自然恢复(10LP/h),也可以直接通过花费爱心进行补充,每颗爱心将获得当前LP上限数量的体力。例如,当前体力为80点,体力上限为120点,则花费爱心后,体力将补充120点,即200点。
每次打歌则可以获得一定量的奖励,包括经验(EXP)。当经验获取达到该等级上线后,用户等级(Level)将会增加一级,同时自动恢复一整条的体力(效果等同花费1颗爱心)。
在打歌时,可以自由选择消耗倍率:1倍~4倍。在4倍消耗模式下,体力消耗为4倍,获取的奖励也会增加为4倍。
正常情况下,升级需要的经验数需要打几十首歌曲(1倍消耗)甚至更多来完成。而为了使玩家快速升级,游戏内也会不定期开展10倍经验活动,即在同样的体力消耗下,经验获取数量将提升为原来的10倍,这样就可以在仅游玩少数歌曲的情况下实现快速升级。我们的目标任务就是:
计算在不同等级、不同打歌次数时,最终能达到的等级数和花费爱心数,并以表格的形式展示出来。1.2 基本设定
为完成这些任务,我们需要了解如下的内容与设定:
- SIF中新账号即为2级,此时体力上限为26,之后每2级提升1点体力上限。300级后,更改为每3级提升1点体力上限;
- 在不同等级(Lv)下,升级所需经验(Exp)为:
Exp(Lv) = 34.45*Lv - 551, when Lv <= 1000
,为线性增长Exp(Lv) = 1550.006*(Lv-1000)^2 - 1515*(Lv-1000) + 34400, when Lv > 1000
,为二次增长
- 一首歌在1倍消耗下,需要花费25点体力,并获得83点经验;
- 为最大化效率,打歌均按4倍消耗计算,同时不考虑体力恢复。
2. 问题分析与求解
2.1 公式转换
首先我们需要给出体力上限(LP)和等级(Lv)的关系。根据1.2中的基本设定,我们不难推出:
LP(Lv) = 24 + Round((Lv+1)/2), when Lv <= 300
LP(Lv) = 75 + ROUND((Lv-1)/3), when Lv > 300
这样,我们可以很容易在Excel中给出升级所需经验(Exp)和体力上限(LP)与等级(Lv)之间的关系。
接下来我们需要计算得到在10倍经验下升1级需要花费爱心的数量。由于10倍经验+4倍消耗时,100体力可以得到83*4*10=3320
经验,显然该式子应为:
Loveca(Lv) = Exp(Lv)/33.2/LP(Lv) - 1
最后减1的原因是升级后会自动补充1颗爱心的体力。
2.2 基本数据集
经过上面的分析,我们可以在Excel中建立一个Sheet,名为基本数据集
用于存放计算所需要的基本数据集,如图所示:
以第2行为例,公式在如下表格中给出:
列 | 含义 | 公式 |
---|---|---|
A(n) |
等级(Lv) | - (手动输入) |
B(n) |
升级所需经验(Exp) | =ROUND(0.522*A(n)*(A(n)+1),0) |
C(n) |
体力上限(LP) | =24+ROUND((A(n)+1)/2,0) |
D(n) |
升级累积经验(AccExp) | =D(n-1)+B(n-1) |
E(n) |
升级花费爱心(Loveca) | =B(n)/33.2/C(n)-1 |
F(n) |
升级累积花费爱心数 | =F(n-1)+E(n-1) |
该部分公式很容易理解,不做赘述。
2.3 表格制作
2.3.1 获取指定等级的基本数据
下面我们使用一个新的Sheet,来整理特定等级、特定次数下的速查表,名为十倍非传统升级指南
。这里我们需要用到Excel中的两个重要函数:
MATCH(lookup_value, lookup_array, [match_type])
:作用是在指定的数据集(lookup_array)中,寻找指定元(lookup_value)。匹配模式可以选择0(精确匹配)、1(不大于该值的最小值,要求升序)、-1(不小于该值的最大值,要求降序)。其返回值为在该数据集中的位置。OFFSET(reference, rows, cols, [height], [width])
:作用是从指定的位置(reference)进行偏移,偏移量为rows行和cols列。
在指定等级下(例如100),我们可以通过下列公式得到该等级对应的基本信息:
B4=OFFSET(基本数据集!$B$1,100-1,0)
注意,这里我们默认了100级的数据在基本数据集Sheet
中的第100行,因此我们只需要从基本数据集指定列的第一行开始,偏移100-1=99
行0
列,即可找到100级对应的基本数据。
2.3.2 计算游玩特定次数后的等级
由于在基本数据中,我们计算了到指定等级后的累积经验,因此在游玩k次后,获得的总经验为:
AccExp(Lv, k) = AccExp(Lv) + 3320k
此时,我们只需要去看AccExp(Lv, k)
在我们的累积经验表中,哪一级的累积经验是小于等于该值的最大值,即找到了游玩特定次数后的等级,即
Lv'(Lv, k) = argmax(Lv', AccExp(Lv') <= AccExp(Lv, k))
升级所需的累计花费爱心数即为
AccLoveca1(Lv, k) = AccLoveca(Lv') - AccLoveca(Lv)
除此以外,由于最后一级未能升级,但是仍旧进行了游玩,因此可能造成额外的Loveca花费,这部分的数量为:
AccLoveca2(Lv, k) = (AccExp(Lv, k) - AccExp(Lv')) / 33.2 / LP(Lv')
最终花费的爱心总和为:
AccLoveca(Lv, k) = AccLoveca1(Lv, k) + AccLoveca2(Lv, k)
2.3.3 计算示例
由于公式较为繁琐,我们举一个例子来说明。假设我们目前是100级,计划打50次歌曲。那么:
- 100级对应的基本数据为:
Exp(100) = 2894
,LP(100) = 75
,Loveca(100) = 0.16
,AccExp(100) = 121667
,AccLoveca(100) = -34.98
。 - 打歌50次后,对应的总经验值为:
AccExp(100, 50) = 121667 + 3320 * 50 = 287667
。 - 查表,发现145级对应的总经验值为286003,因此打歌50次后应该升级到145级,对应的基本数据为:
Exp(145) = 4444
,LP(145) = 97
,Loveca(145) = 0.38
,AccExp(145) = 286003
,AccLoveca(145) = -22.47
。 - 升级过程中,总消耗爱心数为:
AccLoveca(145) - AccLoveca(100) = 12.51
。 - 最后一级打歌过程中,实际多打了
AccExp(100, 50) - AccExp(145) = 1664
经验,该部分经验如果用爱心来打,需要花费的爱心数为:1664 / 33.2 / LP(145) = 0.52
- 最终我们计算得到总共花费的爱心数为:
12.51 + 0.52 = 13.03
即共计花费爱心13颗,最终等级为145级。
2.3.4 Excel编写
通过上述分析,我们可以将该过程转化为Excel公式:
列 | 含义 | 公式 |
---|---|---|
A(n) |
等级 | - (手动输入) |
B(n) |
累积经验 | =OFFSET(基本数据集!D1,十倍非传统升级指南!A(n)-1,0) |
C(n) |
50次后等级 | =MATCH(B(n)+3320*50,基本数据集!D:D,1) |
D(n) |
对应等级累积经验 | =OFFSET(基本数据集!D1,十倍非传统升级指南!C(n)-1,0) |
E(n) |
升级吃心 | =OFFSET(基本数据集!F1,十倍非传统升级指南!C(n)-1,0)-OFFSET(基本数据集!F1,十倍非传统升级指南!A(n)-1,0) |
F(n) |
最后一级吃心 | =(B(n)+3320*50-D(n))/33.2/OFFSET(基本数据集!C1,十倍非传统升级指南!C(n)-1,0) |
最终我们的成果如下:
另外最后附上excel:十倍经验速查表