経験値計算式を見つけましたが……

分かりやすく可搬性の高い必要経験値計算式はないか。試行錯誤の旅が続いていましたが、ついにバランスよさげな形を見つけました!

次のレベル経験値=(初期値×(1+(1÷(1+(現在レベル+(1÷引数A))×引数B)))^(現在レベル−1)×現在レベル

どこが分かりやすいんじゃ。

この式を見ても、どんなグラフになるのかは皆目見当が付きませんな。やってみるとこんな感じのグラフになります。2レベルに要する経験値が10で、100レベルまでの必要経験値。

  • 条件
    1. 初期値=10
    2. 引数A=0.1
    3. 引数B=0.05
現在LV 累積経験値 差分経験値 差分倍率
1 10 10
2 33 23 2.25
3 77 45 1.99
4 160 83 1.85
5 305 145 1.75
6 546 242 1.67
7 936 389 1.61
8 1544 608 1.56
9 2469 925 1.52
10 3844 1375 1.49
11 5846 2002 1.46
12 8705 2859 1.43
13 12718 4013 1.40
14 18263 5546 1.38
15 25817 7553 1.36
16 35968 10151 1.34
17 49440 13473 1.33
18 67116 17675 1.31
19 90055 22939 1.30
20 119526 29471 1.28
21 157030 37504 1.27
22 204331 47301 1.26
23 263488 59157 1.25
24 336887 73399 1.24
25 427273 90386 1.23
26 537790 110516 1.22
27 672011 134221 1.21
28 833982 161971 1.21
29 1028254 194272 1.20
30 1259925 231671 1.19
31 1534678 274753 1.19
32 1858819 324141 1.18
33 2239316 380497 1.17
34 2683837 444522 1.17
35 3200792 516954 1.16
36 3799361 598569 1.16
37 4489541 690180 1.15
38 5282174 792633 1.15
39 6188985 906811 1.14
40 7222612 1033627 1.14
41 8396641 1174029 1.14
42 9725633 1328991 1.13
43 11225150 1499518 1.13
44 12911789 1686639 1.12
45 14803198 1891409 1.12
46 16918103 2114905 1.12
47 19276327 2358224 1.12
48 21898808 2622481 1.11
49 24807616 2908809 1.11
50 28025969 3218353 1.11
51 31578240 3552271 1.10
52 35489970 3911730 1.10
53 39787876 4297906 1.10
54 44499854 4711978 1.10
55 49654985 5155131 1.09
56 55283534 5628550 1.09
57 61416952 6133418 1.09
58 68087869 6670917 1.09
59 75330094 7242224 1.09
60 83178602 7848509 1.08
61 91669534 8490932 1.08
62 100840178 9170644 1.08
63 110728964 9888785 1.08
64 121375444 10646480 1.08
65 132820283 11444839 1.07
66 145105237 12284954 1.07
67 158273139 13167902 1.07
68 172367876 14094737 1.07
69 187434371 15066495 1.07
70 203518558 16084187 1.07
71 220667363 17148805 1.07
72 238928678 18261314 1.06
73 258351332 19422654 1.06
74 278985073 20633741 1.06
75 300880537 21895463 1.06
76 324089217 23208680 1.06
77 348663442 24574226 1.06
78 374656346 25992903 1.06
79 402121835 27465489 1.06
80 431114561 28992727 1.06
81 461689894 30575333 1.05
82 493903887 32213993 1.05
83 527813247 33909360 1.05
84 563475308 35662061 1.05
85 600947994 37472686 1.05
86 640289793 39341799 1.05
87 681559723 41269931 1.05
88 724817305 43257582 1.05
89 770122526 45305221 1.05
90 817535813 47413288 1.05
91 867118002 49582189 1.05
92 918930306 51812304 1.04
93 973034285 54103979 1.04
94 1029491816 56457531 1.04
95 1088365064 58873248 1.04
96 1149716453 61351389 1.04
97 1213608636 63892183 1.04
98 1280104467 66495831 1.04
99 1349266972 69162505 1.04
100 1421159322 71892350 1.04
101 1495844805 74685483 1.04

式はもっと簡単にできるのかもしれませんが知りません。エクセル上で試しただけです。

メリット

この式には利点があります。

  • 上昇停止レベルを定める必要がない

ウィズでは13レベル以降の必要経験値が一定でしたが、それを考える必要がありません。

この式では、レベルが上がるごとに必要経験値の倍率が下がって1倍に近づいていきますが、1倍になることはありません。ですので、必要経験値は必ず前のレベルよりも上がります。もしくは整数に丸めた結果、同じ値になります。

いろいろ無理そうなこと

シンプルでいろいろなパターンに使えて、理解してもらいやすい式は今のところ見つかっておりません。たぶん無理なんだと思います。

上の式はツクールの出力結果を参考に試行錯誤した結果でありまして。ツクールと似てますが違います。

初代ウィザードリィのようなべき乗型を、必要値がレベル2>3の逆転現象なしに一行で表現することは不可能なんでしょうな。つまり、現在Desigeonが採用している「現レベル経験値+基礎値×1.7のNレベル乗」を一行で計算する方法。

数式で表すことは可能だろうけど、プログラム的にはループ処理になるはずです。こいつを一発で計算する方法があったら教えて下さいマシ(数列や行列を処理する関数があったとして、その関数の中でループしてたら一行処理とはみなしません。べき乗除く)。

Desigeonは、レベルアップのたびに必要経験値を保存することで累積の再計算を避け、処理速度の低下を防いでいる。千レベルになったとき、経験値をもらうたびに千回もループしてたんじゃ効率が悪すぎるので。

しかしこの方法には痛いデメリットがあります。

  1. 誤差が累積する
  2. レベルの変化が常に+1
    • レベルドレインを実装しづらい
    • 数レベル分を一気に上げづらい

私からするとウィズに近いこの方式はとてもバランス設計に使いやすい。だから、できれば公式に残したいんだけれども。

今のままではRPGには使いづらいです。

RPGツクールVX

RPGツクールVXの経験値計算式の考え方は、前レベルへの累積という形で計算を繰り返す方式になっているようです。その意味で現在のDesigeonとそれほど変わりません。(ツクールXPでは未確認)

4月5日追記:以下の式はちょっと間違ってます。機会あらばどこかで補足

必要経験値=現レベル経験値+現レベル経験値×(現レベル倍率×倍率A)

  • 現レベル経験値=初期値は設定次第。10といった値が割り当てられる
  • 現レベル倍率=初期倍率は1
  • 倍率A=設定次第。1未満。0.9といった値が割り当てられる

これも一行で計算する方法があるのかもしれないけど、私には分かりません。式は分かりやすい。

その他

あとは微分積分がわかる人に任せよう。

高校の時、RPGの経験値計算に興味を持っていれば、数学をもっとたくさん勉強したはずだ。そうなれば理数系に特化した学部に進学して、院に行くか違うところに就職して、結果、こうやってゲームを作ることもなかったに違いない。あれ?

……とにかく、何かいい案があればご一報を。

あと、前の記事ではちょっと勘違いしておりました。必要経験値が前のレベルよりも減るゲームは(例のウィズの3レベルを除いて)おそらくないので、グラフは必ず比例もしくは尻上がり型になります。あとは増え方が速いか、緩いか、というところに違いがあります。ウィザードリィは13レベルまで1.73倍ペースで上昇しますが(下級クラス)、ツクールは2倍くらいで始まって倍率が下降していきます。そういう違いがあるようです。

フリーウェアの『無限の迷宮』では、一気に10万レベルとか上げようとすると判定を止められなくなった記憶があります(実験ではひと晩待って16万レベルまで行きましたが、判定が続いていたので朝になってマシンを落としました)。

無限の迷宮ではレベルが上昇するにつれ、レベルアップの判定処理が重くなるようで、停止ボタン押下を拾うタイミングがシビアになっているせいかも。ひょっとしたら大ループの難しさが出ていたのかもしれません。

実際に10万レベルを上げる機会があるかは別にして、高レベルを想定するDesigeonのようなツールでは、ループに頼らず一行計算できる式を決めておいた方がいいだろうなと。