Idee per l'algoritmo di attacco fisico (linguaggio irrilevante)


8

Sto lavorando a un gioco e ho bisogno di idee per il danno che verrà inflitto al nemico quando il tuo giocatore attacca. La quantità totale di salute che il nemico ha viene chiamata enemyHealthe ha un valore di 1000. Inizi con un'arma che infligge 40 punti di danno (può essere cambiata.) Il giocatore ha una statistica di attacco che puoi aumentare, chiamata playerAttack. Questo valore inizia da 1 e ha un valore massimo possibile di 100 dopo averlo fatto salire di livello molte volte e renderlo più lontano nel gioco. La quantità di danno che l'arma infligge viene tagliata e asciutta e sottrae 40 punti dal totale di 1000 punti salute ogni volta che il nemico viene colpito. Ma ciò che playerAttackfa è aggiungere quel valore con una percentuale. Ecco l'algoritmo che ho ora. (Ho eliminato tutte le gui, le classi, ecc. E ho dato alle variabili nomi molto avanzati)

double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05))
enemyHealth -= (int)totalDamage;

Questo sembra funzionare alla grande per la maggior parte. Quindi ho iniziato a testare alcuni valori ...

//enemyHealth ALWAYS starts at 1000
weaponDamage = 50;
playerAttack = 30;

Se imposto questi valori, la quantità di danno inflitta al nemico è 125. Sembrava un buon numero, quindi volevo vedere cosa sarebbe successo se l'attacco dei giocatori fosse stato massimizzato, ma con l'arma iniziale più debole.

weaponDamage = 50;
playerAttack = 100;

il totale del danno finisce per essere 300, il che ucciderebbe un nemico in pochi colpi. Anche con il tuo attacco così in alto, non vorrei che l'arma più debole fosse in grado di uccidere il nemico così velocemente. Ho pensato di aggiungere la difesa, ma sento che il gioco perderà consistenza e diventerà sbilanciato nel lungo periodo. Forse un algoritmo ben progettato per un modificatore di riduzione dell'arma funzionerebbe con armi di livello inferiore o qualcosa del genere. Ho solo bisogno di una pausa dal tentativo di capire il modo migliore per farlo, e forse qualcuno che ha esperienza con i giochi e mantiene costante il livellamento potrebbe darmi alcune idee / indicazioni.


2
Penso che abbiamo bisogno di un po 'più di informazioni. Quanto è facile livellare la tua playerAttackstatistica a 100? Considerando che questo è il valore massimo, non sarebbe appropriato uccidere il nemico in pochi colpi? (Il nemico da 1000 HP è qualcosa che vedresti all'inizio del gioco? Un nemico standard? Capo?)
Lee

Risposte:


14

La risposta fornita da Grzegorz Sławecki è già buona, ma volevo spiegare la logica alla base del suo metodo e darti gli strumenti per adattare le soluzioni alle tue esigenze di gioco.

I parametri del presente problema sono il livello di attacco a del giocatore a , il danno dell'arma w , il danno totale inflitto in un attacco d , la salute del nemico H e il numero minimo di colpi necessari per uccidere il nemico, chiamiamolo n .

Se vuoi che il giocatore uccida in n colpi, il suo danno totale d deve essere tale

(n-1) .d <H ≤ nd    o in altre parole, n = ceil (H / d) .

d dipende danno dell'arma w e del giocatore livello di attacco una e possiamo aspettarci armi per ottenere una migliore con l'aumentare del livello, quindi cerchiamo di scrittura d (a) e w (a) invece di d e w . Anche i nemici che il giocatore deve affrontare devono diventare più duri, quindi di nuovo H (a) . Queste sono tutte funzioni crescenti di a e vuoi che soddisfino le disequazioni di cui sopra. Le incognite del problema sono funzioni. Ne imposti uno come vincolo e trovi gli altri. Tuttavia hai dei gradi di libertà, il che è una buona cosa.

Se capisco bene la tua domanda, hai in mente un gameplay preciso, e questo gameplay è rappresentato principalmente dal numero di colpi necessari per uccidere il nemico, n (a) . Pertanto, imposta n (a) in base al gameplay che prevedi per il gioco, quindi trova il resto delle variabili del problema . Questo è ciò che dovresti sempre fare perché, come mostra la tua domanda, il tuo primo tentativo è stato quello di provare un algoritmo che pensavi potesse fare e poi realizzare che ha comportato un gameplay indesiderato.

Supponiamo, ad esempio, che tu voglia che il giocatore debba colpire sempre più volte mentre procede nel gioco. Volete anche che, man mano che aumenta il numero richiesto di colpi, aumenta sempre meno spesso, in modo che il giocatore spenda una parte più lunga del gioco colpendo 5 volte che 2 volte. Ecco come appare n (a) :

il desiderato n (a)

La funzione utilizzata è n (a) = ceil (2 / 3.sqrt (a)) .

Vogliamo che H (a) / d (a) rimanga all'interno degli intervalli di valori che fanno sì che n (a) abbia il valore desiderato e poiché n (a) = ceil (H (a) / d (a)) , questi intervalli sono i seguenti rettangoli:

n (a) e n (a) -1

e H (a) / d (a) può naturalmente essere impostato su 2 / 3.sqrt (a) in modo da ottenere il seguente grafico, con la curva rossa che è H (a) / d (a) :

n (a), n (a) -1 e H (a) / d (a)

Nota: possiamo facilmente trovare H (a) / d (a) qui perché conosciamo la funzione di cui n (a) è il ceil, ma se la nostra specifica per n fosse meno piacevole, dovremmo fare il nostro adattamento funzione usando vari trucchi. Non tutti i problemi sono così belli!

Quindi vogliamo che H (a) / d (a) assomigli a una funzione di radice quadrata personalizzata e sappiamo che H e d devono aumentare le funzioni. Le soluzioni sono molte. Per esempio,

H (a) = a. 2 / 3.sqrt (a)    e    d (a) = a

Una prima soluzione per H e d

Ma vorremmo che il danno e gli HP del nemico aumentassero moltissimo in modo che alla fine del gioco ci fossero numeri grandi e impressionanti, solo per stile, quindi abbiamo impostato

H (a) = a². 20 / 3.sqrt (a)    e    d (a) = 10.a²

Una soluzione migliore per H e d

L'intero punto, e la parte migliore, è questo: sai che le tue soluzioni al problema ( H (a) e d (a) ) obbediscono alle specifiche ( n (a) ), quindi ottieni lo stesso n (a) , ma hai libertà. Conosci esattamente la libertà che hai e puoi usarla per personalizzare l'esperienza. Dovresti sempre cercare di concederti tale libertà soddisfacendo le tue esigenze più importanti, quando possibile.

Ora che abbiamo scelto il danno da un colpo d (a) , e poiché d (a) dipende dal danno dell'arma w (a) , possiamo usare d (a) come nostra specifica e provare a trovare un w (a ) che ci dà questo d (a) . I principi sono gli stessi, il problema è diverso: vogliamo che il giocatore causi più danni all'aumentare del suo livello, anche con l'arma che rimane invariata e vogliamo anche che il danno aumenti quando l'arma da sola migliora e il livello rimane lo stesso.

Ma quale importanza dovrebbe avere ciascun fattore? Supponiamo di voler che il livello sia più importante delle armi: una parte maggiore delle variazioni di d (a) = a² dovrebbe essere indipendente da w (a) , ad esempio con

w (a) = 22.sqrt (a)    e, quindi,    d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))

Otteniamo il seguente grafico per w (a) ...

w (a)

... e sempre la stessa d (a) , perché abbiamo trovato di nuovo una soluzione che obbediva alla specifica , qui d (a) , e abbiamo le proprietà sopra menzionate con w e un contributo al danno (supponiamo di guardare d in funzione di a e w : quindi se a fosse fisso e avessimo w variare nell'equazione d (a, w) = a / 30.w , d sarebbe comunque una funzione crescente di w , e lo stesso vale se correggi w e ne fai una variazione).

Questo w (a) potrebbe darti il ​​valore da visualizzare nella descrizione del gioco dell'arma: ad esempio, otterremmo "Danno arma: 220" con l'arma migliore del gioco.

Avremmo potuto usare una specifica completamente diversa per il nostro gameplay e quindi per n (a) , ad esempio uno che fa aumentare rapidamente il numero di colpi richiesti man mano che il gioco procede e quindi plateau, e le soluzioni risultanti sarebbero state diverse.


Questo combina una solida comprensione della matematica con il gameplay come punto di partenza. Un'ottima risposta
Marcks Thomas,

1
@MarcksThomas Bene grazie! Vorrei che più persone definissero chiaramente le loro esigenze e costruissero i loro giochi da lì. In questo modo vedremmo giochi di qualità più completi e finiti.
jrsala,

Sì, sono d'accordo che questa è la risposta perfetta. L'ho letto con piacere :)
Grzegorz Sławecki il

1
Fantastico! Vorrei che questo tipo di matematica fosse una parte più regolare della letteratura sulla progettazione dei sistemi. (Forse dovrei scrivere il mio saggio sul danno contro gli scudi qualche volta ...)
Steven Stadnicki il

Ottima risposta, ma perché devi usare le variabili di un carattere nelle tue equazioni? Quante volte chiedo "Cosa significa di anuovo?" e scorrere verso l'alto?
Daniel Kaplan,

9

Ti consiglierei di progettare il tuo gioco dall'altra direzione: prima pensa a come vuoi che il tuo gioco funzioni (in termini di esperienza di gioco, non in termini di numeri), quindi progetta sia le formule che gli intervalli di numeri da ottenere quel risultato.

Il tuo obiettivo di gioco è che ci vuole un certo numero di colpi per uccidere un nemico. Quanti hit dipendono da tre variabili:

  • livello di potenza del nemico
  • livello di potenza del personaggio
  • livello di potenza dell'arma

Dovresti prima creare una tabella con tutte le possibili combinazioni di queste tre variabili di livello basso, medio o alto (non ci sono ancora numeri concreti, solo "basso", "medio" o "alto") e quanti hit desideri essere richiesto per queste combinazioni.

Quindi dovresti provare a trovare una formula e intervalli di valori che approssimi meglio i tuoi valori desiderati.


7

Il modo più semplice è aumentare esponenzialmente il danno dell'arma tra i livelli dell'arma.

Tuttavia, ciò che conta è che dovresti anche definire in che modo crescono HP di nemici quando diventano più forti. Quindi, quando sei molto forte, dovresti uccidere nemici facili con pochi colpi, ma quelli al tuo livello dovrebbero essere relativamente più difficili da uccidere rispetto ai nemici che erano al tuo livello all'inizio. Quindi lo progetterei per apparire un po 'come sotto:

level   weapon  enemy   attack  total   hits needed
        dmg     hp      factor  dmg     to kill
======================================================
1       1       2       5       1.25    1.6
2       4       16      10      6       2.666666667
3       9       54      15      15.75   3.428571429
4       16      128     20      32      4
5       25      250     25      56.25   4.444444444
6       36      432     30      90      4.8
7       49      686     35      134.75  5.090909091
8       64      1024    40      192     5.333333333
9       81      1458    45      263.25  5.538461538
10      100     2000    50      350     5.714285714
11      121     2662    55      453.75  5.866666667
12      144     3456    60      576     6
13      169     4394    65      718.25  6.117647059
14      196     5488    70      882     6.222222222
15      225     6750    75      1068.75 6.315789474
16      256     8192    80      128     6.4
17      289     9826    85      1517.25 6.476190476
18      324     11664   90      1782    6.545454545
19      361     13718   95      2075.75 6.608695652
20      400     16000   100     2400    6.666666667
Dove:
1. Il dmg totale viene calcolato usando la tua formula
2. arma dmg = livello * livello (crescita esponenziale)
3. HP nemico = 2 * livello * livello * livello (crescita esponenziale)
4. fattore di attacco = 5 * livello
5. i colpi necessari descrivono quanti colpi sono necessari al livello x e usando l'arma al livello x, per uccidere un nemico al livello x

Ho modificato quei costanti fattori nelle formule solo per ottenere risultati che ritengo accettabili, ma l'importante è dove vuoi una crescita lineare e dove vuoi esponenziale.

Dovresti anche notare che per esempio uccidere il nemico livello 20 con 100 attacchi e avere un'arma livello 1 che richiede un totale di 6 dmg richiederà molto tempo. Se secondo te ci vuole troppo, gioca con le costanti.


Cosa significa "fattore di attacco"?
Daniel Kaplan,

0

Penso che il metodo del mondo dell'artigianato da guerra sia uno dei migliori. Le statistiche di base dei giocatori hanno un basso impatto sul danno totale, con la maggior parte del modificatore del danno proveniente dalle statistiche bonus sull'equipaggiamento. Ciò rende molto più semplice espandere il gioco e bilanciarlo col passare del tempo

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.