2009-09-03 13 views
6

In un gioco manageriale online (come Hattrick), voglio simulare le partite tra due squadre.Simulazione di partite sportive nel gioco online

Una squadra è composta da 11 giocatori. Ogni giocatore ha un valore di forza compreso tra 1 e 100. Prendo questi valori di forza dei giocatori difensivi per ogni squadra e calcolando la media. Questa è la qualità difensiva di una squadra. Poi prendo i punti di forza dei giocatori offensivi e ottengo la qualità offensiva.

Per ogni attacco, faccio la seguente:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive); 
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive); 

Al momento, non so perché mi dividerlo per quella più alta di entrambi i valori. Ma questa formula dovrebbe darti un fattore per la qualità di attacco e difesa che è necessario in seguito.

Quindi ho annidato le istruzioni condizionali per ogni evento che potrebbe accadere. E.g .: La squadra attaccante ha una possibilità di punteggio?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds 

Questi fattori aggiuntivi potrebbero essere valori tattici, ad esempio.

Pensi che sia un buon modo per calcolare un gioco? I miei utenti dicono che non sono soddisfatti della qualità delle simulazioni. Come posso migliorarli? Hai approcci diversi che potrebbero dare risultati migliori? O pensi che il mio approccio sia buono e ho solo bisogno di regolare i valori nelle dichiarazioni condizionali e sperimentare un po '?

Spero che tu possa aiutarmi. Grazie in anticipo!

+0

Che cosa rappresentano esattamente i 10 nei calcoli in questa simulazione? –

+0

E per quanto riguarda la qualità delle simulazioni non sono soddisfatti? –

+0

@Kyle Walsh: i 10 vengono utilizzati solo perché le funzioni mt_rand() accettano solo valori interi. Voglio generare un valore casuale compreso tra -1 (o superiore in base a fattori aggiuntivi) e +1 come valore in virgola mobile. – caw

risposta

19

Ecco un modo per farlo.

qualità offensiva/difensiva

primo luogo permette di lavorare fuori la forza media di tutta la squadra:

Team.Strength = SUM(Players.Strength)/11 

Ora vogliamo dividere fuori lato in due, e stabilirne la media per il nostro giocatori difensivi, e i nostri giocatori offensivi.]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count 
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count 

Ora, abbiamo tre valori. Il primo, fuori dalla media della squadra, verrà utilizzato per calcolare le nostre probabilità di vincita. Gli altri due calcoleranno le nostre probabilità di difesa e le nostre probabilità di segnare.

Una squadra con un'alta media offensiva avrà più possibilità, una squadra con un'alta difesa avrà maggiori possibilità di risparmio.

Ora, se dobbiamo squadre, consente di chiamarli A e B.

squadra A, hanno una media di 80 anni, Un punteggio offensivo di 85 e un punteggio difensivo del 60.

squadra B, avere una media di 70, un punteggio offensivo di 50 e un punteggio difensivo di 80.

Ora, in base alla media. La squadra A dovrebbe avere maggiori possibilità di vincere. Ma da quanto?

Scoring e salvataggio

Consente di capire quante volte gli obiettivi della squadra A deve segnare:

A.Goals = (A.Offensive/B.Defensive) + RAND() 
     = (85/80) + 0.8; 
     = 1.666 

ho assunto il valore casuale aggiunge nulla tra -1 e +1, anche se è possibile aggiustalo.

Come possiamo vedere, la formula indica che la squadra A dovrebbe segnare 1,6 goal. possiamo arrotondare questo su/giù. O dare la squadra A 1 e calcolare se l'altra è consentita (possibilità casuale).

Ora per la squadra B

B.Goals = (B.Offensive/A.Defensive) + RAND() 
     = (50/60) + 0.2; 
     = 1.03 

quindi abbiamo un punteggio 1 e B segnando 1. Ma ricordate, vogliamo pesare questo a favore di A, in quanto, nel complesso, sono la squadra migliore.

Quindi, qual è la possibilità che A vinca?

Chance A Will Win = (A.Average/B.Average) 
        = 80/70 
        = 1.14 

Quindi possiamo vedere che le probabilità sono del 14% (.14) in favore di A vincere la partita. Possiamo usare questo valore per vedere se c'è qualche cambiamento nel punteggio finale:

if Rand() <= 0.14 then Final Score = A 2 - 1 B Otherwise A 1 - 1 B 

Se il nostro numero a caso era 0,8, quindi la partita è un pareggio.

arrotondamento e ulteriormente Pensieri

Sarà sicuramente voglia di giocare con i valori. Ricorda, le meccaniche di gioco sono molto difficili da ottenere. Parla con i tuoi giocatori, chiedi loro perché sono insoddisfatti. Ci sono squadre che perdono sempre? Le simulazioni sono sempre stagnanti? ecc.

Il profilo di cui sopra è profondamente influenzato dalla casualità della selezione. Dovrai normalizzarlo in modo che le possibilità di una squadra di segnare 5 goal in più siano molto rare. Ma un po 'di casualità è un ottimo modo per aggiungere una certa varietà al gioco.

Ci sono modi per modificare anche questo metodo. Per esempio, invece del numero di goal, potresti usare la cifra Obiettivo come numero di probabilità di punteggio, e poi avere un'altra funzione che ha elaborato il numero di goal in base ad altri fattori (es. Scegliere un attaccante casuale e usarlo singolarmente statistiche, e i portieri, per capire se c'è un obiettivo)

Spero che questo aiuti.

+0

Grazie mille! :) Per favore dai un'occhiata al mio commento alla risposta di Kylotan riguardo alla divisione. Pensi che la divisione sia più adeguata della differenza? – caw

+0

Perché B.Goals = (B.Offensive/A.Defensive) + RAND()? – Mathias

+0

@Mathias Allo stesso modo in cui prendiamo A.Goals = (A.Offensive/B.Defensive) + RAND() scambiamo la variabile intorno a B.Goals. Confrontiamo l'offensiva di ogni squadra con la difesa delle squadre avversarie. Il casuale c'è qualche variazione. – AAA

0

La media dovrebbe essere il numero di giocatori ... utilizzando il massimo significa che se avete 3 squadre giocatore:

[4 4 4]

[7 4 1]

Il secondo uno sarebbe considerato più debole. E 'questo quello che vuoi? Penso che preferireste fare qualcosa del tipo:

(punteggio totale/giocatori totali) + (punteggio massimo/giocatori totali), quindi nell'esempio precedente renderebbe la seconda squadra leggermente migliore.

Immagino che dipenda da come pensi che le squadre debbano essere equilibrate.

+0

Grazie per la risposta. So come calcolare i valori medi e l'ho già implementato. $ attackerTeam_offensive è la media dell'attacco dell'attaccante e $ defenderTeam_defensive è la media della difesa del difensore. Ma non so perché divido la loro differenza con quella più alta di entrambi i valori. E non so se la mia tecnica/metodo è buono. – caw

3

La divisione nel tuo esempio è probabilmente una cattiva idea, perché cambia la scala della variabile di uscita a seconda di quale lato è migliore. Generalmente quando si confrontano due quantità si vogliono dati di intervallo (sottraendoli l'uno dall'altro) o dati di rapporto (dividono l'uno con l'altro) ma non entrambi.

Un approccio migliore in questo caso sarebbe quello di dividere semplicemente il punteggio offensivo per il punteggio difensivo. Se entrambi sono uguali, il risultato sarà 1. Se l'attaccante è migliore del difensore, sarà maggiore di 1, e se il difensore è più forte, sarà inferiore a uno. Questi sono numeri facili con cui lavorare.

Inoltre, invece di calcolare la media dell'intera squadra, le parti medie della squadra dipendono dalle formazioni o dalle tattiche utilizzate. Ciò consentirà alle squadre di scegliere di giocare in modo offensivo o difensivo e vedere i pro ei contro di questo.

E scrivi te stesso alcune migliori funzioni di generazione di numeri casuali. Uno che restituisce valori in virgola mobile tra -1 e 1 e uno che funziona da 0 a 1, per i principianti. Usa questi nei tuoi calcoli e puoi evitare tutti quelli che confondono 10 in tutto il mondo!

+0

Grazie mille! Non penso che dividere i due valori di forza sia una buona idea. I fattori cambieranno in modo sbilanciato e otterrai una parabola: 6/1 = 6, 6/2 = 3, 6/3 = 2 Questo non dovrebbe essere il caso, dovrebbe? La differenza è un modo abbastanza migliore, credo. – caw

+0

Un altro argomento contro la divisione: i valori da 4/2 a 4/3 stanno cadendo mentre i valori da 2/4 a 3/4 stanno aumentando. Questo è totalmente indesiderato, non è vero? Ciò significherebbe: come squadra di casa, è bello essere più forti. Come squadra ospite, è bello essere più deboli. ;) – caw

+0

Prendo già le medie di parti della squadra. Ho $ attackTeam_offensive e $ attackTeam_defensive. O intendi che dovrei dividere l'offensiva in più parti come la parte destra e quella sinistra? – caw

3

Si potrebbe anche voler chiedere agli utenti cosa circa la simulazione che non mi piace. È possibile che, piuttosto che vedere l'esito finale del gioco, vogliano sapere quante volte la loro squadra ha avuto l'opportunità di attaccare, ma la difesa ha riguadagnato il controllo. Così, invece di

"Your team wins 2-1"

Vogliono vedere Match Highlights:

 
"Your team wins 2-1: 
- scored at minute 15, 
- other team took control and went for tried for a goal at minute 30, 
    but the shoot was intercepted, 
- we took control again and $PLAYER1 scored a beautiful goal! 
... etc 

È possibile utilizzare qualcosa di simile a ciò che suggerisce Jamie per un punto di partenza, scegliere gli orari in modo casuale, e magari raccogliere autore del gol basato su un campionamento ponderato dei giocatori offensivi (ad esempio, un giocatore con un punteggio più alto ha una maggiore probabilità di essere colui che ha segnato). Puoi divertirti e aggiungere eventi casuali a bassa probabilità come un cartellino rosso su un giocatore, qualcuno che si ferisce, streakers attraverso il campo ...

4

La decisione tattica più elementare nel calcio è scegliere formation, che è un insieme di tre numeri che assegnano i 10 giocatori esterni a difesa, centrocampo e attacco, rispettivamente, ad es 4/4/2.

Se si utilizza la forza media giocatore, non si limita a perdere quella tattica, lo avete tornare indietro: la difesa più forte è uno con un singolo giocatore molto buono, dandogli alcun aiuto renderà più probabile che l'altra squadra Punto. Se hai un giocatore con un punteggio di 10, la media è 10. Aggiungi un altro con punteggio 8, e la media scende (a 9). Ma assegnare più persone alla difesa dovrebbe renderlo più forte, non più debole.

Quindi, per prima cosa, vuoi che tutto sia basato sul totale, non sulla media. Il rapporto tra i totali è un buon modo indipendente dalla scala per determinare quali squadre sono più forti e di quanto. I rapporti tendono ad essere migliori delle differenze, perché funzionano in modo prevedibile con team di qualsiasi livello di forza. Puoi impostare uno combat results table che dice quanti goal sono segnati (per partita, per metà, per mossa o altro).

La prossima scelta tattica è se sia meglio avere un giocatore eccezionale, o parecchi buoni. Puoi chiarire che impostando scenari che rappresentano le cose che accadono nel gioco, ad es. un 1 contro 1, un angolo o una palla lunga. I giocatori coinvolti in uno scenario vengono prima scelti a caso, quindi il risultato dello scenario viene tirato per. Un risultato può essere l'avvio di un altro scenario (il passaggio del centrocampo porta a un vantaggio incrociato per l'intestazione).

Il passaggio finale, che ti porterà praticamente al livello dei giochi di manager di calcio reali, è quello di dare ai giocatori più di un tipo di valutazione della forza, ad esempio, direzione, passaggio, tiro e così via. Quindi si utilizza la valutazione della forza appropriata allo scenario in cui si trovano.

+0

Grazie! "stai andando all'indietro: la difesa più forte è quella con un solo giocatore molto bravo, dandogli qualche aiuto renderà più probabile il punteggio della squadra avversaria". Puoi spiegare questo in modo più dettagliato? Quindi dovresti prendere il rapporto invece della differenza? – caw

+2

Se hai un giocatore con un punteggio di 10, la media è 10. Aggiungi un altro con punteggio 8 e la media scende (a 9). Ma assegnare più persone alla difesa dovrebbe renderlo più forte, non più debole. I rapporti tendono ad essere migliori delle differenze, perché funzionano in modo prevedibile con team di qualsiasi gamma di punti di forza. – soru