RPGレベルアップ要件に合わせて調整可能な数式を作成する方法は?


44

number_of_levelsとlast_level_experienceの2つの値を変更するだけで変更できる数式を作成しようとしています。これは、ゲームを改造する人がレベリング要件を変更できるようにするためです。

最後のレベルアップに必要なXPの数を指定できるようにしましたが、最初のレベルアップに必要なXPを制御できるようにしたいので、この場合は大きく異なります。たとえば、40のレベルがあり、最後のレベルに1,000,000 XPがある場合、最初のレベルアップ要件は625になります。しかし、レベルを80に変更すると、最初のレベルアップは156になります。 1,000,000。

これらの2つの基本値だけを与えて、コンピューターに適切な曲線を作成させる方法が必要です。

#include <iostream>

int main()
{
    int levels = 40;
    if (levels < 2) levels = 2;

    int experience_for_last_level = 1e6;
    float fraction = 1.0 / levels;

    {
        int i = 0;
        float fraction_counter = fraction;
        int counter = levels;
        int total = 0;

        for (i = 1; i <= levels; ++i, fraction_counter += fraction, --counter)
        {
            int a = static_cast<int>(fraction_counter * experience_for_last_level / counter);

            std::cout <<"Level "<<i<<":  "<<a<<" ("<<counter<<")"<<"\n";

            total += a;
        }

        std::cout << "\nTotal Exp: " << total;
    }
}

出力:

Level 1:  625   (40)      Level 15: 14423  (26)      Level 29: 60416  (12)
Level 2:  1282  (39)      Level 16: 16000  (25)      Level 30: 68181  (11)
Level 3:  1973  (38)      Level 17: 17708  (24)      Level 31: 77499  (10)
Level 4:  2702  (37)      Level 18: 19565  (23)      Level 32: 88888  (9)
Level 5:  3472  (36)      Level 19: 21590  (22)      Level 33: 103124 (8)
Level 6:  4285  (35)      Level 20: 23809  (21)      Level 34: 121428 (7)
Level 7:  5147  (34)      Level 21: 26250  (20)      Level 35: 145833 (6)
Level 8:  6060  (33)      Level 22: 28947  (19)      Level 36: 179999 (5)
Level 9:  7031  (32)      Level 23: 31944  (18)      Level 37: 231249 (4)
Level 10: 8064  (31)      Level 24: 35294  (17)      Level 38: 316666 (3)
Level 11: 9166  (30)      Level 25: 39062  (16)      Level 39: 487499 (2)
Level 12: 10344 (29)      Level 26: 43333  (15)      Level 40: 999999 (1)
Level 13: 11607 (28)      Level 27: 48214  (14)
Level 14: 12962 (27)      Level 28: 53846  (13)

13
基本的な問題は、そのレベルのXPを必要とする最終レベルで終わるXPレベル曲線が無限に多いことです。XPをレベルごとにどのように変更するを指定していないため、問題の次元を制限していません。指数関数的な成長曲線が必要ですか?放物線状の成長曲線?線形のものですか?問題は現在の状態では解決できません。個人的に、もしゲームを改造していたら、最後のレベルの数字や最後のレベルのXPよりも、XP曲線をもっと制御したいと思うでしょう。実際の曲線自体を制御したいと思います。
ニコルボラス

改造者がスクリプトを使用してレベリングを制御できるようにします。
警棒

回答:


71

それらを選択する方法は無限にありますが、レベリングカーブは次のようなべき乗則に従うのが一般的です。

f(level) == A * exp(B * level)

この式の主な利点は簡単に説明できます。特定のルールには、各レベルのコストが前のレベルよりもNパーセント高い固定値Nがあります

初期変数により、次の制限が追加されます。

f(1) - f(0) == experience_for_first_level
f(levels) - f(levels - 1) == experience_for_last_level

2つの方程式、2つの未知数。これはよさそうだ。簡単な数学が与えるAB

B = log(experience_for_last_level / experience_for_first_level) / (levels - 1);
A = experience_for_first_level / (exp(B) - 1);

次のコードが生成されます。

#include <cmath>
#include <iostream>

int main(void)
{
    int levels = 40;
    int xp_for_first_level = 1000;
    int xp_for_last_level = 1000000;

    double B = log((double)xp_for_last_level / xp_for_first_level) / (levels - 1);
    double A = (double)xp_for_first_level / (exp(B) - 1.0);

    for (int i = 1; i <= levels; i++)
    {
        int old_xp = round(A * exp(B * (i - 1)));
        int new_xp = round(A * exp(B * i));
        std::cout << i << " " << (new_xp - old_xp) << std::endl;
    }
}

そして、次の出力:

1 1000          9 4125          17 17012        25 70170        33 289427
2 1193          10 4924         18 20309        26 83768        34 345511
3 1425          11 5878         19 24245        27 100000       35 412462
4 1702          12 7017         20 28943        28 119378       36 492389
5 2031          13 8377         21 34551        29 142510       37 587801
6 2424          14 10000        22 41246        30 170125       38 701704
7 2894          15 11938        23 49239        31 203092       39 837678
8 3455          16 14251        24 58780        32 242446       40 1000000

12
すべての答えがこのようにうまく計画され、考え出された場合。
ネイト

ここの曲線は、はるかに口当たりが良いです。
警棒

いい答えだ。これはばかげた質問かもしれませんが、上で説明したことをどのように計算Nしますか?Nプラグ可能な変数を作成したい場合はどうしますか?これについて別の質問をする必要があるかどうかを教えてください。
ダニエルカプラン

1
関係を@tieTYT NBexp(B) = 1 + N、またはB = log(1 + N)。あなたは、各レベルが要求したいのであれば例えば以上前のものより15%を、あなたが必要となりますB = log(1 + 0.15) = 0.13976
サムホセバー

18

曲線を計算した後、数値を丸めることを忘れないでください。次のレベルに到達するために119,378の経験値が必要だとプレイヤーに伝えるのはあまり意味がありません-その人は常に「およそ120,000」と理解するからです。したがって、自分で丸めを行い、プレイヤーに「クリーン」な結果を提示する方が良いでしょう。たとえば、次のコード(Sam Hocevarの拡張)は、有効桁数≈2.2に切り上げようとします(明らかに、定数は必要に応じて調整できます)。

from math import exp, log

levels = 40
xp_for_first_level = 1000
xp_for_last_level = 1000000

B = log(1.0 * xp_for_last_level / xp_for_first_level) / (levels - 1)
A = 1.0 * xp_for_first_level / (exp(B) - 1.0)

def xp_for_level(i):
    x = int(A * exp(B * i))
    y = 10**int(log(x) / log(10) - 2.2)
    return int(x / y) * y

for i in range(1, levels+1):
    print( "%d:  %d" % (i, xp_for_level(i) - xp_for_level(i-1)) )

出力は次のとおりです。

1:  1000     9:  4200     17:  17100    25:  70000     33:  287000
2:  1190    10:  4900     18:  20300    26:  84000     34:  340000
3:  1420    11:  5900     19:  24200    27:  100000    35:  420000
4:  1710    12:  7000     20:  28700    28:  119000    36:  490000
5:  2030    13:  8400     21:  34000    29:  142000    37:  590000
6:  2420    14:  10000    22:  42000    30:  171000    38:  700000
7:  2870    15:  11900    23:  49000    31:  203000    39:  840000
8:  3400    16:  14200    24:  59000    32:  242000    40:  1000000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.