2016-04-11 2 views
0

Скажем, я хочу, чтобы сделать уникальную кривую, либо кривой Безье или экспоненциальной кривой, но я хочу эти кривые должны быть определены с помощью определенного набора параметров.Опыт Таблица Алгоритм Кривая

Возьмем, например, следующее ниже.

Уровни: [1, 2, 3, ..., 100]

Опыт Накопительный: [100, 500, 10000, ..., 30000000]

Теперь, если я укажите 100-й уровень как 30 000 000 000 000, как я могу сделать так, чтобы любой критический алгоритм, который я набросал на него, будет следовать его примеру и вычеркивать другие уровни, чтобы общая сумма их опыта составляла 30 000 000 000 000.

I.e. Уровень 1-100 = 30 000 000 000 000 опыта. Опыт, необходимый для каждого уровня, основан на математической кривой, которая представляет собой либо кривую зависимости/кривой Безье, либо экспоненциальную кривую.

В приведенном выше примере, если бы не было первого уровня, какой тип алгоритма я использовал бы для определения оставшихся уровней опыта, необходимых для каждого из них на основе кривой?

30000000 (накопительная хр от уровня 1 до 100) = уровень 100

25.000.000 (накопительная хр от уровня 1 до 100) = уровень 99

сверху вниз: кривая обучения, экспоненциальной кривой, на заказ Curve.

кривой Пример изображения Ниже

Curve Examples

+0

эскиз кривой, что вы хотите. –

+0

Добавил их, дайте мне знать, если у вас есть другие вопросы. – BrettF

ответ

0

Если Вы хотите получить 30000000 как сумма входов 1..100, просто умножьте результат функции на константу.

double[] GetExperienceLimits(int experienceLevels, int maximumExperienceSum, Func<int, double> func) 
{    
    var arr = Enumerable.Range(1, experienceLevels) 
     .Select(i => func(i)) 
     .ToArray(); 
    double c = maximumExperienceSum/arr.Sum(); 
    return arr.Select(f => f * c).ToArray(); 
} 

Вы можете использовать его как этот

var arr = GetExperienceLimits(4, 300, i => i * i); 

и получить

10, 40, 90, 160

+0

Спасибо за ваш комментарий, это действительно даст мне определенную сумму на уровнях последней из 3 000 000. Но мне нужно, чтобы Accumulative XP = 3 000 000 с уровня 1 до 100. Я изложил свой вопрос, чтобы решить эту проблему. Еще раз спасибо за ваш ответ, безусловно, дает мне еще кое-что, чтобы попытаться понять это. – BrettF

+0

@BrettF Хорошо, я обновил ответ. –

+0

Спасибо, я могу использовать это, плюс предыдущие люди отвечают вместе, чтобы получить то, что мне нужно! – BrettF

0

После просмотра эскизов, я предполагаю, что 1D естественные кубические сплайны являются наиболее целесообразно, поскольку

  • они определяют функцию (не кривую),
  • они интерполируют, то есть проходят через указанные вами точки.

Учебные и экспоненциальные кривые, вероятно, будут иметь 3 балла, а пользовательский - 4 балла.

Эта ссылка показывает, как это работает: http://www.codeproject.com/Articles/560163/Csharp-Cubic-Spline-Interpolation

+0

Я думаю, что комбинированный ответ и вас, и парня, который отвечал раньше, - это правильный путь. Просто наличие функции, где она даст мне правильную полезную нагрузку, а затем манипулировать ею оттуда с правильного графика, кажется, работает лучше всего. Большое вам спасибо за ответ с этим, очень полезно. – BrettF

Смежные вопросы