各レベルに比例してより多くのXPが必要な場合、合計XPから現在のレベルを計算するにはどうすればよいですか?


33

私のゲームでは、次のレベルに到達するために必要なXPは、現在のレベル×レベルのしきい値です。それを考慮して、これまでに獲得した合計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

XPが300の場合、レベル4に到達します。一般的にどのように計算できますか?


スタックオーバーフローに関連:sqrtを使用しない三角根の計算
ダミアンヤーリック

次のレベルに必要なXPの量は、現在のレベルが高くなるほど増加しませんか?
マスト

さて、あなたが答える必要がある最初の質問は、次のとおりです。各レベルの「しきい値」値は何ですか?あなたの例に基づいて、レベル4に到達するには300 XPが最小であると仮定すると、レベル3の後にしきい値が75に増加します。しきい値が上昇する頻度を決定したら、それを計算するアルゴリズムを考え出すことができます。 、他の人々が答えでやろうとしているように
-Taegost

3
Majteは計算方法については良い答えを提供しますが、「最良の」答えは単に計算することではありません....全体的なexpを保存するだけでなく、現在のレベルとXPデルタも保存します。デルタあなたがレベルアップするたびにリセットします(レベル、レベル+ 1、総XP、デルタXP)に簡単にあなたが使用/表示に必要な計算は何もあなたが必要なすべての情報を持っている
ジョンストーリー

@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

またXP、上記のXPの式を解くことにより、逆の操作を行い、任意のレベルに必要なものを計算できます。

XP=(Level2Level)×threshold2

上記の式は分数で機能しますが、次の整数値に切り捨てる必要があることに注意してください。たとえば、C ++ / C#では、(int)Levelを使用できます。

上記の閉じた形式の式を取得するために、差分方程式、ガウス和、および二次式を使用しました。

この式の解決に段階的に興味があるなら...

私たちは最終的に私たちの考察を始めることによって再帰的なアルゴリズムをします Experience(next_level) = Experience(current_level) + current_level*50

たとえば、を取得するには、次のようにします。XPLevel3

XPLevel3=XPLevel2+2×50

ここで2*50、次のレベルに到達するために必要な経験は現在のレベル* 50であるというOPの要求から来ています。

ここで、式に同じ論理を持つを代入します。あれは:XpLevel2

代用上記の式に:XPLevel2=XPLevel1+2×50

XpLevel3=XpLevel1+1×50+2×50

そして、私たちの開始点である、わずか50です。したがってXpLevel1

XpLevel3=50+2×50=150

より高いレベルと合計の有限連鎖を再帰的に計算するためのパターンを認識することができます。

XpLevelN=50+2×50+3×50+...+(N1)×50=i=0n1i×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)2N

最後に、すべてを片側に配置します。

0=N2N2×XpLevelN÷50

これは、負と正の解を生成する2次式になりました。負のレベルはないため、正の解のみが関係します。現在、次のものを取得します。

N=1+1+4×2×XpLevelN502

したがって、XPおよび線形しきい値を条件とする現在のレベルは次のとおりです。

Level=1+1+8×XP÷threshold2

これらの手順を知ることは、さらに複雑な進行を解決するのに役立ちます。RPG領域では、ここでの線形進行のほかに、実際にはより一般的な分数の累乗または二乗の関係、たとえば。ただし、ゲームの実装自体については、実行時に計算するのではなく、すべてのレベルの進行を事前に知っておくことが理想的であるため、このソリューションの最適性は低いと考えています。したがって、自分のエンジンでは、前処理済みのエクスペリエンステーブルを使用します。これは、より柔軟で、多くの場合より高速です。ただし、最初にこれらのテーブルを記述するか、単に取得する必要があるものを自問するために、この式はOPの特定の質問に答えることを目的とした最も迅速な方法を提供します。Level=XP5.0XPLevel 100

編集:この式は正常に機能しており、OPからの要求に応じて、現在のlevel条件をXP 線形しきい値進行で正しく出力します。(前の式は、プレイヤーがレベル0から開始したと仮定して「レベル+1」を出力しました。これは私の間違いでした。小さな休憩で書いて昼休みに解決しました!:)


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジョシュ

@JoshPetrieこの質問を後で見た私たちにとっての問題は、チャットリンクが壊れていることです。それを回復する方法はありますか?
マンド

@MAndは削除を取り消しましたが、あと8日ほどで再び自然に消えます。
ジョシュ

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関数に対して機能することです。必要に応じて、レベルごとに任意のexp値を作成し、テーブルに保存することもできます。

(何らかの奇妙な理由で)さらに高速なソリューションが必要な場合は、各レベルに到達するのに必要なexp の合計量を事前計算し、これをテーブルに保存し、バイナリ検索を使用してプレーヤーのレベルを見つけることもできます。事前計算には、レベルの総数に比例した時間がかかりますが、ルックアップには、レベルの数の対数に比例した時間が必要です。


4
最も柔軟なソリューション。また、1回限りの計算では速度は重要ではないため、最善の方法だと思います。
GameAlchemist

4
@Majte:おそらく十分に明確ではなかった。投稿されたソリューションに「何百万もの反復」が必要であることを示唆していません。私が言いたいのは、プレイヤーのレベルを毎秒何百万回も計算する必要がない限り、私の(ナイーブなブルートフォース)ソリューションは十分に速いということです。expの関数としてレベルの閉形式の数式を代数的に導出することに基づいた他のソリューションはさらに高速かもしれませんが、めったに呼び出されないコード(および、たとえば、1秒間に1,000回未満のコードの場合は、ここでは「まれ」)、目立った違いはありません。
イルマリカロネン

2
ああ、すみません。私はあなたに完全に同意し、あなたはレベルごとのユーザー定義の昇進ステップの素晴らしい代替手段を提供します。しかし、その後、おそらく前処理されたテーブルを使用します。
-Majte

2
このソリューションのシンプルさは、明確な勝者になります。可読性と保守性の価値を軽視しないでください。
モーゼル

1
コンピューターは、人間ではなく、単純なタスクを行うのが得意です。必要に応じて、コンピューターを犠牲にして、プログラマーである人々の生活を単純化したいと思います。このソリューションを使用すると、フォワードとリバースではなく、フォワードという1つのメソッドを記述するだけで済みます。最も単純なソリューションは、彼がコードに持っているものではなく、そのルックアップテーブルを構築することです。ラムは安いので、使ってください。
モーゼル

11

質問はコードで回答されましたが、数学で回答されるべきだと思います。誰かが単にコピーして貼り付けるのではなく、理解したいと思うかもしれません。

XPレベル+1=XPレベル+レベルしきい値

XP

XPレベル=レベル1レベルしきい値2

レベル

レベル=しきい値2+8XPしきい値2しきい値+12

(整数に切り捨て、プレイヤーは必要があるため、すべてを取得するために必要なXPを任意のレベルアップボーナスのを)


2
私はこの答えが好きです。明確かつ簡潔。
アルモ

ちょっとミック。再発関係をしてからしばらく経ちました。基本ケースも指定できなかったのでXP_Level(0) = 50、解決を避けることができましたか?利点、長所、短所はありますか?この答えに触れるといいと思います。+1
ヴォーンヒルツ

@VaughanHiltsあなたの表記がどのように機能するのか、あなたが何を求めているのかわからないので、gamedevチャットで私にpingを送ってください。
MickLH

コードの答えはこれよりずっと簡単だと理解しました。
ファラプ

@Pharapで作業を続けます。私が10代の頃、数学よりも簡単にコードを理解していましたが、経験と知識があれば、数学は人生のいたるところで明らかになります。
MickLH

10

基本的な代数を使用して問題を解決する1つの方法を次に示します。手順を気にしない場合は、最後までスキップしてください。

簡単に思いつくのは、レベルを指定すると、そのレベルを取得するために必要な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

これで、二次式を使用できます。

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を攻撃するつもりはないので、個人的にあなたの説明は読みやすいと思います。
イルマリカロネン

3

ここに含まれるすべての数学は、あらゆる種類の理由で知ることが非常に重要です。そのいくつかはゲーム開発に適用できます。

しかし

これはゲーム開発サイトであり、数学サイトではありません。アルゴリズムシリーズとしてでなく、セットとしてどのように機能するかを説明しましょう。これは、実際に販売するために開発するゲームのレベリングに適用される一種の数学であり、これがほとんど(すべてではない)の基礎となるシステムですシステム(少なくとも歴史的に)。

プレイヤーは覚えやすく、視覚化が容易な素敵な丸い数字を好む傾向があり、プレイヤーがレベルYに進むためにX量のxpを必要とするレベルベースのゲームシステムほど重要ではありません。

ラウンド番号を選択するのには、次の2つの理由があります。

  • レベルエクスペリエンス自体は、「100; 200; 1,000,000;など」という素晴らしいラウンド数です。
  • レベル間のデルタは、プレイヤーが頭を見て計算できる別の良いラウンド数になる傾向があります。

ラウンド数は楽しいです。ゲームの目的は楽しいことです。特にゲームのジレンマはしばしば設計上楽しいものではないため、快適性は重要です。

なぜこれを念頭に置くことが重要なのでしょうか?

ほとんどの複合シリーズアルゴリズムは、見栄えの良いラウンド数を生成しません

ほとんどのシリーズは、かなりの時点で止まりません(ここまで見てきたすべての答えは永遠に続くだけです)。どうしようか?概算し、ゲームシステムに適用するレベルのセット決定します

どの近似が適切であるかをどのようにして知ることができますか?ゲームシステム内でのレベリングのポイントを検討します。

ほとんどのゲームには、ある時点で機能するレベルキャップがあります。これにはいくつかの方法があります。

  • キャップは比較的早期に発生します。レベルシステムは、プレイヤーが完全なゲームシステムを学習するように集中的にゲームの第1フェーズを通過できるようにするためにのみ存在します。それらが「完全に成長」すると、ロングゲームが始まります。
  • XPの獲得VS難易度には一定の経済性がありますが、レベルキャップはありますが、レベルチャートのほぼ半分でプレイヤーがゲームを完了することが予想されます。複数のキャラクター/クラスを持つDQ / FFスタイルのRPG では、キャラクタークラスごとにレベルごとに必要なXPを変更するよりも、異なるレートで経験を積むことにより、異なるキャラクター/クラスを簡単にレベル調整することが一般的です。こうすることで、プレイヤーはかわいい小さなラウンド数を普遍的な目標として簡単に覚えることができ、各キャラクターがゲームシステム(XP + (XP * Modifier)または何でも)によって設定された任意のレートでそれらに向かって進むことを知ることができます。
  • レベルキャップは、外字のカテゴリに基づいています。つまり、ゲームシステム外の何らかの要因が、レベルシステムがどのように見えるかを決定します。これは、多くのゲームが有料で勝ちますが無料でプレイできるため、より一般的になっています。無料のプレイヤーはlvl 70で上限があり、加入者はlvl 80で上限があります。1回の購入で誰かが何らかの普遍的な上限を超えてレベルを上げることができます。
  • レベルキャップは普遍的であり、何らかの形でゲームの世界に結び付けられています。このシステムはWoWによって普及しています。
  • あなたが夢見るかもしれない他のレベルキャップシステムは、他のプレイヤーよりもあなたのメイクアップされた世界でより多くの時間を無駄にしてプレイヤーに報酬を与えるよりもスマートな方法でゲームプレイを強化します。

レベルキャップがなく、システムがアルゴリズムによって決定されるゲームシステムいくつかあります。通常、このようなシステムでは、Xのべき乗システムを使用して、数値をすばやく爆発させます。これにより、レベルL-1に到達するのが非常に簡単になります。ほとんどのプレイヤーはレベルLに到達し、レベルL + 1に到達するのは非常に難しく、プレイヤーはL + 2に到達する前に年をとり死んでしまいます。この場合、「L」は、プレイに適したターゲットレベルであり、通常はシステムに上限を設定するはずのレベルですが、XPの良いアイデアを永遠に考えるように人々を惑わせるオプションを残しておきます。(不吉!)この種のシステムでは、ここで見られる数学は完璧に理にかなっています。しかし、それは非常に狭く、実際のゲームではめったに遭遇しません。

どうしようか?

レベルとXPを計算しますか?いいえ。レベルとXPを決定しますか?はい。

レベルの意味を決定してから、使用可能なレベルのセットを使用可能にするかを決定します。この決定は、ゲームシステム内の粒度(レベル間でパワーに大きな違いがありますか?各レベルは新しい能力を授与しますか?など)およびレベルがゲーティングシステムとして使用されるかどうか(「できません」)レベル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ステートメント、ケース、または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」を1つの値として追跡し、プレーヤーが「to go」値を使い果たすか、それを超えると(どの方法でも)、これを1回計算してプレーヤーが実際にどこにいるかを把握しますで、それを保存し、次の「進む」から残りを差し引いて(XPの繰り越しが許可されている場合)を計算し、繰り返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.