キャップ付きの単純な減少リターン


19

問題

プレイヤーは、レベル80までのレベルごとに5ポイントを最大400で獲得します。配布できる統計は5つあり、統計に追加できる上限はありません。

  • 耐久
  • 知能
  • 機敏
  • 運-クリティカルチャンスとクリティカルダメージを付与する

幸運を言うと、減少する回帰方程式を実装したいと思います。クリティカルチャンスについては、プレイヤーが100%のクリティカルチャンスにヒットすることを望みません。

ますます減少する成長が追加されたポイントごとに0に近づくにつれて、到達する上限があります。

たとえば、プレイヤーに与えたい最大クリティカルチャンスが40%の場合、運が上がるたびにクリティカルチャンスが徐々に増加し、クリティカルチャンスが40%に達するまで続きます。これにより、1運で非常にわずかな量が得られます。

解決策はありますか?ありがとう、あなたの助けは大歓迎です!


RPGダメージフォーミュラの開発方法の可能な複製- TL; DRは、あなたが探しているキーワードであるシグモイド曲線
BlueRaja -ダニーPflughoeft

@BlueRaja重複していないと思います。この質問は、一般に、戻り関数の減少に関するものです。つまり、損傷計算に関するものです。それが起こると、その答えは主に減少戻り関数について説明しましたが、質問はまだ明らかに異なっていると思います。
アンコ

回答:


30

漸近関数から始めたいと思います。つまり、ある番号から開始してa別の番号bに近づくが、実際に到達することはありません。との場合a = 0、おそらく最も簡単になりb = 1ます。この方程式を取り、キャラクターが持っている統計ポイント(幸運ポイント)の数を入力し、出力として実際の統計値(クリティカルチャンス)を取得します。

非常に簡単な例はy = x / (x + n)、どこにn正の定数があるかです。ここでxあなたがSTATポイント数にフィードあなたの入力は、あり、そしてyあなたは、最終的なSTAT値を取得し、あなたの出力、です。

n = 5それがどのように見えるかをチェックしてください:

y=x/(x+5) plot for x in [0,100]

あなたがフィードするとき、x = 0あなたは得るがy = 0、あなたがどれほど大きくx入れても、y決して1に達することはない。完璧。

今、あなたはあなたの心の欲望にこれを調整することができます。スケールファクターを乗算して、「キャップ」を任意の値に設定できます。y = a * x / (x + 5)。上限を40%にするには、4を掛けます。y = .4 * x / (x + n)。あなたが養うとき今xs「は、y増加しますが、それはかなり0.4に到達することはありません。

調整nして、方程式の立ち上がり速度を設定します。n = 100よりもはるかに遅く増加しますn = 5

y=x/(x+100) plot for x in [0,400]

n特定の数の統計ポイントで達成したい統計値が必要であることがわかっている場合、この方程式を解くことができます。キャラクターが幸運の100ポイントで35%のクリティカルチャンスを持つべきだとしましょう。解決.35 = .4 * 100 / (100 + n)のためのn利回りn = 14.29

これらの数値も生の定数である必要はありません。たぶん、他の統計がの値の計算に入りますn。一部のキャラクターは異なるを持っているnため、「優先」統計のスケーリングが向上しています。

異なる形の曲線やより複雑な曲線が必要な場合は、漸近関数の他の多くの例も使用できます。あなたが望むようにそれを探検するためにあなたを残すでしょう


3
私のお気に入りの曲線は指数曲線です。各レベルで残りのプールの固定比率を取るだけです。
ジョンドヴォルザーク

完全を期すために@JanDvorak、例を提供できますか?指数曲線はたくさんあり、読者は前のコメントだけからあなたの提案を適用する方法を知らないかもしれません。
アダム

これは良い出発点であり、数学はよく説明されていますが、見栄えの良い関数を選ぶことはできないことに注意してください。この問題には、慎重な検討と多くの調整が必要です。たとえば、この方法の欠点の1つは、専門化の落胆です。5つの統計すべてが同等に実行可能な場合、最も開発されていないものに費やされたポイントが最も価値があります(最も開発されたものが最も少なくなります)。理想的なビルドは、ポイントの均等な分配であり、プレーヤーがそれらをどのように使用するかについての選択をより面白くないものにします。
マルクストーマス

@MarcksThomas属性間の相乗効果、または属性を戦術的に分離してそれで「勝つ」能力を前提としない。例として、敵に到達する前に敵が死ぬまで敏g性を向上させる驚くべき射手を想像してください。強度を伴う別の戦術も同様に効果的である可能性があるため、属性は「等しい価値」のものですが、戦術はしばしば専門性が支配的であることを意味します。属性システムがスペシャライゼーションにも報いる場合、ゲームは分岐します。
Yakk

これを「袋から石を引く」システムと呼びます。値P = x/(x+n)は、黒の石がn個、白い石がx個ある袋が与えられた場合、袋のブラインドから白い石を引き出す確率です。あなたができる1つのアプローチは、クリティカルセットをX =あなたの運、N =彼らの運を設定することです。敵と同じ運があれば、クリティカルする確率は50%です。ベースチャンスを10%にしたい場合は、X =あなたの運、N = 9xの運です。
Yakk

10

適切なベースはarctan、原点を通過して水平漸近線を示すため、などの関数になります。

アークタン

で、それを拡大縮小40 / (pi/2)、または80/piご希望の限界のために。次に、変換luckして、必要な曲線の急峻度を取得します。

critical = 80/pi * arctan(f(luck))

8

Soulsゲームがこの問題に取り組む方法が本当に好きです。提案されているように、各統計が連続関数に基づいてボーナスを付与するのではなく、区分線形関数でボーナスを付与します。

私は頭の上の正確な数字を思い出せませんが、関数は次の行に沿っています(各統計には独自の定数があります)

{0 <= x <20:y = 4x、20 <= x <30:y = 3x + 20、30 <= x <40:y = 2x + 50、40 <= x <60:y = 1x + 90 、60 <= x:y = 0.5x + 120}

プロット

この方法は、デザイナーとプレーヤーに多くの利点を提供します。デザイナーは、スキルのポイントごとの正確な利益をかなり簡単に調整できるので、プレーヤーは、レベルごとにどれだけの利益が得られるかを正確に知っているので利益があります。

連続関数の場合、一部のレベルでは、測定のエイリアシングにより数値に反映されない利点が得られる場合があります。最後のレベルではボーナスXYZが0.9増加しましたが、実際の値は23.52から24.42になり、表示する前に数値を四捨五入したため、プレーヤーは何かが変わったことに気付きません。

UXの観点からは、区分的線形関数を使用することをお勧めします。ただし、連続関数を使用すると、プレイヤーはラウンド定数に結び付けられないため、後で調整するのが簡単になります。


1
多くの数学を必要とせず、変更が簡単な曲線の近似。私はそれが好きです。:)
ケーシークボール

>あなたは前にそれを表示するに番号を丸める =>補償する一つの方法はにあるの増加量加える前に、およびSTATレベル整数のみを許可します。または、誤ってソフトキャップを超えないようにします。ceilfloorx <= 0: x = 1
ボブ

1
ピース単位の機能は引き続き実行できますが、ここで探している効果はありません。運の値はパーセンテージで、最大400の評価があります。これは、100%の運の線形関数であっても、すべての評価ポイント 1%未満の値の増加をもたらす必要があることを意味します。トリックは、y(399)がy(400)と異なる十分な小数点を表示することです。関数はyを非常に大きくすることで同じことを行うため、増加は常に不可欠です。x = 40では、yはxの値の4倍以上です。
MichaelS

@MichaelS Dark Soulsで使用されている関数のタイプの例を挙げました。適用される状況に応じて異なるバランスを取る必要がありますが、私のポイントは、プレイヤーがアークタンジェント曲線や円錐曲線よりも区分線形関数の効果をはるかに容易に理解することです。
カスライ

3

Jan Dvorakはコメントで指数関数を指摘しています。ここで説明します。

指数(およびトリガ)演算は、平方根演算よりも計算コストがかなり高く、それ自体が基本的な数学よりもはるかに悪いことに注意してください。したがって、これらの計算を1秒間に何回も行う場合は、おそらくAdamのアプローチをお勧めします。プレイヤーのレベル、装備の変更などで値を計算するだけの場合、速度は重要ではないので、最適な曲線が得られるものを使用してください。

指数関数は、ベースBからパワーxまでy=B^xです。数学者は一般にeの基数(〜= 2.718)を使用しますが、必要に応じて2または10を使用できない理由はありません。

y=e^x 次のようになります。 y = e ^ x

私たちが行うことによって、x軸を反転させることができますのでお知らせ左側が0にasympotically動いているy=e^(-x)が、それはまだ1から0まで下降だと我々はそれが上昇します。そのため、y=-を使用してy軸で反転できe^(-x)ます。今から-1 0にそれの上昇は、我々が得るために1を追加することができますy=1を- e^(-x)、それが0から1まで昇順ます。

y = 1-e ^(-x)

ここからは、縦横にスケーリングするだけです。全体に何らかの値を掛けることができます。それをAと呼び、漸近的な制限を設定します。次に、xに変化率の値kを掛けて、限界に近づく速度を調整できます。

これにより、最終的な方程式が得られy=A*(1 - e^(-k*x))ます。値を使用するk=0.012A=0.5、我々は50%に制限を設定し、それはかなり近いという制限の周りに取得させることができますx=400

y = 0.5 *(1-e ^(-0.012 * k))

これで、これにいくつかの調整を加えることができます。私が行った調整の1つはに変更したA=0.5041ため、小数点以下2桁(32.23%など)のパーセンテージに丸めると、y(399)= 49.99%およびy(400)= 50.00%になります。y(347)以降では、0.01%の変化を得るために2ポイントを要する場所がいくつかあります。しかし、その最後の可能性のあるポイントは、依然として(ほとんど)目に見える利益をもたらし、それをさらに50%にもたらします。

または、k値を微調整して同様の効果を得ることができます。でk=0.02305、で49.99パーセントに値ラウンドy=399とで50.00パーセントy=400。ただし、このグラフであるという問題有する非常に端に浅いを-それは(からパーセントの最後の百を取得するために48点を取るy(352)=49.99%までy(399)=49.99%y(400)=50.00%)、最後の1%クリティカルチャンスから(なんと230点を取りy(170)=49.01%y(400)=50.00%)これはおそらく、返品が少なすぎます

必要に応じて、Aとkの両方を調整して、線形減衰と指数関数的減衰の間に何かを与えるために、遅いレートでやや高い限界まで減衰することができます。するとy=0.6*(1-e^(-0.00447*x))、これで終わります: y = 0.6 *(1-e ^(-0.00447 * x))

カーブは50%を超えて継続しますが、400レーティングの厳しい制限があるため、プレーヤーはそのポイントを渡すことができません(そして、彼らがなんとかそれを渡すことができた場合、60%のクリティカルの厳しい制限があります)。この方程式を使用すると、小数点以下1桁を使用しても、2〜3ポイントごとにゲインを確認でき、最終ティックはy(399)=49.9%〜になります。y(400)=50.0%。です。

数学的には、以前の方程式は実際には50%に近づいているため、より良いように見えるかもしれませんが、個人的には、2ポイントごとに0.1%のゲインは0.01%のゲインよりも良いと思います。でも持つA=0.05041k=0.012、それから行くために102ポイントを取りy(298)=49.00%y(400)=50.00%。あなたのポイントの25%があなたのクリティカルの2%に費やしているのは、おそらくあまりにも減少しています。60%の式では、最後のパーセントに20ポイントしかかかりません(最初のパーセントに必要な4ポイントよりも5倍高い)。

これらの最後のいくつかの方程式を使用して、方程式をスプレッドシートにプラグインし、見栄えが良くなるまで手動で値を調整しました。別のキャップが必要な場合は、同様の操作を行う必要があります。


2
数学演算の相対速度に関する注意は正しいですが、おそらくプレイヤーの統計には無関係です。現代のゲームのボトルネックは通常、フレームごとに何千ものアイテムを処理するものです(物理学やレンダリングなど)。フレームあたり数十回実行される可能性のあるゲームプレイスクリプトは、これに比べてブリップする可能性は低く、一般にキャッシュミスで一杯になり、CPUに任意の数学を実行するための親指の調整時間を十分に残すことになります。TL; DR:DOはニーズが巨大なバッチを実行することをおしている書き込みシェーダや他のものがない限り高価なOPSを避けるために、プレッシャーを感じていない
DMGregory

-1

非常に単純なソリューションの場合、平方根x 2はどうですか

400の平方根(最大値)は20、20 * 2 = 40です。


なぜ反対票なのか?尋ねられた質問を解決し、また求められたシンプルです。
キャットウッド

1
私はダウンボーターではありませんが、おそらくあなたの答えが過度に具体的であり、まだ提供されていない情報を提供していないためでした(平方根は単にの累乗の累乗です1/2)、そしてあなたは説明しませんこれが役立つ理由。
カスライ

私はダウン投票しませんでしたが、これはあまり柔軟ではないので良い答えだとは思いません。同じ統計。
BlueRaja-ダニーPflughoeft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.