각 레벨에 비례하여 더 많은 XP가 필요한 경우 총 XP에서 현재 레벨을 계산하려면 어떻게해야합니까?


33

내 게임에서 XP는 다음 레벨에 도달하기 위해 Current Level × Level Threshold 입니다. 그렇다면 총 XP 에서 현재 레벨 을 어떻게 얻을 수 있습니까?


예를 들면 다음과 같습니다.

Level Threshold = 50
Current Level = 1

레벨 1에서 시작하여 레벨 2에 도달하려면 (1 × 50) = 50 XP 등이 필요합니다.

Level 1: 50 XP needed to reach level 2
Level 2: 100 more XP needed to reach level 3
Level 3: 150 more XP needed to reach level 4

즉, 진행률 테이블은 다음과 같습니다.

Level 1: 0 XP to 49 XP
Level 2: 50 XP to 149 XP 
Level 3: 150 XP to 299 XP
Level 4: 300 XP to 499 XP

300 XP를 사용하면 레벨 4에 도달합니다. 일반적으로 어떻게 계산할 수 있습니까?



다음 레벨에 필요한 XP의 양이 현재 레벨이 올라 갈수록 증가하지 않습니까?
돛대

글쎄, 당신이 대답해야 할 첫 번째 질문은 : 각 레벨의 "임계 값"값은 무엇입니까? 예를 들어, 300 XP가 최소 레벨 4에 도달하기위한 최소값이라고 가정하면 임계 값은 레벨 3 이후 75로 증가합니다. 임계 값이 증가하는 빈도를 결정하면 알고리즘을 계산하여 계산할 수 있습니다. , 다른 사람들이 그들의 답변에서하려고하는 것처럼
Taegost

3
Majte는 그것을 계산하는 방법에 대한 좋은 해답을 제공하지만, "가장 좋은"답변은 단순히 그것을 계산하는 것이 아니라 전체 지출을 저장하는 것뿐만 아니라 현재 레벨과 XP 델타도 저장하는 것입니다. 레벨을 올릴 때마다 델타를 재설정하고 필요한 모든 정보 (레벨, 레벨 +1, 총 xp, 델타 xp)를 사용하여 사용 / 표시해야하는 모든 것을 쉽게 계산하십시오
Jon Story

@JonStory 실제로. 누가 실제로 레벨을 항상 동적으로 계산 하기 때문에 나는 이것에 대해 조금 정교하게 설명 했습니까? 이 질문은 본질적 으로 수학 문제 일 뿐이며 , 게임 시스템 내에서 레벨의 역할을 전혀 고려하지 않기 때문입니다.
zxq9

답변:


33

수학을 연습하고 Level조건부 경험을 해결 XP하면 다음을 얻습니다.

Level=1+1+8×XP÷502

예를 들어, 의 플레이어 레벨은 무엇 입니까?XP=300

1+1+8×300÷502=4

요청대로.

또는의 수준은 XP = 100000무엇입니까?

1+1+8×100000÷502=63

보다 일반적으로 표현하면 레벨 1 임의 시작 임계 값 에 .

Level=1+1+8×threshold÷502

XPXP에 대해 위의 공식을 해결하여 역순으로 수행하고 주어진 수준에 필요한 것을 계산할 수도 있습니다 .

XP=(Level2Level)×threshold2

위의 수식은 분수와 함께 작동하지만 다음 정수 값으로 내림해야합니다. 예를 들어 C ++ / C #에서는 (int) Level을 사용할 수 있습니다.

위의 닫힌 형식 수식을 얻기 위해 차이 방정식, 가우스 합산 및 2 차 수식을 사용했습니다.

이 공식의 솔루션을 단계별로 관심이 있다면 ...

우리는 궁극적으로 고려 사항을 시작하여 재귀 알고리즘을 수행합니다. Experience(next_level) = Experience(current_level) + current_level*50 .

예를 들어, XPLevel3 우리가있다 :

XPLevel3=XPLevel2+2×50

어디에, 2*50 경험을 다음 수준에 도달하기 위해 필요한 것을 OP의 요청에서 비롯 현재 레벨 * 50입니다.

이제 우리는 X p L e v e l 2를 대체합니다XpLevel2 를 동일한 논리로 공식에 합니다. 그건:

대체 XPLevel2=XPLevel1+2×50위의 공식에 을 :

XpLevel3=XpLevel1+1×50+2×50

그리고 XpLevel1 은 50에 불과합니다. 이것이 우리의 출발점입니다. 금후

엑스이자형V이자형=50+2×50=150

더 높은 수준을 재귀 적으로 계산하기위한 패턴과 유한 한 합의 체인을 인식 할 수 있습니다.

엑스이자형V이자형=50+2×50+×50+...+(1)×50=나는=01나는×50

여기서 N은 달성해야 할 수준입니다. 레벨 N의 XP를 얻으려면 N을 풀어야합니다.

XpLevelN÷50=i=0n1i

이제 오른쪽은 단순히 1에서 N-1까지의 합산으로 유명한 가우시안 합산 으로 표현할 수 있습니다 . 금후N×(N+1)÷2N

XpLevelN÷50=N(N+1)÷2N

아니면 그냥

2(XpLevelN50)÷50=N(N+1)2

마지막으로 모든 것을 한쪽에 두십시오.

0=N2N2×XpLevelN÷50

이것은 이제 음과 양의 솔루션을 산출하는 2 차 공식이며, 음의 레벨이 없으므로 양의 솔루션 만 관련됩니다. 이제 다음을 얻습니다.

N=1+1+4×2×XpLevelN502

따라서 XP의 조건부 전류 레벨과 선형 임계 값은 다음과 같습니다.

Level=1+1+8×XP÷threshold2

참고이 단계를 아는 것이 훨씬 복잡한 진행 상황을 해결하는 데 유용 할 수 있습니다. RPG 영역에서는 여기에서와 같이 선형 진행 외에 실제로 더 일반적인 분수 힘 또는 제곱 관계가 표시됩니다 (예 : Level=XP5.0XPLevel 100 이 공식은 OP의 특정 질문에 대답하는 가장 빠른 방법을 제공합니다.

편집 :이 수식은 정상적으로 작동 하며 OP의 요청에 따라 선형 임계 값 진행 으로 현재 level조건을 올바르게 출력합니다 . (이전 공식은 플레이어가 실수 인 레벨 0에서 시작했다고 가정하여 "level + 1"을 출력했습니다. 작은 조직에 글을 써서 점심 시간에 해결했습니다! :)XP


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Josh

@JoshPetrie 나중에이 질문을 본 우리에게 문제는 채팅 링크가 끊어 졌다는 것입니다. 그것을 복구하는 방법이 있습니까?
MAnd

@M 그리고 삭제를 취소했지만 8 일 정도 지나면 다시 사라집니다.
Josh

25

그만큼 간단하고 일반적인 당신이 (당신이 할 경우, 당신이있어 초당 시간이 계산 수백만을 반복 할 필요가없는 경우 솔루션은 아마 뭔가 잘못하고), 루프를 사용하는 단지입니다 :

expLeft = playerExp
level = 1
while level < levelCap and expLeft >= 0:
    expLeft = expLeft - expToAdvanceFrom(level)
    level = level + 1

if expLeft < 0: level = level - 1     # correct overshoot

이 방법의 가장 큰 장점은 복잡한 수학을 필요로하지 외에, 그것은 작동한다는 것입니다 어떤 임의의 특급 당 수준의 기능. 원하는 경우 레벨 당 임의의 exp 값을 구성하여 테이블에 저장할 수도 있습니다.

더 이상한 해결책이 필요한 경우 각 레벨에 도달하는 데 필요한 비용을 미리 계산하고 테이블에 저장 한 다음 이진 검색을 사용하여 플레이어의 레벨을 찾을 수도 있습니다. 사전 계산에는 여전히 총 ​​레벨 수에 비례하는 시간이 걸리지 만 조회에는 레벨 수의 로그 에 비례하는 시간 만 필요 합니다.


4
가장 유연한 솔루션. 그리고 속도는 일회성 계산에 중요하지 않기 때문에 가장 좋은 것 같습니다.
GameAlchemist

4
@Majte : 아마도 나는 충분히 명확하지 않았다. 난 하지 게시 된 솔루션 중 하나가 "반복 수백만"요구 것을 시사한다. 내가 말하고자하는 것은 플레이어의 레벨을 초당 수백만 번 계산할 필요가 없다면 나의 (naïve brute-force) 솔루션은 충분히 빠르다는 것입니다. exp의 함수로서 레벨에 대해 대수적으로 닫힌 형태의 공식을 도출하는 다른 솔루션은 훨씬 빠를 수 있습니다. "희귀"), 눈에 띄는 차이는 없습니다.
Ilmari Karonen

2
오, 지금 알겠습니다. 죄송합니다. 나는 당신에게 전적으로 동의하며 당신은 레벨 당 사용자 정의 진행 단계에 대한 훌륭한 대안을 제공합니다. 그러나 아마도 전처리 테이블을 사용하십시오.
Majte

2
이 솔루션의 단순성은 확실한 승자가됩니다. 가독성과 유지 관리 성의 가치를 할인하지 마십시오.
Mauser

1
컴퓨터는 사람들이 아닌 정신적 인 일을 잘합니다. 필요한 경우 컴퓨터를 희생하여 사람의 삶, 프로그래머를 단순화하고 싶습니다. 이 솔루션을 사용하면 정방향과 역방향이 아닌 하나의 방법 만 작성하면됩니다. 가장 간단한 솔루션은 코드에서 사용하는 것이 아니라 해당 조회 테이블을 작성하는 것입니다. 램은 싸다, 그것을 사용하십시오.
마우저

11

질문에 코드로 대답했지만 수학으로 대답해야한다고 생각합니다. 누군가 복사하여 붙여 넣기 대신 이해 하고 싶을 수도 있습니다 .

: 시스템이 되풀이 관계에 의해 쉽게 설명됩니다.

XP수평+1=XP수평+수평문지방

XP

XP수평=(수평1)수평문지방2

우리는 위해 해결할 수있는수평:

수평=문지방2+8XP문지방2문지방+12

(정수로 잘라 내기, 플레이어가 필요하기 때문에 모든 얻기 위해 필요한 XP를 어떤 수준 업 보너스를)


2
나는이 대답을 좋아한다. 명확하고 간결합니다.
Almo

이봐 믹; 내가 되풀이 관계를 한 지 오래되었습니다. 우리는 또한 기본 사례를 지정할 수 없었으며 XP_Level(0) = 50해결을 피할 수 있습니까? 어떤 장점, 장점, 단점이 있습니까? 이 답변을 만지는 것이 좋을 것 같습니다. +1
Vaughan Hilts

@VaughanHilts 나는 당신의 표기법이 어떻게 작동하는지 또는 당신이 묻는 것이 확실하지 않다면, gamedev 채팅에서 저를 ping 해주시겠습니까?
MickLH

코드 응답이 이것보다 훨씬 쉽다는 것을 이해했습니다.
Pharap

@Pharap에서 계속 작업하십시오. 제가 십대 였을 때 저는 수학보다 코드를 더 쉽게 이해할 수 있었지만 경험과 지식을 통해 수학은 삶의 모든 곳에서 분명해집니다.
MickLH

10

기본 대수를 사용하여 문제를 해결하는 한 가지 방법이 있습니다. 단계에 신경 쓰지 않으면 맨 아래로 건너 뜁니다.

한 가지 쉬운 점은 레벨이 주어지면 해당 레벨 을 얻는 데 필요한 n총 경험치 e입니다.

e = sum from k=1 to n of (t(k-1))

t용어는 예제에서 레벨 당 필요한 XP의 증가-50를 나타냅니다.

산술 시퀀스 공식을 사용하여 위의 문제를 해결할 수 있습니다 ( sum identity ).

e = t/2 * n(n-1)

그러나 우리는 반대의 공식을 원합니다. 플레이어의 레벨은 전체 경험이 주어집니다. 우리가 정말로하고 싶은 것은 레벨을 해결하는 것입니다 n. 먼저 용어를 그룹화합시다.

n^2 - n - 2e/t = 0

이제 2 차 공식을 사용할 수 있습니다.

n = (1 + sqrt(1+8e/t))/2

최종 방정식 :

level = 0.5 + sqrt(1 + 8*(total experience)/(threshold)) / 2

1
답변 해주셔서 감사합니다. 그러나 임계 값을 다른 변수로 변경하려면 어떻게해야합니까? 50 대신 50000 또는 1000 0을 사용하고 싶습니다. 방정식을 어떻게 수정해야합니까?
JayVDiyk

2
예, 솔루션은 동일해야합니다. 누군가 관심이있는 경우 솔루션에 대한 단계를 제시하고 싶었습니다. @JayVDiyk-게시물을 편집합니다.
Chaosed0

나는 퇴근 후 전체 솔루션을 게시 할 것이라고 의견을 말한 것처럼 약간 건방진했습니다.) 괜찮습니다. 걱정하지 않습니다. 일반적인 대답은 정답을 참조하여 답변하고 범위를 기록하는 것입니다. 신경 마음, 그것을 해결하는 것을 좋아했습니다. 여기에 더 많은 질문이 게시되었습니다.
Majte

죄송합니다, 그 의견을 놓쳤을 것입니다. 당신이나 그와 비슷한 것에서 그것을 훔치려는 의도는 아니 었습니다. 다음에 염두에 두겠습니다. 귀하의 답변은 편집 후보다 더 철저합니다!
Chaosed0

1
+1; @Majte의 의도에 위배되지 않고 개인적으로 귀하의 설명을 더 읽기 쉽습니다.
Ilmari Karonen

3

여기에 관련된 모든 수학 은 모든 종류의 이유를 아는 것이 매우 중요 하며 그 중 일부는 게임 개발에 적용됩니다.

그러나

이것은 수학 사이트가 아닌 게임 개발 사이트입니다. 이러한 것들이 알고리즘 시리즈가 아니라 세트 로 어떻게 작동하는지 논의 해 봅시다. . 왜냐하면 실제로 판매하기 위해 개발할 게임의 레벨링에 적용되는 일종의 수학이기 때문입니다. 이것이 대부분의 레벨링의 기초가되는 시스템입니다. 시스템 (적어도 역사적으로).

플레이어는 기억하기 쉽고 시각화하기 쉬운 반올림 숫자를 선호하는 경향이 있으며, 플레이어가 Y 레벨로 나아 가기 위해 X 양의 xp가 필요한 레벨 기반 게임 시스템보다 더 중요한 곳은 없습니다.

라운드 숫자를 선택해야하는 두 가지 이유가 있습니다.

  • 레벨 경험 자체는 훌륭하고 둥근 숫자입니다. "100; 200; 1,000,000; 등"
  • 레벨 사이의 델타 는 플레이어가 눈으로보고 계산할 수 있는 또 다른 멋진 라운드 수인 경향이 있습니다 .

둥근 숫자는 즐겁습니다. 게임의 목적은 즐겁습니다. 유쾌함은 중요합니다. 특히 게임 딜레마는 디자인 상 유쾌하지 않은 경우가 많기 때문입니다.

이 점을 명심해야하는 이유는 무엇입니까?

대부분의 복합 계열 알고리즘은 좋은 둥근 숫자를 생성하지 않습니다.

대부분의 시리즈는 예쁜 시점에 멈추지 않습니다 (여기서 본 모든 대답은 영원히 계속됩니다). 그래서 우리는 무엇을합니까? 우리는 근사한 다음 게임 시스템에 적용 할 레벨 세트를 결정합니다. .

어떤 근사가 적절한 지 어떻게 알 수 있습니까? 우리는 게임 시스템 내에서 레벨링 포인트가 무엇인지 고려합니다.

대부분의 게임에는 레벨 캡이있어 어느 시점에서 시작됩니다. 이것이 가능한 몇 가지 방법이 있습니다.

  • 레벨 시스템은 플레이어가 완전한 게임 시스템을 배우도록 강요하는 집중된 방식으로 게임의 첫 단계를 통과 할 수 있도록하기 위해 레벨 시스템이 존재하는 비교적 초기에 발생합니다. 그들이 "완전히 자란"후에는 긴 게임이 시작됩니다.
  • XP의 난이도 vs 난이도는 어느 정도의 경제가 있습니다. 예, 레벨 한도가 있지만, 플레이어가 레벨링 차트의 절반 쯤에 게임을 완료 할 것으로 예상됩니다. 문자 / 클래스가 여러 개인 DQ / FF 스타일 RPG에서는 문자 클래스 당 각 레벨에 필요한 XP를 변경하는 것보다 다른 속도로 경험쌓아서 다른 문자 / 클래스를 쉽게 레벨링 할 수 있습니다 . 그렇게하면 플레이어는 귀여운 작은 반올림 숫자를 보편적 인 목표로 쉽게 기억할 수 있으며, 각 캐릭터가 게임 시스템에서 설정 한 임의의 속도 ( 또는 그 밖의 어떤 속도로)를 향해 진행한다는 것을 알 수 있습니다.XP + (XP * Modifier)
  • 레벨 캡은 외부 문자 범주를 기반으로합니다. 즉, 게임 시스템 외부의 일부 요소는 레벨 시스템의 모양을 결정합니다. 많은 게임이 P2P 게임이지만 무료 게임이기 때문에 더욱 일반적입니다. 무료 플레이어는 70 레벨에서 제한 될 수 있으며, 가입자는 80 레벨에서 제한 될 수 있으며, 일회성 구매는 일부 일반 캡 이상의 수준으로 누군가를 승진시킬 수 있습니다.
  • 레벨 캡은 보편적이며 어떤 식 으로든 게임 세계에 묶여 있습니다. 이 시스템은 와우에 의해 대중화되었습니다.
  • 다른 레벨 캡 시스템은 다른 플레이어보다 메이크업 월드에서 더 많은 시간을 낭비하여 플레이어에게 보상하는 것보다 똑똑하게 게임 플레이를 향상시키는 다른 레벨 캡 시스템입니다.

있습니다 거기에 어떤 수준의 캡없는 시스템이 알고리즘 결정되는 일부 게임 시스템. 일반적으로 이와 같은 시스템은 X-powers-of-Y 시스템을 사용하여 숫자가 빠르게 폭발하도록합니다. 따라서 L-1 레벨에 도달하는 것이 매우 쉬워지며, 대부분의 플레이어는 L 레벨에 도달하고 L + 1 레벨에 도달하기가 매우 어려울 것으로 예상되며 L + 2에 도달하기 전에 나이가 들면서 죽습니다. 이 경우 "L"은 플레이에 적합한 목표 레벨이며 일반적으로 시스템을 제한했을 것입니다. 그러나 사람들이 XP에 대한 좋은 아이디어를 영원히 생각할 수 있도록 옵션을 열어 둡니다. 이런 종류의 시스템에서 여기서 발견 된 수학은 완벽하게 이해됩니다. 그러나 실제 게임에서는 매우 좁고 거의 발생하지 않습니다.

그래서 우리는 무엇을합니까?

레벨과 XP를 계산 하시겠습니까? 아니요. 결정 수준과 XP를? 예.

어떤 레벨의 의미를 결정한 다음 사용 가능한 레벨 세트를 결정하십시오. 이 결정은 게임 시스템 내에서 세분성으로 귀결됩니다 ( 거대한 레벨 사이의 힘에 차이가 있습니까? 각 레벨이 새로운 능력을 부여합니까? 등)과 레벨이 게이팅 시스템으로 사용되는지의 여부에 따라 결정됩니다 ( "Ca n't 레벨 10이 될 때까지 다음 마을로 가십시오. "

이에 대한 코드는 매우 간단하며 범위 결정입니다.

level(XP) when XP < 100  -> 1;
level(XP) when XP < 200  -> 2;
level(XP) when XP < 500  -> 3;
level(XP) when XP < 1000 -> 4;
% ...more levels...
level(XP) when XP > 1000000 -> 70. % level cap

또는 if 문, case 또는 if / elif 체인 또는 사용중인 언어가 지원하는 언어 (이 부분은 모든 게임 시스템에서 가장 흥미로운 요소입니다. Erlang 모드에 있고 위의 구문이 모든 사람에게 명확하지 않을 수도 있습니다.) :

level(XP) ->
    if
        XP < 100  -> 1;
        XP < 200  -> 2;
        XP < 500  -> 3;
        XP < 1000 -> 4;
        % ...more levels...
        XP > 1000000 -> 70 % level cap
    end.

놀라운 수학인가요? 아뇨 세트 요소 결정의 수동 구현입니까? 네. 그것이 전부입니다. 그리고 이것은 제가 수년 동안 대부분의 게임에서 실제로 해왔 던 방식과 거의 같습니다.

부수적으로, 이것은 플레이어가 경험을 얻을 때마다 수행 해서는 안됩니다 . 일반적으로 "XP to go"를 하나의 값으로 추적하고 플레이어가 "to go"값을 소진하거나 초과하면 (어떻게하든) 플레이어가 실제로 어디에 있는지 파악하기 위해이 값을 한 번 계산합니다. 에서 저장하고 다음 남은 "빼기"에서 남은 금액을 뺀 값을 계산하고 (XP를 전달할 수있는 경우) 반복하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.