Rendere equi i punti di spawn casuali?


22

Se tutti i giocatori vengono generati in posizioni casuali alla stessa distanza dai giocatori adiacenti, il numero di giocatori sarà proporzionale alla probabilità che le loro posizioni di spawn siano ingiuste. Più i giocatori si avvicinano al centro della mappa, più è probabile che incontrino altri giocatori e meno è probabile che sopravvivano, rispetto ai giocatori sul bordo della mappa. Supponiamo che tutti i giocatori vengano generati contemporaneamente.

C'è un modo per modellare i punti di spawn o cambiare la mappa, in modo che:

  1. Tutti i giocatori hanno un numero limitato di nemici adiacenti.
  2. Tutti i giocatori hanno le stesse possibilità di incontrare nemici adiacenti.
  3. La dimensione della mappa non deve aumentare proporzionalmente al numero di giocatori.
  4. Queste limitazioni non vengono applicate con spazi invalicabili arbitrari.

La risposta non deve essere perfetta, ma ovviamente migliore dell'alternativa. Pensare fuori dalla scatola benvenuto.


10
Spawnare in un cerchio?
Zibelas,

1
@Zibelas Approccio tradizionale, ma viola il requisito 3 e con molti giocatori questo crea una mappa enorme e interni vuoti.
inadeguato,

4
Dipende dal tuo tipo di gioco. (2D / 3D, respawn / last man in piedi, ecc.) In questo caso la spawn perfetta è possibile solo su un mondo a forma di palla (più giocatori, spawn più vicini ma puoi garantire che hanno tutti la stessa distanza). In un mondo 2D con bordi fissi hai sempre meno giocatori confinanti poiché non hai spazio per generarli. Se è un gioco 3D, puoi avere più livelli.
Zibelas,

1
Penso che aiuterebbe a sapere che tipo di gioco stai realizzando. Sembra una specie di gioco di guerra, ma quali sono i dettagli? È un tiratore? Inizi con tutte le tue armi o devi esplorare e trovare cose? Qual è la condizione di vittoria? Quanto dura una partita?
RothX,

3
Non per una risposta completa, ma penso che tutti stiano cercando un "spawn equo ed equilibrato" che ... non è divertente. Guarda l'eccellente spawn di PUBG (e altri Battle Royale): i giocatori possono "spawn" (beh, saltare e atterrare ...) quasi dove vogliono - se vuoi conflitti e drammi, scegli il luogo in cui la maggior parte dei giocatori atterra / spawn. Alta ricompensa per il rischio elevato, ma solo se il giocatore lo desidera. Puoi atterrare da qualche parte nei boschi, hai tempo per prepararti - bassa ricompensa a basso rischio ma alcuni giocatori potrebbero preferirla (come me, per esempio;)). NON è casuale, dipende dai giocatori.
Jan 'splite' K.

Risposte:


27

Lascia che i giocatori scelgano da soli le posizioni di partenza.

All'inizio del gioco, genera tutti i giocatori al centro della mappa, ma senza alcun mezzo per danneggiare gli altri giocatori. Dovranno quindi sciamare e acquisire i mezzi per impegnarsi a vicenda (costruire una base, raccogliere un'arma, raccogliere risorse, ecc.)

C'è un po 'di fortuna o conoscenza della mappa per trovare una buona posizione di partenza in anticipo (a seconda che tu usi mappe procedurali o fatte a mano). Ma quando e dove stabilirsi è principalmente una decisione strategica. La distribuzione anticipata ti offre un vantaggio in termini di tempo, ma ti mette in una posizione pericolosa. Scegliere la base con attenzione ti mette indietro nel gioco iniziale, ma può essere un vantaggio decisivo nel gioco di metà e fine.


3
@Shashimee In realtà credo di aver visto questo metodo prima in Anno 1602. Credo anche che alcuni dei primi giochi di C&C lo avessero come opzione di gioco multiplayer opzionale (ma non sono sicuro se lo ricordo correttamente).
Philipp,

3
@Philipp MULE per il commodore 64 di circa 15 anni e ti permette di scegliere anche le tue posizioni :)
Zibelas,

Quindi si verifica il problema in cui si viene seguiti al punto di spawn. Questo potrebbe, ovviamente, essere desiderato come meccanico di gioco, ma potrebbe anche essere estremamente frustrante e non qualcosa che decidi di volere nel tuo gioco. Una buona idea sarebbe quella di far apparire i personaggi invisibili e privi di collisioni tra i giocatori e trovare la loro base prima di iniziare il gioco.
Dent7777,

Questo è il metodo usato dalla linea "Vampirism" e "Tree Tag" di gamemodes personalizzati su Warcraft 3. Funziona meglio poiché tutti i giocatori sono alleati (almeno inizialmente) e la squadra avversaria viene rilasciata in seguito.
Kroltan,

Questo ha anche il vantaggio di sentirsi meno ingiusto. Se si generano casualmente e rapidamente muoiono o subiscono penalità, ciò può sembrare ingiusto, anche se è abbastanza giusto. Se stai scegliendo dove generare la morte o le penalità possono sembrare meno ingiuste e punitive perché scegliere i punti di spawn è un'abilità in sé e qualcosa in cui puoi migliorare. Detto questo, se scegliere i punti di spawn è davvero difficile, potrebbe anche sembrare ingiusto perché i giocatori più qualificati farebbero molto meglio.
Anubian Noob,

9

Comprensione dei requisiti

  1. 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.

  1. 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.

  1. 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.

  1. 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.


6

Dipende dal tipo di gioco che vuoi creare e da quanto è veloce. La perfetta distribuzione uniformemente distanziata è possibile su una sfera come il mondo (per esempio l'annichilamento planetario). Ma è una buona opzione nel tuo gioco? Anche se tutte le persone si generano alla stessa distanza, alcuni spawn potrebbero comunque avere un vantaggio migliore.

  • Armi più vicine / migliori nel raggio di azione / più risorse
  • Migliore copertura / più nascosto / panoramica
  • il "flusso" dei giocatori, alcuni posti sono più attraenti di altri (pensa a una mappa forestale completa con una casa singola in un posto, indipendentemente da dove si trovi quella casa, buone probabilità che la gente lo controlli)

La tua mappa è fissa o generata in modo procedurale? Hai mai provato a giocare a Age of Empires con 8 persone su una mappa per 2 persone? Non è possibile ridimensionare infinitamente i giocatori senza apportare modifiche alle dimensioni della mappa. Anche un posizionamento iniziale ingiusto può portare molta dinamica nel gioco (vedi la serie Worms). Nessuno si è lamentato se si è generato proprio in un grande ammasso, fintanto che la tua alleanza di un round con un altro giocatore è durata o non hai avuto i vermi più sopravvissuti dopo il primo round.

(Aggiungerò alcuni altri esempi se so di più sul tuo tipo di gioco)


5

Cercare qualcosa che non è stato suggerito finora: crealo in modo che non ci sia centro della mappa. Ciò che intendo con questo è che i bordi della mappa si uniscono ai lati opposti. Ciò richiederebbe molto lavoro di programmazione, ma in pratica può far ripetere all'infinito il livello se si cammina in una direzione. Ciò significa che non esiste un centro e una posizione di spawn casuale non avrà vantaggi o svantaggi.

Puoi farlo creando una mappa piatta che è quadrata e unendo ciascun bordo a una copia del bordo opposto. Quando un giocatore esce di lato, viene teletrasportato all'insaputa del giocatore sul bordo opposto. Naturalmente, teoricamente non saresti in grado di vedere i giocatori dall'altra parte del confine. Per risolvere questo problema, crea cloni di quel giocatore che sembrano camminare dall'altra parte del confine in modo da poterli vedere, e quando corri verso di loro ti teletrasporti attraverso e il giocatore reale si trova dove si trovava il manichino.

In alternativa, l'intera mappa potrebbe esistere all'esterno di una sfera, tuttavia ciò rende le coordinate difficili da generare.


2
O crea una mappa che, beh, al centro, puoi cacciare o cacciare molto più facilmente, e puoi anche trovare il bottino più facile, ma ancora una volta, sei molto più possibile essere cacciato in questo modo, e in aree non centrali, fai in modo che i giocatori abbiano meno probabilità di trovare altri utenti e bottino, quindi se vogliono più bottino dovranno andare al centro, se vogliono sopravvivere più a lungo, dovranno rimanere dove sono. Quindi, fondamentalmente, lo svantaggio delle spawn casuali è un vantaggio.
Ave

4

Ecco alcune possibili soluzioni:

  • Genera in modo casuale sulla circonferenza del cerchio
  • Genera in modo casuale sui raggi (non si genera per chiudere il centro)
  • Aggiungi un componente casuale del tempo di spawn

Diagramma dei meccanismi di generazione


La seconda immagine è un'ottima opzione. Risolve il problema della prima opzione in cui il giocatore sa esattamente dove si trovano tutti gli altri giocatori.
Zanon,

@Zanon anche se con la prima immagine i giocatori possono (e probabilmente lo faranno) allontanarsi prima che qualcuno arrivi. La seconda causa spawn ingiusti, alcuni vicini ad altri. Forse qualcosa di simile questo dove ci sono 2 cerchi e la differenza tra un più piccolo e più grande è dove deporre le uova, seconda immagine in modo simile, ma meno al centro.
Ave

1

Fondamentalmente credo che questo sia un problema di distribuzione del grafico. Supponendo una situazione di deathmatch (ogni altro giocatore è un nemico), devi modellare le tue mappe come un grafico interconnesso e tracciare il nodo sul grafico a cui ogni giocatore è più vicino. Non tutti i nodi devono essere un punto di spawn, ma è necessario il grafico complesso per modellare le distanze tra i punti di spawn. Al momento della generazione, stai quindi ripetendo il grafico e assegnando un punteggio a ciascun nodo riproducibile in base al fatto che i nodi vicini abbiano giocatori.

Il nodo ideale ha quindi:

  • Nessun giocatore al momento
  • Più di zero giocatori nei nodi vicini (qualche piccolo numero di collegamenti)

Immagina che il tuo grafico sia stato regolarizzato e stai disegnando zone concentriche attorno a ciascun nodo. Si penalizza il nodo se le zone interne contengono già giocatori e si premiano i nodi che hanno giocatori alla giusta distanza. Vuoi incoraggiare la generazione abbastanza vicino agli altri giocatori da poter trovare rapidamente interesse, ma non così vicino da saltare prima che abbiano avuto la possibilità di orientarsi.

Si sarà necessario aumentare le dimensioni della mappa, come il numero di giocatori cresce, ma la knecessità di non essere 1 o più. Il tuo caso peggiore sarà comunque che ogni nodo sul grafico abbia almeno un giocatore - nel qual caso non ci sono buoni nodi da usare, e dovrai soffrire quel caso e generare un giocatore sapendo che lo faranno atterrare proprio sopra l'altro. L'algoritmo di calcolo del punteggio dovrebbe comunque ponderare i nodi in modo da spawn nel nodo con il minor numero di altri giocatori.

Tieni presente che il tuo grafico della mappa dovrà essere costruito con cura, con la conoscenza della mappa, i suoi percorsi, eventuali punti di controllo e la distanza effettiva tra i punti del nodo, non la distanza effettiva . Come in, usa qualcosa come il tempo misurato per attraversare i nodi piuttosto che la distanza, per tenere conto di terreni più difficili. Inoltre è necessario tenere conto di apertura vs copertura; due nodi potrebbero essere fisicamente distanti, ma poiché sono molto aperti, la generazione di un giocatore su ciascun nodo potrebbe significare che sono altrettanto vulnerabili come se li avessi generati uno accanto all'altro.

perfezionamenti:

  • Aggiungi una penalità temporanea per segnare se un giocatore si è generato di recente in quel nodo, per impedire la formazione di chokepoints (un flusso infinito di giocatori che provengono dalla stessa direzione e vengono espulsi)
  • Aggiungi casualità all'interno di un intervallo (ad esempio, scegli i migliori 3 nodi e poi scegli casualmente tra loro con uguale probabilità) per ottenere più variazioni.
  • Aggiungi un peso iniziale al centro della mappa (o ai punti più interessanti) quando nessuno è stato ancora generato, in modo da spawnare in luoghi noti, anche quando ogni nodo ha un punteggio pari a zero perché non sono presenti altri giocatori.

0

Alcuni altri hanno già discusso dei limiti dei tuoi requisiti (la mappa dovrà ridimensionarsi ad un certo punto per prevenire il sovraffollamento, ecc.) E alla fine hanno eluso il fatto che probabilmente non esiste un algoritmo di posizionamento "perfetto". Quando probabilmente non esiste un algoritmo "perfetto", guardo sempre all'euristica. Hai diversi criteri che sono in contrasto diretto o indiretto tra loro, insieme a uno spazio di ricerca molto complicato. Trovare una soluzione ottimale potrebbe non essere fattibile o pratico, ma con un po 'di sintonizzazione, un approccio statistico può funzionare molto bene la maggior parte delle volte.

Affrontare il tuo terzo e quarto criterio: "La mappa non dovrebbe espandersi."

Vorrei assicurarmi che all'inizio abbiate un'abbondanza di nodi (cioè: denso come una rete di navigazione per la ricerca di percorsi). Questo rende il calcolo della distanza ad altri giocatori più costoso (non nodi direttamente vicini), ma questo non è un processo che accadrà più di una volta per round (presumo). Un vantaggio di questo è che puoi usare una libreria nav pre-rollata per la maggior parte delle tue operazioni. Inoltre, questo rispetterà l'attraversamento degli ostacoli in un modo equo in cui la distanza euclidea potrebbe non (i giocatori in un labirinto potrebbero essere messi più vicini che in un campo aperto)

Calcola l'euristica per le caratteristiche di spawn desiderate:

Dopo aver posizionato casualmente tutti i giocatori, calcola le prestazioni dei nodi circostanti in base ai tuoi criteri (distanza dagli altri giocatori, distanza di spawn, ecc.) I pesi dei tuoi valori possono essere modificati e manipolati per essere non lineari per ottimizzare esattamente le prestazioni vuoi in un caso ideale igienizzato (griglia rettangolare piatta senza ostacoli) e le prestazioni dovrebbero essere simili quando aggiungi di nuovo il mondo. Da lì puoi decidere quanti nodi cercare, qual è la soglia per spostare un punto di partenza e quante iterazioni vuoi eseguire prima di finalizzare la spawn e iniziare il gioco.


0

Se il campo di gioco è un toro topologico (ovvero un rettangolo in cui andare "fuori limite" significa entrare dalla parte opposta), è probabile che questa sia una buona risposta: il giocatore si jgenera x = (pjW/N) mod W, y = (qjH/N) mod H, dove W,Hsono le dimensioni del rettangolo, Nè il numero di giocatori e p,qsono numeri interi da determinare; sono distinti, (probabilmente) relativamente primi, e non troppo distanti sqrt(N). I punti di spawn formano un motivo obliquo a "sfondo".

Questo suppone che i giocatori si generino solo all'inizio del gioco. Se si generano più tardi, immagino che vorresti metterli il più lontano possibile dalla posizione attuale di qualsiasi giocatore - al vertice del diagramma Voronoi definito dagli altri giocatori.


0

Che ne dite di:

Ogni giocatore è circondato da una casella (o un cerchio) non spawn .

Come in, c'è un quadrato di una certa dimensione che si genera intorno a ogni giocatore e segue quel giocatore in giro - nessun altro giocatore può spawnare all'interno di quel quadrato.

Questi quadrati influenzano solo la generazione e non altri movimenti durante il gioco.

Funziona con la generazione solo iniziale o con la generazione continua.

(I punti indicano i giocatori e il verde indica la possibile area di spawn per i nuovi giocatori)

La dimensione della mappa non deve aumentare proporzionalmente al numero di giocatori

Per far fronte a questo, puoi fare una delle due cose: (o entrambe)

  • Riduci le dimensioni delle caselle non generate in base al numero di giocatori.
  • Consenti a un massimo di X giocatori nemici di spawnare in ogni riquadro.
    • Questo numero può aumentare man mano che procedi (a partire da 0).
    • Variante 1: hanno una scatola più piccola senza spawn e una scatola più grande con spawn limitato.
    • Variante 2: probabilità di peso in base alla vicinanza del nuovo spawn a questo giocatore (se all'interno della scatola) - potrebbe essere difficile da implementare in modo efficiente.
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.