Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

経験値の要件

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

yuji_yasuhara
現在はUnityの中の人
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away