Edited at

一般的なRPGの経験値を計算してみる

レベルアップを重ねていくゲームがあったとしたら、そのレベル間の努力は均一にしたい、という要求が生まれますよね。今回はその要素となる経験値の計算をしてみましょう。


経験値の要件

よくあるRPGの例として。レベルアップによりプレイヤーは強くなるのですが、例えば

「レベル3からレベル4に上がるために必要な努力」

と、

「レベル30からレベル31に上がるために必要な努力」

を同じにしたい、と考えます。レベルをひとつ上げる努力をずっと同じにしないと、レベルアップの頻度を一定に保てませんから。(この時点で、単純な足し算引き算では値が出せないことに気がつきます)

また、ここではその努力を「戦闘」とし、戦闘で得られる報酬を「経験値」とします。

そして戦闘に勝利した際に

「自分のレベルより敵のレベルが低いときには経験値は少なめに」

「自分のレベルより敵のレベルが高いときには経験値は多めに」

もらえるものとします。そうしないと、弱い敵ばかりを相手にしていればどんどんレベルアップしてしまうことになってしまいますから。

以上が基本的な要件になります。


計算

・同じレベルの敵を何体倒すとレベルアップするか、というのは調整項目になりそうです。これを$K$としましょう。

・レベル1からレベル2になるのに必要な経験値、を固定して基準値にしましょう。これを$I$とします。

・倒したレベルが高いほど、多くの経験値を得られることにします。この倍率を$a$とします。

$a$を倍率とするのがポイントで、レベル1の敵を倒したときの倍率は1、レベル2の敵を倒したときは$a$倍、レベル3の敵を倒したときは$a^2$、・・・としていきます。例えばレベル1の敵を倒した際にもらえる経験値$E(1)$は

$E(1)=\frac{I}{K}$

となります。つまり$Le$を敵のレベルとすれば、それを倒したときは倍率$a$を考慮して

$E(Le)=\frac{I}{K}a^{Le-1}$

こうなります。

プレイヤーのレベルを$Lp$とします。まずは同じレベルの場合を考えて

$Lp=Le$

とし、同じレベルの敵を倒したときの経験値は

$E(Lp)=\frac{I}{K}a^{Lp-1}$

となります。$K$体の敵を倒すとレベルアップすることにしていたので、$K$をかけることで次のレベルアップに必要な経験値$Next$が得られます。

$Next=Ia^{Lp-1}$

これでレベルアップするのに必要な経験値が得られました。これは現在の経験値に加えて必要なぶんになるので、トータルでいくつになるかを算出しておきます。これは等比数列の和を求めれば良いので、

初項:$I$

公比:$a$

として、そのレベルで溜まっている経験値は等比数列の和の公式から

$M(L)=I\frac{1-a^{L-1}}{1-a}$

となります。これは言い換えれば「レベルLになるために必要な経験値の累計」または「レベルLのプレイヤーが保持している経験値」ということになります。


具体例

パラメータ:

・レベルアップのために同レベルの敵を倒す回数:5

・レベル差が1のときの倍率:1.5

・レベル1から2にレベルアップするのに必要な経験値:12

とします。

レベル
取得経験値
必要累積経験値
レベルアップに必要な経験値

1
2
0
12

2
4
12
18

3
5
30
27

4
8
57
41

5
12
98
61

6
18
158
91

7
27
249
137

8
41
386
205

9
62
591
308

10
92
899
461

11
138
1360
692

12
208
2052
1038

13
311
3090
1557

14
467
4647
2335

15
701
6982
3503

16
1051
10485
5255

17
1576
15740
7882

18
2365
23622
11823

19
3547
35445
17735

20
5320
53180
26602

21
7981
79782
39903

22
11971
119685
59855

23
17956
179540
89782

24
26935
269322
134673

25
40402
403995
202009

26
60603
606004
303014

27
90904
909018
454521

28
136356
1363539
681782

29
204534
2045321
1022672

30
306802
3067993
1534008

31
460203
4602001
2301013

32
690304
6903014
3451519

33
1035456
10354533
5177279

34
1553184
15531812
7765918

35
2329775
23297730
11648877

36
3494663
34946607
17473315

37
5241995
52419922
26209973

38
7862992
78629895
39314959

39
11794488
117944854
58972439

40
17691732
176917293
88458658

取得経験値は、該当レベルの敵(敵もそれぞれレベルを持っています)を倒したときの経験値で、つまり敵を倒して得られる経験値は自分のレベルと無関係、となります(そうでない計算式もあり得ると思います)。つまり敵の経験値はレベルから算出でき、

$E(Le)=\frac{I}{K}a^{Le-1}$(再掲)

です。レベル1の敵を倒して得られる経験値は常に2で、自分のレベルが高いとき(=レベルアップに必要な経験値が大きいとき)にそんな相手を倒しても嬉しくない、となり、企画意図どおりになります。

必要累積経験値はそのレベルのプレイヤーが保持している経験値の総量で、先ほどの式

$M(L)=I\frac{1-a^{L-1}}{1-a}$(再掲)

でできています。

レベルアップに必要な経験値は、式では

$Next=Ia^{Lp-1}$(再掲)

となります。


応用例

数値的に明らかになったので、少し応用してみましょう。あるレベルのプレイヤーが保持している経験値

$M(L)=I\frac{1-a^{L-1}}{1-a}$(再掲)

この式を$L$について解くと、

$L=\log_a { (1-\frac{M(L)}{I}(1-a))+1 }$

こうなります。(初出時に誤りがあり、修正ました。指摘いただいた Kawanji01 さんありがとうございます!)

これで、経験値をレベルで表すことができるわけです。逆算ができるわけなので、例えばセーブデータには、経験値を格納しておけばレベルの値そのものを格納しておく必要がない、とも言えます。(算出できる値を格納するのは冗長なので、バグになりやすい)


まとめ

RPGゲームを作る上で必須となる、経験値の計算例を考えてみました。もちろん仕様に応じて計算式は異なるでしょうから、ゲームの企画屋さんなら導出できるようにしておく必要があるでしょう。ゲーム制作に数学が必要となる良い例と呼べるのではないでしょうか。