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


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

#経験値の要件
よくあるRPGの例として。レベルアップによりプレイヤーは強くなるのですが、例えば
「レベル３からレベル４に上がるために必要な努力」
と、
「レベル30からレベル31に上がるために必要な努力」
を同じにしたい、と考えます。レベルをひとつ上げる努力をずっと同じにしないと、レベルアップの頻度を一定に保てませんから。（この時点で、単純な足し算引き算では値が出せないことに気がつきます）

また、ここではその努力を「戦闘」とし、戦闘で得られる報酬を「経験値」とします。
そして戦闘に勝利した際に
「自分のレベルより敵のレベルが低いときには経験値は少なめに」
「自分のレベルより敵のレベルが高いときには経験値は多めに」
もらえるものとします。そうしないと、弱い敵ばかりを相手にしていればどんどんレベルアップしてしまうことになってしまいますから。

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

#計算

・同じレベルの敵を何体倒すとレベルアップするか、というのは調整項目になりそうです。これを$K$としましょう。
・レベル１からレベル２になるのに必要な経験値、を固定して基準値にしましょう。これを$I$とします。
・倒したレベルが高いほど、多くの経験値を得られることにします。この倍率を$a$とします。

$a$を倍率とするのがポイントで、レベル１の敵を倒したときの倍率は１、レベル２の敵を倒したときは$a$倍、レベル３の敵を倒したときは$a^2$、・・・としていきます。例えばレベル１の敵を倒した際にもらえる経験値$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のプレイヤーが保持している経験値」ということになります。

#具体例
パラメータ：
・レベルアップのために同レベルの敵を倒す回数：5
・レベル差が１のときの倍率:1.5
・レベル１から２にレベルアップするのに必要な経験値: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}$（再掲）
です。レベル１の敵を倒して得られる経験値は常に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ゲームを作る上で必須となる、経験値の計算例を考えてみました。もちろん仕様に応じて計算式は異なるでしょうから、ゲームの企画屋さんなら導出できるようにしておく必要があるでしょう。ゲーム制作に数学が必要となる良い例と呼べるのではないでしょうか。