Я пытаюсь создать формулу, которую можно изменить, просто изменив два значения: number_of_levels и last_level_experience. Это сделано для того, чтобы люди, изменяющие игру, могли изменить требования к уровню.
Я понял, что могу указать количество XP, необходимое для повышения до последнего уровня, но я хочу иметь возможность контролировать XP, необходимое для повышения до первого уровня, который в этом случае может сильно отличаться. Например, если у меня есть 40 уровней и 1 000 000 XP для последнего уровня, то для первого уровня требуется повышение до 625. Но если я изменю уровни на 80, то для первого уровня поднимается 156. В обоих случаях последний уровень требует 1000000.
Должен быть какой-то способ заставить компьютер вычислить подходящую кривую, учитывая только эти два основных значения.
#include <iostream>
int main()
{
int levels = 40;
if (levels < 2) levels = 2;
int experience_for_last_level = 1e6;
float fraction = 1.0 / levels;
{
int i = 0;
float fraction_counter = fraction;
int counter = levels;
int total = 0;
for (i = 1; i <= levels; ++i, fraction_counter += fraction, --counter)
{
int a = static_cast<int>(fraction_counter * experience_for_last_level / counter);
std::cout <<"Level "<<i<<": "<<a<<" ("<<counter<<")"<<"\n";
total += a;
}
std::cout << "\nTotal Exp: " << total;
}
}
Выход:
Level 1: 625 (40) Level 15: 14423 (26) Level 29: 60416 (12)
Level 2: 1282 (39) Level 16: 16000 (25) Level 30: 68181 (11)
Level 3: 1973 (38) Level 17: 17708 (24) Level 31: 77499 (10)
Level 4: 2702 (37) Level 18: 19565 (23) Level 32: 88888 (9)
Level 5: 3472 (36) Level 19: 21590 (22) Level 33: 103124 (8)
Level 6: 4285 (35) Level 20: 23809 (21) Level 34: 121428 (7)
Level 7: 5147 (34) Level 21: 26250 (20) Level 35: 145833 (6)
Level 8: 6060 (33) Level 22: 28947 (19) Level 36: 179999 (5)
Level 9: 7031 (32) Level 23: 31944 (18) Level 37: 231249 (4)
Level 10: 8064 (31) Level 24: 35294 (17) Level 38: 316666 (3)
Level 11: 9166 (30) Level 25: 39062 (16) Level 39: 487499 (2)
Level 12: 10344 (29) Level 26: 43333 (15) Level 40: 999999 (1)
Level 13: 11607 (28) Level 27: 48214 (14)
Level 14: 12962 (27) Level 28: 53846 (13)
источник
Ответы:
Хотя существует бесконечно много способов их выбора, для выравнивающих кривых характерно соблюдение степенного правила, такого как следующее:
Основное преимущество этой формулы может быть легко объяснено: для данного правила существует фиксированное значение N, такое, что каждый уровень стоит на N процентов больше, чем предыдущий .
Ваши исходные переменные добавляют следующие ограничения:
Два уравнения, два неизвестных. Это выглядит хорошо. Простая математика дает
A
иB
:В результате получается следующий код:
И следующий вывод:
источник
N
что вы описали выше? Что делать, если вы хотите сделатьN
подключаемую переменную? Дайте мне знать, если я задам отдельный вопрос для этого.N
иB
естьexp(B) = 1 + N
, илиB = log(1 + N)
. Так что если вы хотите, чтобы каждый уровень требовал, например, на 15% больше, чем предыдущий, вам понадобитсяB = log(1 + 0.15) = 0.13976
.Не забудьте округлить числа после того, как вы выяснили свою кривую. Не имеет смысла говорить игроку, что ему нужно 119 378 очков опыта, чтобы достичь следующего уровня - потому что человек всегда будет понимать его как «примерно 120 000». Таким образом, вам будет лучше сделать округление самостоятельно и представить «чистые» результаты своим игрокам. Например, следующий код (который распространяется на код Сэма Хочевара) попытается округлить до ≈2,2 значащих цифр (очевидно, что константа может быть настроена так, как вы хотите):
Выход:
источник