Prosty malejący zwrot z zaślepką

19

Problem

Gracz zdobywa 5 punktów na poziom do poziomu 80 z maksymalnie 400. Istnieje 5 statystyk do podziału i nie ma maksymalnego limitu, ile możesz dodać do statystyki.

  • siła
  • Wytrzymałość
  • Inteligencja
  • Zwinność
  • Szczęście - Daje szansę na trafienie krytyczne i obrażenia krytyczne

Chciałbym zaimplementować malejące równanie zwrotu na powiedzmy Luck. W przypadku szansy na trafienie krytyczne nie chcę, aby gracz mógł trafić w 100% szansę na trafienie krytyczne.

Zostanie osiągnięty pułap, do którego zostanie on osiągnięty, gdy coraz bardziej malejący wzrost osiągnie wartość 0 za każdy dodany punkt.

Przykład: jeśli maksymalna szansa na trafienie krytyczne, jaką chcę mieć, wynosi 40%, Każdy punkt szczęścia zwiększy szansę na trafienie krytyczne coraz mniej, aż szansa na trafienie krytyczne osiągnie około 40%. Przez co 1 szczęście da bardzo, bardzo małą ilość.

Jakieś rozwiązania? Dziękujemy i twoja pomoc jest bardzo mile widziana!

Nacięcie
źródło
Możliwy duplikat Jak opracować formułę uszkodzeń RPG? - tl; dr
szukanym
@BlueRaja Myślę, że to nie jest duplikat. To pytanie dotyczy ogólnie funkcji zmniejszania zwrotu - dotyczy to obliczania szkód. Tak się składa, że ​​odpowiedzi na to pytanie dotyczyły głównie funkcji malejącego powrotu, ale myślę, że pytania są nadal wyraźnie różne.
Anko

Odpowiedzi:

30

Chcesz zacząć od funkcji asymptotycznej. Oznacza to, że zaczyna się od liczby ai zbliża do innej liczby b, ale nigdy jej nie osiąga. Prawdopodobnie będzie to najłatwiejsze, jeśli a = 0i b = 1. Weźmiesz to równanie, wprowadzisz liczbę punktów statystyk (punktów szczęścia), którą ma postać, i uzyskasz rzeczywistą wartość statystyki (szansę na trafienie krytyczne) jako wynik.

Bardzo prostym przykładem jest y = x / (x + n)gdzie njest pewna dodatnia stała. Oto xtwój wkład, w którym podajesz liczbę punktów statystyk, i ytwój wynik, w którym otrzymujesz ostateczną wartość statystyki.

Aby n = 5sprawdzić, jak to wygląda:

y = x / (x + 5) wykres dla x w [0,100]

Kiedy się karmisz x = 0, dostajesz y = 0, ale bez względu na to, jak duży xwkładasz, ynigdy nie osiąga 1. Idealny.

Teraz możesz dostroić to do swoich serc. Możesz pomnożyć przez współczynnik skali, aby ustawić „limit” na cokolwiek chcesz. y = a * x / (x + 5). Jeśli chcesz, aby limit wynosił 40%, pomnóż przez .4. y = .4 * x / (x + n). Teraz, kiedy dodasz x, yzwiększy się, ale nigdy nie osiągnie .4.

Dostosuj, naby ustawić, jak szybko lub wolno zwiększa się równanie. n = 100wzrośnie znacznie wolniej niż n = 5:

y = x / (x + 100) wykres dla x w [0,400]

Możesz rozwiązać to równanie, njeśli wiesz, że chcesz uzyskać wartość statystyki, którą chcesz osiągnąć przy określonej liczbie punktów statystyki. Powiedzmy, że postać powinna mieć 35% szansy na trafienie krytyczne przy 100 punktach szczęścia. Rozwiązywanie .35 = .4 * 100 / (100 + n)dla nplonów n = 14.29.

Te liczby nie muszą być również stałymi stałymi. Może inne statystyki zajmują się obliczaniem wartości n. Być może niektóre postacie mają różne n, więc lepiej skalują się w swoich „preferowanych” statystykach.

Jeśli chcesz mieć krzywą o innym kształcie lub bardziej złożoną, istnieje wiele innych przykładów funkcji asymptotycznych, których możesz użyć. Zostawię cię, byś to zbadał, jak chcesz.

Adam
źródło
3
Moja ulubiona krzywa to krzywa wykładnicza. Wystarczy wziąć stały stosunek pozostałej puli na każdym poziomie.
John Dvorak,
@ JanDvorak dla kompletności, czy możesz podać przykład? Istnieje wiele krzywych wykładniczych, a czytelnik może nie wiedzieć, jak zastosować sugestię z samego komentarza.
Adam,
Jest to dobry punkt wyjścia i matematyka jest dobrze wyjaśniona, ale pamiętaj, że nie możesz po prostu wybrać funkcji, która wygląda dobrze; ten problem wymaga starannego rozważenia i wielu poprawek. Na przykład jedną z wad tej metody jest zniechęcenie do specjalizacji. Jeśli wszystkie pięć statystyk jest jednakowo wykonalnych, punkty wydane na najmniej rozwinięte będą najbardziej wartościowe (a najbardziej rozwinięte najmniej). Idealną wersją byłaby równa dystrybucja punktów, co sprawia, że ​​wybór gracza, w jaki sposób je wydawać, jest mniej interesujący.
Marcks Thomas,
@MarcksThomas Nie zakłada synergii między atrybutami ani zdolności taktycznego izolowania atrybutu i „wygrywania” nim. Jako przykład wyobraź sobie niesamowitego łucznika, który podnosi swoją zwinność do tego stopnia, że ​​wrogowie umierają, zanim do nich dotrą: nawet jeśli zwinność ma malejącą skuteczność, wybrana taktyka sprawia, że ​​pozostałe atrybuty są nieistotne. Inna taktyka związana z siłą może być równie skuteczna, więc atrybuty mają „równą wartość”, ale taktyka często oznacza dominację specjalizacji. Jeśli twój system atrybutów również nagradza specjalizację, gra się różni.
Jak
Nazywam to systemem „wyciągania kamieni z torby”. Wartością P = x/(x+n)jest prawdopodobieństwo, biorąc pod uwagę torbę z n czarnymi kamieniami i x białymi kamieniami, że wyciągniesz biały kamień z niewidomej torby. Jednym z podejść, które możesz zrobić, jest ustawienie zestawu krytycznego X = twoje szczęście, a N = ich szczęście. Twoja szansa na trafienie krytyczne wynosi 50%, jeśli masz tyle samo szczęścia co przeciwnik. Jeśli chcesz, aby podstawowa szansa wynosiła 10%, to my X = twoje szczęście, N = 9x ich szczęście.
Jak
10

Dobra baza byłaby funkcją podobną arctan, ponieważ przechodzi przez początek i wykazuje poziomą asymptotę.

arctan

Skaluj według 40 / (pi/2), lub 80/pido żądanego limitu. Następnie przekształć, luckaby uzyskać żądaną stromość krzywej.

critical = 80/pi * arctan(f(luck))
jmegaffin
źródło
8

Naprawdę podoba mi się sposób, w jaki gry Souls rozwiązują ten problem. Zamiast sprawiać, by każda statystyka dawała premie oparte na funkcji ciągłej, jak zostało zasugerowane, daje bonusy w funkcji liniowej.

Nie pamiętam dokładnych liczb z góry mojej głowy, ale funkcje są zgodne z następującymi (każda statystyka ma własne stałe)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0,5x + 120}

Wątek

Ta metoda zapewnia wiele korzyści projektantowi i odtwarzaczowi. Projektant czerpie korzyści, ponieważ można dostroić dokładną korzyść na punkt umiejętności w dość trywialny sposób, a gracz zyskuje, ponieważ dokładnie wie, ile korzyści zobaczą z poziomu na poziom.

W przypadku funkcji ciągłej niektóre poziomy mogą dać korzyść, która nie zostanie odzwierciedlona w liczbach z powodu aliasingu pomiaru. Pewnie, że ostatni poziom dał ci wzrost o 0,9 premii XYZ, ale ponieważ rzeczywista wartość wzrosła z 23,52 do 24,42, a ty zaokrąglasz liczbę przed jej wyświetleniem, gracz nie zdaje sobie sprawy, że coś się zmieniło.

Z perspektywy UX zdecydowanie sugerowałbym skorzystanie z częściowej funkcji liniowej. Jednak użycie funkcji ciągłej może być łatwiejsze dostrajania później, ponieważ gracze nie będą tak przywiązani do stałych okrągłych.

Kaslai
źródło
1
Przybliżenie krzywej, która nie wymaga dużej matematyki i jest łatwa do zmiany. Lubię to. :)
Casey Kuball,
> Zaokrąglić liczbę przed wyświetlając go => jednym ze sposobów kompensowania jest ceildo kwoty podwyższenia przed dodaniem, a pozwala jedynie całkowitą poziomów statystyk. lub floorpotem x <= 0: x = 1, aby uniknąć przypadkowego podchodząc miękką czapkę.
Bob
1
Chociaż nadal możesz wykonywać funkcję kawałkową, nie ma ona efektu, którego tu szukasz. Wartość szczęścia to procent, z maksimum 400 ocenami. Oznacza to, że każdy punkt oceny musi przynieść wzrost wartości poniżej 1%, nawet w funkcji liniowej ze 100% szczęściem. Sztuczka pokazuje tylko tyle miejsc po przecinku, że y (399) różni się od y (400). Twoja funkcja robi to samo, powodując, że y rośnie bardzo duże, więc wzrosty zawsze mogą być integralne. Przy x = 40 y jest ponad 4-krotnością wartości x.
MichaelS
@MichaelS Właśnie podałem przykład funkcji używanej w Dark Souls. Musiałby być zrównoważony inaczej w zależności od sytuacji, w której jest zastosowany, ale nadal uważam, że gracze zrozumieją efekt kawałkowej funkcji liniowej znacznie łatwiej niż łuk łukowy lub sekcja stożkowa.
Kaslai
3

Jan Dvorak wskazuje funkcję wykładniczą w komentarzu. Wyjaśnię to tutaj.

Zauważ, że operacje wykładnicze (i wyzwalające) są znacznie droższe obliczeniowo niż nawet operacje pierwiastkowe, które same w sobie są znacznie gorsze niż podstawowa matematyka, więc prawdopodobnie lepiej jest podejść Adama, jeśli będziesz wykonywać te obliczenia wiele razy na sekundę . Jeśli po prostu obliczasz wartości, gdy poziom gracza, zmiana wyposażenia itp., Prędkość nie jest ważna, więc używaj tego, co daje najlepszą krzywą.

Funkcja wykładnicza jest jakaś zasada, B , do jakiejś władzy, x , y=B^x. Matematycy zwykle używają podstawy e (~ = 2,718), ale nie ma powodu, dla którego nie można użyć 2 lub 10, jeśli wolisz.

y=e^x wygląda tak: y = e ^ x

Zauważ, że lewa strona przesuwa się asympotycznie do 0. Więc możemy obrócić oś x, wykonując y=e^(-x) , ale nadal spada ona z 1 do 0 i chcemy, żeby się wzniosła. Możemy więc obrócić go wzdłuż osi y za pomocą y=-e^(-x) . Teraz rośnie od -1 do 0. Możemy dodać 1, aby uzyskać y=1,- e^(-x) a rosnąco od 0 do 1.

y = 1-e ^ (- x)

Odtąd wystarczy skalować go w pionie i poziomie. Możemy pomnożyć całość przez pewną wartość, nazwijmy to A , która określa limit asymptotyczny. Następnie możemy pomnożyć x przez wartość szybkości zmiany k , aby dostosować, jak szybko zbliża się do limitu.

To daje nam końcowe równanie y=A*(1 - e^(-k*x)). Korzystając z wartości k=0.012i A=0.5, możemy ustawić limit na 50% i pozwolić zbliżyć się do tego limitu x=400.

y = 0,5 * (1-e ^ (- 0,012 * k))

Teraz możesz wprowadzić kilka drobnych poprawek. Jedna poprawka, którą zrobiłem, zmieniała się na A=0.5041, więc jeśli zaokrąglimy do wartości procentowej z 2 miejscami po przecinku (jak 32,23%), y (399) = 49,99% i y (400) = 50,00%. Począwszy od roku y (347), istnieje kilka miejsc, w których potrzeba dwóch punktów, aby uzyskać zmianę o 0,01%. Ale ten ostatni możliwy punkt wciąż daje (ledwo) namacalną korzyść i sprowadza ją nawet do 50%.

Alternatywnie, możemy dostosować kwartość, aby uzyskać podobny efekt. At k=0.02305, wartość zaokrągla do 49,99% o y=399i 50,00% o y=400. Jednak to nie ma problemu, że wykres jest bardzo płytkie na końcu - to ma 48 punktów, aby ta ostatnia setną procenta (od y(352)=49.99%do y(399)=49.99%celu y(400)=50.00%), a ostatni 1% crit szansa trwa aż o 230 punktów (od y(170)=49.01%do y(400)=50.00%) co prawdopodobnie nieco zmniejsza się w przypadku zwrotów.

Jeśli chcesz, możesz dostosować zarówno A, jak i k, więc zmniejsza się do nieco wyższego limitu w wolniejszym tempie, aby uzyskać coś między rozpadem liniowym a wykładniczym. Robiąc y=0.6*(1-e^(-0.00447*x)), kończysz z tym: y = 0,6 * (1-e ^ (- 0,00447 * x))

Zauważ, że krzywa nadal przekracza 50%, ale ponieważ istnieje twardy limit oceny 400, gracz nie może przekroczyć tego punktu (a jeśli uda się go przekroczyć, nadal istnieje twardy limit 60% wartości krytycznej). Za pomocą tego równania możesz użyć 1 miejsca po przecinku i nadal widzieć zyski co 2 do 3 punktów, z ostatnim tyknięciem od y(399)=49.9%do y(400)=50.0%.

Matematycznie wcześniejsze równania mogą wydawać się lepsze, ponieważ w rzeczywistości zbliżają się do 50%, ale osobiście uważam, że wzrost o 0,1% na każdą parę punktów jest lepszy niż wzrost o 0,01%. Nawet z A=0.05041i k=0.012, potrzeba 102 punktów, aby przejść od y(298)=49.00%do y(400)=50.00%. 25% punktów wydanych na 2% twojego krytycznego jest prawdopodobnie zbyt zmniejszone. Równanie 60% zajmuje tylko 20 punktów za ostatni procent (który jest nadal 5 razy wyższy niż 4 punkty potrzebne na pierwszy procent).

Za pomocą tych ostatnich kilku równań po prostu podłączyłem równania do arkusza kalkulacyjnego i ręcznie poprawiałem wartości, aż wyglądały dobrze. Musisz zrobić coś podobnego, jeśli chcesz inną czapkę.

MichaelS
źródło
2
Uwaga na temat względnej prędkości operacji matematycznych jest poprawna, ale prawdopodobnie nie ma znaczenia dla statystyk gracza. Wąskie gardła we współczesnych grach to zazwyczaj rzeczy, które obsługują wiele tysięcy elementów na klatkę (np. Fizyka i rendering). Skrypty rozgrywki, które prawdopodobnie uruchamiają się kilkadziesiąt razy na klatkę, raczej nie będą zbyt szybkie w stosunku do tego, i generalnie są pełne braków pamięci podręcznej, które pozostawiają procesorowi mnóstwo czasu na przekręcenie kciuka, aby wykonać dowolną matematykę. tl; dr: Nie odczuwaj presji, aby unikać kosztownych operacji, chyba że piszesz shadery lub inne rzeczy, które muszą uruchamiać ogromne partie
DMGregory
-1

Dla bardzo prostego rozwiązania, co powiesz na pierwiastek kwadratowy x 2

Pierwiastek kwadratowy z 400 (maks. Możliwe) wynosi 20, 20 * 2 = 40.

Dereń
źródło
Dlaczego głosowanie w dół? Rozwiązuje zadane pytanie i jest proste, o które również poproszono.
Catwood
1
Nie jestem zwolennikiem, ale prawdopodobnie dlatego, że twoja odpowiedź jest zbyt konkretna i nie zawiera żadnych informacji, które nie zostały jeszcze dostarczone (pierwiastek kwadratowy jest po prostu potęgowaniem potęgi 1/2), a ty nie wyjaśniasz powody, dla których może to być przydatne.
Kaslai
Nie głosowałem negatywnie, ale nie sądzę, że to dobra odpowiedź, ponieważ nie jest zbyt elastyczna - pierwiastek kwadratowy nie jest asymptotyczny, więc jeśli maksymalny poziom kiedykolwiek się zmienia, musisz zmienić formułę, aby utrzymać maksimum statystyki tak samo.
BlueRaja - Danny Pflughoeft