Sono relativamente nuovo allo sviluppo del gioco, quindi ho deciso di creare un progetto per hobby da zero sia per esperienza che per intrattenimento. Il gioco specifico è simile al poker noto come Three Card Brag. Il gioco è giocato nel film Lock, Stock e Two Smoking Barrels.Strategia di gioco e strategia di progettazione per un gioco di carte multiplayer
Ho letto alcuni degli argomenti su SO relativi allo sviluppo del gioco, anche se principalmente this question. Questo ha aiutato a rinnovare il modo originale in cui stavo creando gli oggetti.
Un problema particolare che sto riscontrando è la definizione dello stato del gioco. Il mio approccio iniziale era quello di separare tutto (ad esempio mantenendo stack di chip all'interno di una classe Player
) ma dopo aver letto le risposte allo question che ho menzionato in precedenza, sembra che tutti gli stati possibili del gioco debbano essere mantenuti all'interno di un oggetto GameState
. Quello che mi è venuta è essenzialmente questo:
abstract class CardGameState
{
protected List<Player> _Players;
protected Player _CurrentPlayer;
protected Dictionary<Player, int> _Chips;
protected Dictionary<Player, Hand> _CurrentHand;
protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
/* etc. */
dove ogni CardGameState
viene modificato da qualche azione:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
Ora mi sento molto fortemente che questo sta sconfiggendo lo scopo della programmazione orientata agli oggetti , poiché i dati relativi al giocatore (in questo caso, il suo stack di chip, la mano e lo stato corrente) non sono incapsulati dall'oggetto Player
.
D'altra parte, se un giocatore dovesse aumentare la scommessa, mi sarebbe la creazione di un RaiseAction
che implementa IAction
, ma l'interfaccia IAction
accetta solo l'attuale stato del gioco, che non credo sarebbe l'ideale se il gli stack di chip sono stati memorizzati nella classe Player
.
Fondamentalmente, la mia domanda è: posso avere il meglio di entrambi i mondi in modo tale che possa avere una rappresentazione esatta dello stato del gioco mantenendo contemporaneamente tutti i dati relativi ad un oggetto nello stato di gioco all'interno dell'oggetto dato?
Ehi John, stavo solo rivedendo questa domanda e mi sono reso conto che potresti anche ottenere il meglio da entrambi i mondi sostituendo IAction.Applica con un IState.Applica utilizzando il modello di visitatore. Probabilmente è troppo tardi ora, ma comunque potrebbe essere un server come riferimento futuro. –