Negli ultimi mesi ho lavorato con la mia versione di un famoso gioco da tavolo. Dopo molte sperimentazioni, sono arrivato su alcuni punti chiave che descrivono il mio sistema:
- Lo stato del gioco è centralizzato e serializzabile. Il server può essere interrotto in qualsiasi momento, ma semplicemente estraendo lo stato dall'archiviazione, un giocatore può riprendere il gioco esattamente dove si è fermato
- Le regole del gioco sono semplicemente una funzione dello stato
(state, ...args) => newState
- I client interagiscono e modificano lo stato tramite azioni , descritto da una regola che modifica lo stato di conseguenza (vedi punto sopra) e un valori function
(state, player) => args[]
, che, dato lo stato corrente e il giocatore, restituisce i valori validi (se presenti) per quel particolare tipo di azione. Questo è usato per informare il cliente delle sue azioni valide e anche come validatore per le azioni in arrivo - Il giocatore sceglie una delle possibili azioni, lo invia al server nella forma
{type, args}
, che convalida l'azione contro i possibili valori per quella particolare azione tipo ed esegue la corrispondente regola , restituendo il nuovo stato al giocatore
Non sono riuscito a trovare uno schema ben noto che potrebbe darmi qualche idea su come sfruttare al meglio l'implementazione. Non sto cercando di calzare qualcosa qui per il gusto di farlo, cercando solo di capire da una linea guida generale e altri casi simili nella vita reale da cui ho potuto imparare.
In un certo senso, funziona come una macchina a stati, con qualche tipo di comando paattern e un sistema RPC per mediare tra client / server che attiva le modifiche di stato.
Sto cercando un approccio funzionale qui, quindi nessuna modifica di oggetti e tutti gli effetti dipendono esclusivamente dallo stato del gioco. Inoltre, sto sviluppando questo in JavaScript, ma non penso che importi molto.