Просте зменшення повернення з кришкою


19

Проблема

Гравець отримує 5 балів за рівень до рівня 80 з максимумом 400. Є 5 статистичних даних, які слід розподілити, і немає максимального обмеження, скільки ви можете додати до статистики.

  • Міцність
  • Витривалість
  • Розвідка
  • Спритність
  • Удача - надає критичний шанс і критичний збиток

Я хотів би застосувати зменшення рівняння повернення, скажімо, удача. Що стосується критичного шансу, я не хочу, щоб гравець міг потрапити на 100% критичний шанс.

Буде досягнута стеля, до якої вона буде досягати, коли все більше зменшується зростання досягає 0 за бал.

Наприклад, якщо максимальний критичний шанс, який я хочу мати у гравця, становить 40%, кожна точка удачі збільшуватиме критичний шанс все менше і менше, поки критичний шанс не досягне приблизно 40%. За допомогою якого 1 удача дасть дуже мінімальну суму.

Будь-які рішення? Дякую вам і за вашу допомогу дуже цінуємо!


Можливий дублікат Як розробити формули пошкодження RPG? - tl; dr. Ключове слово, яке ви шукаєте, - сигмоподібна крива
BlueRaja - Danny Pflughoeft

@BlueRaja Я думаю, що це не дублікат. Це питання стосується функцій зменшення повернення взагалі - це питання обчислення шкоди. Як це буває, відповіді на це здебільшого обговорювали функції зменшення повернення, але я думаю, що питання все одно явно різні.
Анко

Відповіді:


30

Ви хочете почати з асимптотичної функції. Тобто той, який починається з числа aі наближається до іншого числа b, але насправді ніколи не досягає цього. Це, мабуть, буде найпростіше, якщо a = 0і b = 1. Ви візьмете це рівняння, введете кількість статевих балів (балів удачі), які має персонаж, і отримаєте фактичне значення статичного значення (шанс критичності) як вихід.

Дуже простий приклад - y = x / (x + n)де nє якась позитивна константа. Ось xваше введення, де ви вводите кількість статичних балів, і 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). Тепер, коли ви харчуєтеся в x, yзросте, але це ніколи не досягне .4.

Налаштуйте, nщоб встановити, наскільки швидко або повільно рівняння наростає. n = 100збільшиться набагато повільніше, ніж n = 5:

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

Ви можете вирішити це рівняння, nякщо ви знаєте, що хочете досягти значення стати, яке ви хочете досягти в певному кількості статевих точок. Скажімо, персонаж повинен мати 35% критичного шансу на 100 очок удачі. Рішення .35 = .4 * 100 / (100 + n)для nвиходів n = 14.29.

Ці цифри також не повинні бути сирими константами. Можливо, інші статистичні дані переходять до обчислення значень n. Можливо, у деяких персонажів є різні n's, тому вони краще масштабуються у своєму «бажаному» статі.

Якщо ви хочете криву, яка має іншу форму або є більш складною, є багато інших прикладів асимптотичних функцій, які ви також могли використовувати. Я залишу вас досліджувати це, як хочете.


3
Моя улюблена крива - експоненціальна. Просто візьміть фіксовану співвідношення залишку пулу з кожним рівнем.
Джон Дворак

@JanDvorak для повноти, чи можете ви навести приклад? Існує безліч експоненціальних кривих, і читач може не знати, як самостійно застосувати вашу пропозицію з попереднього коментаря.
Адам

Це хороша відправна точка, і математика пояснюється добре, але майте на увазі, ви не можете просто вибрати функцію, яка виглядає добре; ця проблема вимагає ретельного розгляду та багато налаштувань. Наприклад, одним із недоліків цього методу є його відмовлення від спеціалізації. Якщо всі п’ять статистичних даних однаково життєздатні, бали, витрачені на найменш розвинену, будуть найціннішими (а найрозвиненішими - найменшими). Ідеальною побудовою було б рівномірний розподіл очок, що робить вибір гравця щодо того, як витратити їх менш цікавим.
Маркс Томас

@MarcksThomas Це не передбачає жодної синергії між атрибутами або здатності тактично ізолювати атрибут та "виграти" з ним. Як приклад, уявіть дивовижного стрільця, який піднімає свою спритність до того, що вороги вмирають до того, як вони дістаються до них: навіть якщо спритність мала зменшувальну ефективність, обрана тактика робить інші атрибути не важливими. Інша тактика, що стосується сили, може бути однаково ефективною, тому ознаки мають "рівне значення", але тактика часто означає, що спеціалізація є домінуючою. Якщо ваша система атрибутів також винагороджує спеціалізацію, гра розходиться.
Якк

Я називаю це системою "витягнути камені з мішка". ЗначенняP = x/(x+n) - це ймовірність, з огляду на сумку з п чорними каменями та x білими каменями, що ви намалюєте білий камінь із сліпого мішка. Один із підходів, який ви можете зробити, - зробити так, щоб критики встановили X = ваша доля, і N = їхня удача. Ваш шанс критикувати тоді 50%, якщо у вас є така ж удача, як ваш ворог. Якщо ви хочете, щоб базовий шанс був 10%, тоді нам X = ваша удача, N = 9x їхня удача.
Якк

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 <= х: у = 0,5х + 120}

Сюжет

Цей метод забезпечує багато переваг для дизайнера та гравця. Дизайнер отримує переваги, оскільки ви можете налаштувати точну вигоду за бал у вмінні досить тривіально, а гравець отримує переваги, оскільки вони точно знають, скільки користі вони побачать від рівня до рівня.

У випадку безперервної функції деякі рівні можуть принести користь, яка не відображається в числах через псевдонім вимірювання. Впевнений, що останній рівень призвів до збільшення на 0,9 бонусного XYZ, але оскільки фактичне значення вийшло з 23,52 до 24,42, і ви округлили число до його відображення, гравець не розуміє, що щось змінилося.

З точки зору UX, я б точно запропонував виконувати кусочно лінійну функцію. Однак використання безперервної функції може бути простіше налаштувати пізніше вниз по лінії, оскільки гравці не будуть настільки прив'язані до круглих констант.


1
Апроксимація кривої, яка не вимагає великої математики, і її просто змінювати. Мені це подобається. :)
Кейсі Кубалл

> Ви округляєте число до його відображення => Один із способів компенсації - ceilце збільшити суму перед додаванням, і дозволити лише цілі рівні статі. або floorпотім, x <= 0: x = 1щоб уникнути випадкового переходу на м'яку шапку.
Боб

1
Незважаючи на те, що ви все ще можете виконувати функцію кусочно, це не має ефекту, який ви шукаєте тут. Значення удачі - це відсоток, максимум 400 рейтинг. Це означає, що кожен рейтинговий бал повинен спричинити за собою збільшення значення на рівні нижче 1%, навіть у лінійній функції зі 100% удачею. Хитрість полягає лише в тому, щоб показати достатню кількість знаків після коми, що y (399) відрізняється від y (400). Ваша функція робить те ж саме, роблячи y ріст дуже великим, тому збільшення завжди може бути цілісним. При х = 40, у більше, ніж у 4 рази більше значення х.
MichaelS

@MichaelS Я просто наводив приклад типу функції, що використовується в Dark Souls. Її потрібно було б збалансувати по-різному в залежності від ситуації, в якій він застосовується, але я все одно вважаю, що гравці зрозуміють ефект кусочно-лінійної функції набагато легше, ніж крива арктангенту або конічний переріз.
Каслай

3

Ян Дворак в коментарі вказує на експоненційну функцію. Я поясню це тут.

Зауважте, що експоненціальні (і тригельні) операції значно дорожче обчислювальних, ніж навіть квадратні кореневі операції, які самі по собі набагато гірші, ніж основна математика, тому вам, мабуть, краще з підходом Адама, якщо ви будете робити ці обчислення багато разів в секунду . Якщо ви просто розраховуєте значення, коли рівень гравця, зміна обладнання тощо, швидкість не важлива, тому використовуйте все, що дає найкращу криву.

Експоненціальна функція певний грунт, Б , в деякій мірі, х , y=B^x. Математики зазвичай використовують базу e , (~ = 2.718), але немає причин, якщо ви не хочете використовувати 2 або 10.

y=e^x виглядає так: у = е ^ х

Зверніть увагу , що ліва сторона asympotically рухається в 0. Таким чином , ми можемо перевернути вісь х, роблячи y=e^(-x) , але це все ще спускався від 1 до 0 , і ми хочемо його піднятися. Тож ми можемо перевернути її по осі у за допомогою 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.012і A=0.5, ми можемо встановити обмеження на 50% і дозволити йому наблизитися до цієї межі навколо x=400.

у = 0,5 * (1 -е ^ (- 0,012 * к))

Тепер ви можете зробити декілька підправлень до цього. Один твіт, який я зробив, змінився A=0.5041, тому якщо ми округлимо до відсотка 2 десяткові дроби (наприклад, 32,23%), у (399) = 49,99% і у (400) = 50,00%. Від y (347) далі є кілька місць, де потрібно два бали, щоб отримати зміну 0,01%. Але останній можливий момент все-таки дає (ледь) відчутну користь і приводить її до навіть 50%.

Крім того, ми могли налаштувати kзначення, щоб мати подібний ефект. Окрім того k=0.02305, величина становить 49,99% y=399та 50,00% y=400. Однак у цьому проблема полягає в тому, що графік в кінці дуже дрібний - для отримання останньої сотої частини відсотка (від y(352)=49.99%до y(399)=49.99%до y(400)=50.00%) потрібно 48 очок, а останній критичний шанс на 1% приймає колосальні 230 балів (від y(170)=49.01%до y(400)=50.00%) що, мабуть, трохи зменшує прибуток.

Якщо ви хотіли, ви можете налаштувати як A, так і k, щоб зменшити його до дещо вищої межі з меншою швидкістю, щоб дати щось між лінійним та експоненціальним розпадом. Виконуючи це y=0.6*(1-e^(-0.00447*x)), ви закінчуєте це: у = 0,6 * (1 -е ^ (- 0,00447 * х))

Зауважте, що крива триває минуле 50%, але оскільки існує жорсткий межа рейтингу 400, гравець не може пройти цю точку (і якщо їм все-таки вдасться її пройти, все ще існує жорстка межа 60% критики). За допомогою цього рівняння ви можете використовувати 1 десяткове місце і все ще бачити приріст кожні 2 - 3 бали, остаточним галочкою від y(399)=49.9%-y(400)=50.0% .

Математично більш ранні рівняння можуть здатися кращими, оскільки вони насправді наближаються до 50%, але я особисто думаю, що приріст 0,1% на кожну пару балів почуває себе краще, ніж приріст 0,01%. Навіть з A=0.05041і до k=0.012цього потрібно 102 бали, щоб перейти з y(298)=49.00%до y(400)=50.00%. 25% ваших балів витрачаються на 2% від вашого критичного, ймовірно, занадто зменшене. Рівняння 60% займає лише 20 балів за останній відсоток (що все ще в 5 разів перевищує 4 бали, необхідні для першого відсотка).

За допомогою цих останніх кількох рівнянь я просто підключив рівняння до електронної таблиці та змінив значення вручну, поки вони не виглядали добре. Вам потрібно було б зробити щось подібне, якби ви хотіли іншу шапку.


2
Примітка про відносну швидкість математичних операцій є правильною, але, ймовірно, не має значення для статистики гравця. Вузькі місця в сучасних іграх - це зазвичай речі, які обробляють багато тисяч предметів на кадр (наприклад, фізика та візуалізація). Сценарії ігрових процесів, які, ймовірно, виконують кілька десятків разів на кадр, навряд чи будуть блискучими до цього, і, як правило, повні кеш-пропусків, які все-таки залишать центральний процесор достатньо часу, щоб зайнятись будь-якою математикою. tl; dr: Не відчувайте тиску, щоб уникнути дорогих операцій, якщо ви не пишете шейдери чи інші речі, для яких потрібно запускати величезні партії
DMGregory

-1

Як дуже просте рішення, як щодо квадратного кореня х 2

Квадратний корінь 400 (максимум можливо) дорівнює 20, 20 * 2 = 40.


Чому голосування проти? Він вирішує поставлене питання і простий, про що також просили.
Catwood

1
Я не прихильник, але це, мабуть, тому, що ваша відповідь надто конкретна і не надає жодної інформації, яка ще не була надана (квадратний корінь - це лише показник сили 1/2) і ви не пояснюєте причини, чому це може бути корисним.
Каслай

Я не спровокував, але не думаю, що це є гарною відповіддю, оскільки це не дуже гнучко - квадратний корінь не є асимптотичним, тому, якщо рівень максимуму коли-небудь зміниться, вам потрібно змінити формулу, щоб зберегти макс. стат же.
BlueRaja - Danny Pflughoeft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.