Sto cercando di decidere quale sia la migliore architettura per un gioco multiplayer a turni in cui i giocatori possono essere umani o AI e l'interfaccia utente è opzionale, ad esempio perché il gioco può essere utilizzato solo per far combattere le IA contro l'altro.
Prendiamo il gioco più semplice possibile, tic-tac-toe, e ho usato una classe come questa:
class TicTacToeGame {
mark(cell) {
//make something happen
}
}
Nella più semplice implementazione del mio gioco potrei avere un'interfaccia utente con un gestore di clic:
function onClick(cell) {
ticTacToeGame.mark(cell);
refreshUI();
}
Questo codice forse funziona bene quando ci sono solo giocatori umani, ma se avessimo giocatori di IA e giochi "senza testa" diventerebbe insufficiente.
Quali sono alcune idee per espandere questo codice per gli altri casi d'uso (AI, gioco senza testa)?
Una prima soluzione sarebbe usare il modello classico dell'osservatore. Usando questa idea, più giocatori si iscriverebbero al gioco e verrebbero avvisati quando sarà il loro turno. Allo stesso modo, l'interfaccia può essere registrata e notificata quando devono essere visualizzate nuove configurazioni diverse.
Quindi in quel caso la classe di gioco cambierebbe in questo modo:
class TicTacToeGame {
constructor() {
this.observers = [];
}
subscribe(observer) {
this.observers.push(observer);
}
mark(cell) {
//make something happen
this.observers.forEach(o => o.notify(this));
}
}
dove gli osservatori sarebbero i giocatori e l'interfaccia utente:
...
ticTacToeGame.register(AI);
ticTactoeGame.register(UI);
...
ma questa soluzione sembra un po 'troppo generica e non sono del tutto sicuro del modo migliore per descrivere il fatto che le IA possono rappresentare (per esempio) il primo e il terzo giocatore in un gioco.
Una soluzione più avanzata sarebbe utilizzare il pattern di osservatore per l'interfaccia utente, ma mantenere un sistema dedicato per i giocatori:
class TicTacToeGame {
constructor() {
this.observers = [];
this.players = [];
}
subscribe(observer) {
this.observers.push(observer);
}
addPlayer(player) {
this.players.push(player);
}
mark(cell) {
//make something happen
this.players[this.currentPlayerIndex].notify(this);
this.observers.forEach(o => o.notify(this));
}
}
Ma le cose cominciano a diventare più complesse, e non sono sicuro che la modellazione di un giocatore umano avrebbe molto senso ora.
Non ho mai scritto un gioco nella mia vita quindi non sono del tutto sicuro se ci sono forse schemi che dovrei sapere o se la soluzione è più dipendente dal contesto.
Quali sono le tue opinioni sul mio progetto iniziale?
Potrebbe anche essere importante aggiungere che il contesto in cui vorrei scrivere il gioco è il web e che il framework UI sarebbe React.