[追記] 最終的にいただいた意見をすべて混ぜました
ku__ra__geさん、ikadzuchiさん、TN8001さん
ありがとうございました。
・ 初回ロードでMath.Powを使いキャッシュ
・ 2回目以降はキャッシュに対して計算する
Math.Powは重いとのことでしたが、計測したところ今回の使い方では早いので使うことにしました。
Macbook proにて1万回繰り返した結果
Math.Pow 0.003 秒
for 0.047 秒
コード全文
C#
1public sealed class ItemPrice 2{ 3 public int Level{ get; private set; } 4 public long Value => (long)value; 5 6 public readonly long StartPrice; 7 public readonly double PriceRate; 8 9 double value; 10 11 public ItemPrice(int level, long startPrice, double priceRate) 12 { 13 Assert.IsTrue(level > 0); 14 Assert.IsTrue(startPrice > 0); 15 Assert.IsTrue(priceRate > 0); 16 17 Level = level; 18 StartPrice = startPrice; 19 PriceRate = priceRate; 20 21 value = Load(Level, StartPrice, PriceRate); 22 } 23 24 public void Upgrade() 25 { 26 Level++; 27 value = Upgrade(value, PriceRate); 28 } 29 30 public static double Load(int level, long startPrice, double priceRate) 31 { 32 return level > 1 ? startPrice * Math.Pow(priceRate, level - 1) : startPrice; 33 } 34 35 public static double Upgrade(double currentPrice, double priceRate) => currentPrice * priceRate; 36}
実現したいこと
購入するごとに金額が増えていくアイテムがあります。
金額が増える倍率をひとつ前の価格に対して同じ倍率で増えていく計算式を探しております。
ご教授いただきたけますと幸いです。よろしくお願いいたします。
例 )
Lv1のアイテムを購入するとLv2の価格に変わる
Lv1 100円
LV2 110円 (Lv1に対して1.1倍)
LV3 121円 (Lv2に対して1.1倍)
.
.
.
Lv30 1540円 (Lv29に対して1.099957倍)
※ 整数に置き換えるので多少の誤差は問題ないと思っています。
発生している問題
ひとつ前の価格に対して掛けていくような計算であれば簡単ですが、ひとつ前の金額を保存または再計算する必要がある為初期値に対して計算したいです。
初期値に対してレベルを掛けていくような計算式を考えましたが、下記だと徐々に倍率が下がってしまいます。
C#
1public static long GetPrice(int level, long startPrice, float rate) 2{ 3 return level > 1 ? (long)(startPrice + (startPrice * rate * level)) : startPrice; 4}
計算結果
Lv1 100円
Lv2 120円 (Lv1に対して1.2倍)
Lv3 130円 (Lv2に対して1.083333倍)
.
.
.
Lv30 400円 (Lv29に対して1.025641倍)
試したこと
**例 ) **の計算結果は下記の式を使いました。
下記でもできますがレベルが数百になったり一度に複数のアイテムを更新する場合フレームに収まらないタイミングが出てきます。それを避ける為にも、初期値から計算する方法を探しております。
C#
1public static long GetPrice(int level, long start, float rate) 2{ 3 if(level > 1) 4 { 5 for (int i = 0; i < level - 1; i++) 6 { 7 start += (long)(start * rate); 8 } 9 } 10 11 return start; 12}
回答2件
あなたの回答
tips
プレビュー