È possibile implementare un gioco multiplayer completamente senza stato?

-3

Sto affrontando una sfida per capire come programmare una versione web di un gioco di carte completamente senza stato.

Creo il mio grafico ad oggetti quando il gioco inizia e distribuisco le carte su PlayerA e PlayerB, quindi le dispongo sullo schermo. A questo punto potrei pensare che HTML e la querystring siano ciò che detiene almeno alcuni del mio stato e mantenere solo una copia istantanea dello stato del gioco sul lato server al solo scopo di convalidare gli input Ricevo dai client web.

Ancora mi sembra che lo stato del gioco sia per sua natura mutabile: le carte vengono distribuite dal mazzo, ecc.

Non lo capisco? O dovrei semplicemente sforzarmi di minimizzare gli effetti collaterali delle mie funzioni sugli oggetti che prendo come input? Come progetteresti un gioco di carte senza stato?

    
posta Lorenzo 01.09.2012 - 17:56
fonte

2 risposte

2

Un gioco single player può essere completamente apolide se l'intera descrizione del gioco viene trasmessa su ogni richiesta. Un gioco di scacchi contro un programma per computer implementato dal tuo server potrebbe semplicemente inviare la posizione completa dopo ogni mossa.

È difficile vedere come un gioco multiplayer può essere completamente apolide: qualcuno deve tenere traccia di chi sono i giocatori e chi deve essere informato dei cambiamenti di stato, e almeno ricorda lo stato "in transito" abbastanza a lungo da consentire a tutti i giocatori di riceverlo.

In ogni caso, il ruolo principale del server può essere solo quello di inviare pacchetti di bit tra i client, e solo bisogno di tenere traccia di dove i bit dovrebbero andare. A seconda di la natura del gioco, i bit potrebbero dover essere autenticati in qualche modo per prevenire l'imbroglio, ad esempio aggiungendo un checksum alle parti che i client non dovrebbero essere in grado di cambiare.

    
risposta data 01.09.2012 - 18:47
fonte
2

Non è stato ciò che causa problemi di scalabilità, ma stare al passo con lo stato .

Non so se devi progettare un'interfaccia REST, che è su trasferimento di stato , non statelesness . Statelesness significherebbe che fare la stessa azione due volte ha lo stesso risultato.

Questo non vale nemmeno per HTTP. Se esegui due volte una richiesta DELETE, il secondo è praticamente destinato a fallire.

Se stai sviluppando un gioco basato su HTML, niente ti impedisce di mantenere lo stato sul client in JavaScript.

Nei server, il problema con lo stato è solitamente la sua mutabilità:

  • ottenere i dati modificati a metà (ad esempio, se un cavaliere degli scacchi si muove, cambiano entrambe le coordinate: se una parte del sistema ottiene i dati con solo una delle coordinate modificate, ci sarebbero potenziali problemi)
  • cambio di dati tra il trasferimento : supponiamo A chiamate B, ed entrambi usano C. A presuppone che C abbia un certo stato, e si aspetta che B si comporti di conseguenza. Eppure nel frattempo, C è cambiato, e B si comporta diversamente. Si verificano errori.

Inoltre, c'è un problema con concorrenza :

  • i componenti paralleli che ottengono uno stato diverso e pensano il loro è giusto: questo è chiamato conflitto . Un esempio potrebbe essere, quando in una partita in tempo reale, colpisci un avversario, anche un avversario ti colpisce, ed entrambi i colpi sono fatali. Ognuno di loro penserebbe che l'altro sia morto e hanno vinto

E infine, c'è un problema con archiviazione e recupero e fallimento :

  • componenti morenti : supponiamo che ci sia un negozio online e che l'utente abbia un cestino. Se il paniere è gestito da un singolo compoennt, potrebbe morire se ci sono troppi clienti. Se è gestito da 10 componenti, ognuno dei quali gestisce un sottoinsieme di clienti, cosa succede se muore il componente che gestiva lo stato dell'utente corrente?

Quindi, lo stato è normale. Fa parte della vita. I computer riguardano le interazioni: un computer non interattivo si chiama libro o giornale, o piuttosto un poster (come un libro ha sia stati aperti che chiusi). Interazione cambia stato . Mentre cerchiamo di ridurre al minimo il mantenimento dello stato, non possiamo evitarlo per natura.

    
risposta data 02.09.2012 - 01:29
fonte

Leggi altre domande sui tag