Ви насправді не дали достатньо інформації, щоб сказати, який діапазон ви хочете, тобто чи обмежений він, чи хочете ви геометричну прогресію тощо.
Перше, що ви хочете зробити, - це отримати число, пропорційне кількості швидкості, яку ви хочете втратити (воно не повинно бути однаковим, але воно повинно зменшуватися в міру збільшення швидкості, щоб зробити його пропорційним вашим втратам). Стандартний спосіб зробити це - прийняти відповідь :
temp = 1 / currentVelocity;
Тепер для 100 у вас буде 0,01, для 200 у вас буде 0,005, для 300 у вас буде 0,0033 і так далі.
Тепер вам просто потрібно пристосувати це число до того, що ви дійсно хочете, помноживши його. Так
k = 3000;
newVelocity = temp * k;
дасть вам 20 за 300, але це дасть вам 15 за 200, а не 10. Це може бути добре для вас, у такому випадку вам більше не потрібно читати. Ви можете налаштувати k так, як вам подобається, але ви можете не отримувати числа так, як вам подобається, якщо ви не зробите трохи більше, наприклад, застосуйте геометричну прогресію чи не зміните основу для збільшення. Я не збираюся тут вступати в геометричні прогресії, але якщо ви хочете змінити базу, зробіть це так:
base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!
k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
velocityLoss = currentVelocity; //(2)
Це забезпечить вам діапазон, про який ви спочатку просили у своєму запитанні, 300 -> втрата 10, 200 -> втрата 20. FYI 100 -> втрата 40, а 50 -> втрата 80 (!), Що означає, що ви Вам потрібно було б обмежити віднімання - що я робив у рядках (1) та (2).
Є й інші способи підходу до всієї цієї проблеми, звичайно, я впевнений, що ті, хто більш математично сприйнятий, ніж я, опублікують тут.
log(myVelocity + 1) * N?