Sto scrivendo una versione per computer del gioco Dominion . È un gioco di carte a turni in cui le carte azione, le carte tesoro e le carte punto vittoria vengono accumulate nel mazzo personale di un giocatore. Ho una struttura di classe abbastanza ben sviluppata e sto iniziando a progettare la logica del gioco. Sto usando Python e potrei aggiungere una semplice GUI con Pygame in seguito.
La sequenza di turni dei giocatori è governata da una macchina a stati molto semplice. Il turno passa in senso orario e un giocatore non può uscire dal gioco prima che sia finito. Il gioco di un singolo turno è anche una macchina a stati; in generale, i giocatori passano attraverso una "fase di azione", una "fase di acquisto" e una "fase di pulizia" (in questo ordine). Basato sulla risposta alla domanda Come implementare il motore di gioco a turni? , la macchina a stati è una tecnica standard per questa situazione.
Il mio problema è che durante la fase di azione di un giocatore, può usare una carta azione che ha effetti collaterali, sia su se stessa, sia su uno o più degli altri giocatori. Ad esempio, una carta azione consente a un giocatore di effettuare un secondo turno immediatamente dopo la conclusione del turno corrente. Un'altra carta azione fa sì che tutti gli altri giocatori scartino due carte dalle loro mani. Ancora un'altra carta azione non fa nulla per il turno corrente, ma consente a un giocatore di pescare carte extra nel suo turno successivo. Per rendere le cose ancora più complicate, ci sono spesso nuove espansioni nel gioco che aggiungono nuove carte. Mi sembra che codificare con esattezza i risultati di ogni carta azione nella macchina a stati del gioco sarebbe sia brutto che inadattabile. La risposta al ciclo strategico a turni non entra in un livello di dettaglio che affronta i progetti per risolvere questo problema.
Che tipo di modello di programmazione dovrei usare per comprendere il fatto che il modello generale per i turni può essere modificato da azioni che si svolgono all'interno del turno? L'oggetto di gioco dovrebbe tenere traccia degli effetti di ogni carta azione? Oppure, se le carte dovessero implementare i propri effetti (ad esempio implementando un'interfaccia), quale configurazione è richiesta per dare loro abbastanza energia? Ho escogitato alcune soluzioni a questo problema, ma mi chiedo se esiste un modo standard per risolverlo. In particolare, mi piacerebbe sapere quale oggetto / classe / qualunque cosa sia responsabile di tenere traccia delle azioni che ogni giocatore deve fare in conseguenza di una carta azione giocata, e anche come ciò si riferisce a cambiamenti temporanei nella normale sequenza di la macchina a virata.