RPG 레벨 업 요구 사항에 맞게 조정 가능한 수식을 만드는 방법은 무엇입니까?


44

number_of_levels와 last_level_experience의 두 값을 변경하여 간단히 수정할 수있는 수식을 만들려고합니다. 이것은 게임을하는 사람들이 레벨링 요구 사항을 변경할 수 있도록하기위한 것입니다.

마지막 레벨 업에 필요한 XP 수를 지정할 수 있도록 준비했지만 첫 번째 레벨 업에 필요한 XP를 제어 할 수 있기를 원합니다.이 경우에는 크게 다를 수 있습니다. 예를 들어, 레벨이 40 개이고 마지막 레벨에 대해 1,000,000 XP 인 경우 첫 번째 레벨 업 요구 사항은 625입니다. 그러나 레벨을 80으로 변경하면 첫 번째 레벨 업은 156이됩니다. 두 경우 모두 마지막 레벨이 필요합니다. 1,000,000

이 두 가지 기본 값만으로 컴퓨터가 적절한 곡선을 만들 수있는 방법이 있어야합니다.

#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 곡선을 더 많이 제어하고 싶습니다. 실제 커브 자체를 제어하고 싶습니다.
Nicol Bolas

모더가 스크립트를 통해 레벨링을 제어하도록 허용 할 수 있습니다.
곤봉

답변:


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

두 개의 방정식, 두 개의 미지수. 이것은 좋아 보인다. 간단한 수학은 포기 A하고 B:

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
모든 답변만이 잘 계획되고 생각된다면.
Nate

여기의 곡선은 훨씬 맛있습니다.
Truncheon

좋은 대답입니다. 이것은 어리석은 질문 일지 모르지만 N위에서 설명한 것을 어떻게 계산 합니까? N플러그 가능 변수 를 만들 려면 어떻게해야 합니까? 이에 대해 별도의 질문을해야하는지 알려주십시오.
Daniel Kaplan

1
관계를 @tieTYT N하고 B있다 exp(B) = 1 + N, 또는 B = log(1 + N). 각 레벨을 필요로 할 경우에 따라서 예를 들어, 더 이전보다 15 %, 다음이 필요합니다 B = log(1 + 0.15) = 0.13976.
sam hocevar

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.