Estou escrevendo uma versão em computador do jogo Dominion . É um jogo de cartas baseado em turnos, onde cartas de ação, cartas de tesouro e cartas de pontos de vitória são acumuladas no baralho pessoal de um jogador. Eu tenho a estrutura de classes muito bem desenvolvida e estou começando a projetar a lógica do jogo. Estou usando python, e posso adicionar uma GUI simples com pygame mais tarde.
A sequência de turnos dos jogadores é governada por uma máquina de estado muito simples. Os turnos passam no sentido horário e um jogador não pode sair do jogo antes que ele termine. A jogada de um único turno também é uma máquina de estado; em geral, os jogadores passam por uma "fase de ação", uma "fase de compra" e uma "fase de limpeza" (nessa ordem). Com base na resposta à pergunta Como implementar o mecanismo de jogo baseado em turnos? , a máquina de estado é uma técnica padrão para essa situação.
Meu problema é que, durante a fase de ação de um jogador, ele pode usar uma carta de ação que tenha efeitos colaterais, seja em si mesma ou em um ou mais dos outros jogadores. Por exemplo, uma carta de ação permite que um jogador faça um segundo turno imediatamente após a conclusão do turno atual. Outra carta de ação faz com que todos os outros jogadores descartem duas cartas de suas mãos. Ainda outra carta de ação não faz nada no turno atual, mas permite que um jogador compre cartas extras no próximo turno. Para tornar as coisas ainda mais complicadas, frequentemente existem novas expansões no jogo que adicionam novas cartas. Parece-me que codificar os resultados de todas as cartas de ação na máquina de estado do jogo seria feio e não adaptável. A resposta ao loop estratégico baseado em turnos não entra em um nível de detalhe que aborda os projetos para resolver esse problema.
Que tipo de modelo de programação devo usar para abranger o fato de que o padrão geral de revezamento pode ser modificado por ações que ocorrem dentro do turno? O objeto do jogo deve acompanhar os efeitos de cada carta de ação? Ou, se os cartões implementarem seus próprios efeitos (por exemplo, implementando uma interface), que configuração é necessária para fornecer energia suficiente? Eu pensei em algumas soluções para esse problema, mas estou me perguntando se existe uma maneira padrão de resolvê-lo. Especificamente, eu gostaria de saber qual objeto / classe / o que é responsável por acompanhar as ações que todo jogador deve executar como consequência de uma carta de ação ser jogada, e também como isso se relaciona a mudanças temporárias na sequência normal de a máquina de estado de virada.