Semplice ritorno discriminante con cappuccio


19

Problema

Il giocatore ottiene 5 punti per livello fino al livello 80 con un massimo di 400. Ci sono 5 statistiche da distribuire e nessun limite massimo a quanto puoi aggiungere a una statistica.

  • Forza
  • Resistenza
  • Intelligenza
  • Agilità
  • Fortuna: fornisce probabilità e danni critici

Vorrei implementare un'equazione di rendimento decrescente su diciamo fortuna. Per probabilità critica, non desidero che il giocatore sia in grado di colpire il 100% di probabilità critica.

Ci sarà un limite al quale raggiungerà quando la crescita sempre più decrescente raggiungerà lo 0 per punto aggiunto.

Esempio se la massima probabilità critica che voglio che il giocatore abbia è del 40%, ogni punto in fortuna aumenterà sempre più la probabilità critica, fino a quando la probabilità critica non raggiungerà circa il 40%. Con il quale 1 fortuna darà un importo molto molto minuscolo.

Qualche soluzione? Grazie e il tuo aiuto è molto apprezzato!


Possibile duplicato di Come sviluppare le formule di danno RPG? - tl; dr la parola chiave che stai cercando è
sigmoid

@BlueRaja Penso che non sia un duplicato. Questa domanda riguarda le funzioni di riduzione del ritorno in generale, quella relativa al calcolo del danno. Di fatto, le risposte a questa hanno discusso principalmente di funzioni a ritorno decrescente, ma penso che le domande siano ancora chiaramente diverse.
Anko,

Risposte:


30

Vuoi iniziare con una funzione asintotica. Cioè, uno che inizia da un numero ae si avvicina a un altro numero b, ma in realtà non lo raggiunge mai. Probabilmente sarà più semplice se a = 0e b = 1. Prenderai questa equazione, inserirai il numero di punti stat (punti fortuna) del personaggio e otterrai l'effettivo valore stat (Crit Chance) come output.

Un esempio molto semplice è y = x / (x + n)dove nc'è una costante positiva. Ecco il xtuo input, dove inserisci il numero di punti stat, ed yè il tuo output, dove ottieni il valore stat finale.

Per vedere n = 5come appare:

y = x / (x + 5) grafico per x in [0,100]

Quando ti nutri , x = 0ottieni y = 0, ma non importa quanto grande xti metta,y non raggiunge mai del tutto 1. Perfetto.

Ora, puoi sintonizzarlo sul desiderio del tuo cuore. Puoi moltiplicare per un fattore di scala per impostare il "limite" su quello che vuoi. y = a * x / (x + 5). Se vuoi che il limite sia del 40%, moltiplica per .4. y = .4 * x / (x + n). Ora quando dai da mangiare x,y inserisce aumenterà, ma non raggiungerà mai del tutto .4.

Regola nper impostare la velocità o la lentezza dell'equazione. n = 100aumenterà molto più lentamente di n = 5:

y = x / (x + 100) grafico per x in [0,400]

È possibile risolvere questa equazione nse si sa che si desidera raggiungere il valore stat che si desidera raggiungere in un determinato numero di punti stat. Diciamo che il personaggio dovrebbe avere il 35% di probabilità di critico a 100 punti fortuna. Risolvendo .35 = .4 * 100 / (100 + n)per i nrendimentin = 14.29 .

Neanche questi numeri devono essere costanti grezze. Forse altre statistiche vanno nel calcolo dei valori di n. Forse alcuni personaggi hanno caratteri diversi n, quindi si adattano meglio alla loro statistica "preferita".

Se vuoi una curva che ha una forma diversa o è più complessa, ci sono molti altri esempi di funzioni asintotiche che potresti usare anche. Ti lascio esplorare questo come desideri.


3
La mia curva preferita è quella esponenziale. Basta prendere un rapporto fisso del pool rimanente con ogni livello.
John Dvorak,

@ JanDvorak per completezza, puoi fornire un esempio? Esistono molte curve esponenziali e un lettore potrebbe non sapere come applicare il tuo suggerimento dal solo commento precedente.
Adam,

Questo è un buon punto di partenza e la matematica è spiegata bene, ma tieni presente che non puoi semplicemente scegliere una funzione che sembra buona; questo problema richiede un'attenta considerazione e molte modifiche. Ad esempio, uno degli aspetti negativi di questo metodo è lo scoraggiamento della specializzazione. Se tutte e cinque le statistiche sono ugualmente praticabili, i punti spesi per il meno sviluppato saranno i più preziosi (e il più sviluppato il meno). La build ideale sarebbe un'equa distribuzione dei punti, il che rende la scelta del giocatore su come spenderli meno interessanti.
Marcks Thomas,

@MarcksThomas Che non presume alcuna sinergia tra attributi o capacità di isolare tatticamente un attributo e "vincere" con esso. Ad esempio, immagina un fantastico arciere che aumenta la propria agilità al punto da morire prima che i nemici li raggiungano: anche se l'agilità aveva efficacia decrescente, la tattica scelta rende gli altri attributi poco importanti. Un'altra tattica che coinvolge la forza potrebbe essere ugualmente efficace, quindi gli attributi sono di "uguale valore", ma le tattiche spesso significano che la specializzazione è dominante. Se anche il tuo sistema di attributi premia la specializzazione, il gioco diverge.
Yakk,

Io chiamo questo il sistema "disegna pietre da una borsa". Il valore P = x/(x+n)è la probabilità, data una borsa con n pietre nere e x pietre bianche, che si estrae una pietra bianca dalla tenda cieca. Un approccio che puoi fare è rendere i crits impostati X = la tua fortuna e N = la loro fortuna. La tua possibilità di crit è quindi del 50% se hai la stessa fortuna del tuo nemico. Se vuoi che la possibilità di base sia del 10%, allora noi X = tua fortuna, N = 9x la loro fortuna.
Yakk,

10

Una buona base sarebbe una funzione simile arctan, poiché attraversa l'origine e presenta un asintoto orizzontale.

arctan

Ridimensionalo di 40 / (pi/2), o 80/piper il limite desiderato. Quindi trasforma luckper ottenere la pendenza della curva che desideri.

critical = 80/pi * arctan(f(luck))

8

Mi piace molto il modo in cui i giochi Souls affrontano questo problema. Invece di fare in modo che ogni stat dia bonus basati su una funzione continua come è stato suggerito, dà bonus in una funzione lineare a tratti.

Non riesco a ricordare i numeri esatti dalla parte superiore della mia testa, ma le funzioni sono lungo le linee di quanto segue (ogni stat ha le sue costanti)

{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}

Tracciare

Questo metodo offre molti vantaggi al designer e al giocatore. Il designer ne trae beneficio in quanto è possibile sintonizzare il vantaggio esatto per punto in un'abilità in modo abbastanza banale, e il giocatore beneficia in quanto sa esattamente quale beneficio vedrà da un livello all'altro.

Nel caso di una funzione continua, alcuni livelli potrebbero dare un vantaggio che non si riflette nei numeri a causa dell'alias di misurazione. Sicuramente quell'ultimo livello ti ha dato un aumento di 0,9 nel bonus XYZ, ma poiché il valore effettivo è passato da 23,52 a 24,42 e arrotondando il numero prima di visualizzarlo, il giocatore non si rende conto che qualcosa è cambiato.

Dal punto di vista UX, suggerirei sicuramente di utilizzare una funzione lineare a tratti. Tuttavia, l'uso di una funzione continua può essere più facile sintonizzarsi successivamente lungo la linea, poiché i giocatori non saranno collegati alle costanti rotonde.


1
Approssimazione di una curva che non richiede molta matematica e semplice da modificare. Mi piace. :)
Casey Kuball,

> Si arrotonda il numero prima di visualizzarlo => un modo di compensare è quello ceildella quantità in aumento prima di aggiungere, e consentire solo numeri interi livelli stat. o floorpoi x <= 0: x = 1per evitare di accidentalmente andare oltre il cappuccio morbido.
Bob,

1
Mentre puoi ancora svolgere una funzione a tratti, non ha l'effetto che stai cercando qui. Il valore di fortuna è una percentuale, con un massimo di 400 voti. Ciò significa che ogni punto di valutazione deve comportare un guadagno di valore inferiore all'1%, anche in una funzione lineare con una fortuna del 100%. Il trucco sta solo mostrando abbastanza punti decimali che y (399) è diverso da y (400). La tua funzione fa la stessa cosa facendoti crescere molto, quindi gli aumenti possono sempre essere integrali. A x = 40, y è più di 4 volte il valore di x.
MichaelS,

@MichaelS Stavo solo dando un esempio del tipo di funzione usata in Dark Souls. Dovrebbe essere bilanciato in modo diverso a seconda della situazione in cui è applicato, ma il mio punto è ancora che i giocatori capiranno l'effetto di una funzione lineare a tratti molto più facilmente di una curva o sezione conica arctangent.
Kaslai,

3

Jan Dvorak sottolinea la funzione esponenziale in un commento. Lo spiego qui.

Si noti che le operazioni esponenziali (e di innesco) sono considerevolmente più costose dal punto di vista computazionale rispetto anche alle operazioni con radice quadrata, che sono esse stesse molto peggio della matematica di base, quindi probabilmente starai meglio con l'approccio di Adam se eseguirai questi calcoli molte volte al secondo . Se calcoli semplicemente i valori quando il giocatore passa di livello, cambia equipaggiamento, ecc., La velocità non è importante, quindi usa quello che ti dà la curva migliore.

Una funzione esponenziale è certa base, B , ad una potenza, x , y=B^x. I matematici usano comunemente una base di e , (~ = 2.718), ma non c'è motivo per cui non puoi usare 2 o 10 se preferisci.

y=e^x Somiglia a questo: y = e ^ x

Si noti che il lato sinistro si sta spostando in modo asintotico a 0. Quindi possiamo invertire l'asse x facendo y=e^(-x) , ma sta ancora scendendo da 1 a 0 e vogliamo che ascenda. Quindi possiamo capovolgerlo sull'asse y con y=-e^(-x) . Ora sta ascendendo da -1 a 0. Possiamo aggiungere 1 per ottenere y=1- e^(-x) ed è crescente da 0 a 1.

y = 1-e ^ (- x)

Da qui, si tratta solo di ridimensionarlo in verticale e in orizzontale. Possiamo moltiplicare l'intera cosa per un valore, chiamiamolo A , che fissa il limite asintotico. Quindi possiamo moltiplicare x per un valore di rateo di variazione, k , per regolare la cui si avvicina al limite.

Questo ci dà un'equazione finale di y=A*(1 - e^(-k*x)). Usando i valori di k=0.012e A=0.5, possiamo impostare il limite al 50% e lasciarlo avvicinarsi abbastanza a quel limite x=400.

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

Ora, puoi apportare alcune modifiche a questo. Una modifica che ho apportato stava cambiando in A=0.5041, quindi se arrotondiamo a una percentuale con 2 decimali (come 32,23%), y (399) = 49,99% e y (400) = 50,00%. Da y (347) in poi, ci sono diversi punti in cui sono necessari due punti per ottenere una variazione dello 0,01%. Ma quell'ultimo punto possibile offre ancora un vantaggio (a malapena) tangibile e lo porta ad un 50% pari.

In alternativa, potremmo modificare il kvalore per avere un effetto simile. A k=0.02305, il valore viene arrotondato al 49,99% a y=399e al 50,00% a y=400. Tuttavia, questo ha il problema che il grafico è molto superficiale alla fine: ci vogliono 48 punti per ottenere l'ultimo centesimo del percento (da y(352)=49.99%a y(399)=49.99%a y(400)=50.00%) e l'ultima probabilità critica dell'1% prende un enorme 230 punti (da y(170)=49.01%ay(400)=50.00% ) che probabilmente è un po 'troppo decrescente sui rendimenti.

Se lo si desidera, è possibile regolare sia A che k in modo che diminuisca a un limite leggermente superiore a una velocità più lenta, per dare qualcosa tra decadimento lineare ed esponenziale. In questo modo y=0.6*(1-e^(-0.00447*x)), si finisce con questo: y = 0.6 * (1-e ^ (- 0,00,447 mila * x))

Nota che la curva continua oltre il 50%, ma poiché esiste un limite massimo di 400 rating, il giocatore non può superare quel punto (e se riescono a superarlo, c'è ancora un limite rigido del 60% crit). Con questa equazione, puoi usare 1 decimale e vedere ancora i guadagni ogni 2-3 punti, con un segno di spunta finale da y(399)=49.9%ay(400)=50.0% .

Matematicamente, le equazioni precedenti potrebbero sembrare migliori, dal momento che si stanno avvicinando al 50%, ma personalmente ritengo che un guadagno dello 0,1% ogni coppia di punti sia migliore di un guadagno dello 0,01%. Anche con A=0.05041e k=0.012, ci vogliono 102 punti per andare da y(298)=49.00%a y(400)=50.00%. Il 25% dei tuoi punti spesi per il 2% del tuo critico è probabilmente troppo diminuito. L'equazione del 60% prende solo 20 punti per l'ultima percentuale (che è ancora 5 volte superiore ai 4 punti necessari per la prima percentuale).

Con queste ultime diverse equazioni, ho appena inserito le equazioni in un foglio di calcolo e ho modificato manualmente i valori fino a quando non sembravano buoni. Dovresti fare qualcosa di simile se volessi un cappello diverso.


2
La nota sulla velocità relativa delle operazioni matematiche è corretta, ma probabilmente irrilevante per le statistiche dei giocatori. I colli di bottiglia nei giochi moderni sono generalmente le cose che gestiscono molte migliaia di oggetti per frame (ad esempio fisica e rendering). È improbabile che gli script di gioco che eseguono alcune decine di volte per fotogramma siano un blip rispetto a questo, e sono generalmente pieni di errori di cache che lasceranno alla CPU un sacco di tempo per fare i calcoli che ti piacciono. tl; dr: non sentirti sotto pressione per evitare operazioni costose a meno che tu non stia scrivendo shader o altre cose che devono eseguire batch enormi
DMGregory

-1

Per una soluzione molto semplice, che ne dici di radice quadrata x 2

La radice quadrata di 400 (massimo possibile) è 20, 20 * 2 = 40.


Perché il voto negativo? Risolve la domanda posta ed è semplice che è stato anche chiesto.
Catwood,

1
Non sono il downvoter, ma è stato probabilmente perché la tua risposta è eccessivamente specifica e non fornisce alcuna informazione che non sia già stata fornita (una radice quadrata è solo esponente del potere di 1/2) e non spieghi il motivi per cui questo potrebbe essere utile.
Kaslai,

Non ho votato in negativo, ma non penso che questa sia una buona risposta perché non è molto flessibile - la radice quadrata non è asintotica, quindi se il livello massimo cambia, è necessario cambiare la formula per mantenere il massimo stat lo stesso.
BlueRaja - Danny Pflughoeft,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.