Comprensione dei requisiti
- Tutti i giocatori hanno un numero limitato di nemici adiacenti.
Prima di tutto, stiamo parlando dei punti di spawn dei giocatori, non della posizione attuale dei giocatori in un determinato punto del gioco. Basta toglierlo di mezzo.
Adiacente è ben definito quando parliamo di un grafico. Possiamo pensare a una mappa che rappresenti la navigabilità sulla mappa - d'ora in poi "il grafico".
Se il nodo can può avere al massimo un punto di spawn, allora ha senso parlarne come "adiacente". Nota: non vincolerò i nodi in modo che abbiano al massimo un singolo punto di spawn, per ragioni che appariranno in seguito.
Per costruire il grafico dovremo considerare cose come muri, ponti, scale, punti di teletrasporto o anche considerare lo spazio di volo se ci potrebbe essere un giocatore in grado di volare. Ogni nodo rappresenta una posizione percorribile; ogni connessione rappresenta un possibile movimento.
Nota: conoscere le dimensioni e la forma dei nodi e lavorare con nodi effettivamente adiacenti. Non considerare i nodi un punto. Non considerare le connessioni come lunghezze. Inoltre, utilizzare i nodi convessi.
Il grafico avrebbe potuto essere precompilato (la mappa è stata creata da un designer); in caso contrario, può essere creato al volo se la mappa viene generata casualmente.
- Tutti i giocatori hanno le stesse possibilità di incontrare nemici adiacenti.
Presumo che i nemici siano altri giocatori. Ancora una volta, basta toglierlo di mezzo.
Supponendo che ogni giocatore faccia una passeggiata casuale, la probabilità di trovare un giocatore in un determinato punto - su uno spazio piatto, privo di ostacoli - sarà data da una funzione (gaussiana) della distanza dal punto di spawn - da ora in poi "il funzione".
Dato che stiamo lavorando sul grafico, annoteremo invece i valori sul grafico.
- La dimensione della mappa non deve aumentare proporzionalmente al numero di giocatori.
Se avessimo il vincolo di avere un singolo punto di spawn per nodo, quindi per aggiungere più giocatori avremmo bisogno di nodi più piccoli. Se decidiamo il grafico prima di sapere quanti giocatori avremo, potremmo dover suddividere i nodi per quel particolare gioco.
- Queste limitazioni non vengono applicate con spazi invalicabili arbitrari.
Non intendo aggiungere ostacoli per risolvere il problema. Al contrario , ho bisogno di lavorare intorno agli ostacoli. Se non ci fossero, l'implementazione sarebbe più semplice.
Soluzione
Stiamo cercando di posizionare N punti di spawn in modo tale che la possibilità di incontrare un altro giocatore in tutti quei punti di spawn sia uguale.
Possiamo ottenere una misura dell'errore come la somma delle differenze delle probabilità rispetto alla media delle possibilità. Stiamo cercando di minimizzarlo (in effetti, vogliamo renderlo 0).
Per fare ciò, dobbiamo conoscere la possibilità di incontrare un giocatore su ciascun nodo del grafico.
Per calcolare quella possibilità, inizia con zero. Poiché la possibilità di trovare un giocatore su un dato nodo, quando non ci sono giocatori, è zero. Quindi, per ogni punto di spawn, cammina sul grafico aggiungendo alla possibilità annotata il valore della funzione per il punto di spawn corrente.
Nota 1: L'aggiunta o lo spostamento di un punto di spawn influenzerà la possibilità di incontrare un giocatore per tutta la mappa.
Nota 2: tenere traccia di quanto ogni punto di spawn influenza il caso, renderà le cose più facili.
Nota 3: poiché i nodi hanno dimensioni, quanto vicino si può arrivare a errore = zero dipende dalla dimensione dei nodi. Puoi essere più preciso lavorando con intervalli di valori (probabilità minima e massima, a seconda della posizione particolare dei punti di spawn all'interno del nodo).
Posiziona i punti di spawn in modo casuale, quindi inizia a spostarli in modo tale che l'errore si riduca (considera un possibile movimento e, se causa l'errore, mantienilo, altrimenti ripristinalo). E continua a farlo fino a quando non possiamo migliorare ulteriormente (troppe iterazioni senza miglioramento o l'errore è zero).
Nota 4: quando sposti un punto di spawn, puoi usare la possibilità di incontrare un giocatore (escluso il punto di spawn che ti sposterai) per selezionare casualmente una nuova posizione per un punto di spawn in modo tale da avere una possibilità di incontrare un giocatore più vicino la media è più probabile. Ti ricordo che lo spostamento del punto di spawn influirà sulla media.
Il comportamento previsto è che i punti di spawn troppo vicini si allontanino e i punti di spawn troppo distanti si avvicinano. Fino a quando non raggiungono l'equilibrio.
Se in una data iterazione hai più punti di spawn su un nodo (il che è improbabile, dal momento che dovrebbero tendere a separarsi, ma possibile se hai nodi abbastanza grandi), dividi il nodo e continua a risolvere. Qualsiasi divisione del nodo è valida.
La soluzione precedente si avvicinerà all'errore = zero, ma non è garantito che raggiunga lo zero. Puoi farlo è eseguirlo fino a raggiungere un minimo locale ... In teoria, puoi quindi dividere i nodi per renderlo esattamente zero ... Tuttavia, ciò equivale a modificare le coordinate del punto di spawn!
Prova a ricottura simulata per spostare il punto di spawn all'interno del nodo. Anche se, onestamente, probabilmente non vale la pena preoccuparsi di un tale livello di dettaglio.
Voglio chiarire che il risultato per una mappa piatta priva di ostacoli non sarà distribuito uniformemente punti. Invece, se la mappa ha bordi (ovvero, se non si avvolge), allora ci sarà più punto di spawn più vicino ai bordi, questo perché i punti al centro possono essere raggiunti da più direzioni, aumentando la possibilità di incontrare altri giocatori lì. Pertanto, punti più distanti vicino al centro per compensare.