J'écris une version informatique du jeu Dominion . Il s'agit d'un jeu de cartes au tour par tour où les cartes d'action, les cartes au trésor et les cartes de points de victoire sont accumulées dans le jeu personnel d'un joueur. J'ai la structure de classe assez bien développée et je commence à concevoir la logique du jeu. J'utilise python, et je peux ajouter une interface graphique simple avec pygame plus tard.
La séquence de tours des joueurs est régie par une machine d'état très simple. Les tours passent dans le sens des aiguilles d'une montre et un joueur ne peut pas quitter le jeu avant la fin. Le jeu d'un seul tour est également une machine d'état; en général, les joueurs passent par une "phase d'action", une "phase d'achat" et une "phase de nettoyage" (dans cet ordre). Basé sur la réponse à la question Comment implémenter le moteur de jeu au tour par tour? , la machine d'état est une technique standard pour cette situation.
Mon problème est que pendant la phase d'action d'un joueur, elle peut utiliser une carte d'action qui a des effets secondaires, soit sur elle-même, soit sur un ou plusieurs des autres joueurs. Par exemple, une carte action permet à un joueur de prendre un deuxième tour immédiatement après la fin du tour en cours. Une autre carte d'action oblige tous les autres joueurs à se défausser de deux cartes de leurs mains. Une autre carte action ne fait rien pour le tour en cours, mais permet à un joueur de piocher des cartes supplémentaires lors de son prochain tour. Pour rendre les choses encore plus compliquées, il y a souvent de nouvelles extensions dans le jeu qui ajoutent de nouvelles cartes. Il me semble que coder en dur les résultats de chaque carte d'action dans la machine d'état du jeu serait à la fois laid et inadaptable. La réponse à la boucle de stratégie au tour par tour n'entre pas dans un niveau de détail qui traite des conceptions pour résoudre ce problème.
Quel type de modèle de programmation dois-je utiliser pour englober le fait que le schéma général de la rotation peut être modifié par des actions qui ont lieu pendant la rotation? L'objet de jeu doit-il garder une trace des effets de chaque carte action? Ou, si les cartes doivent implémenter leurs propres effets (par exemple en implémentant une interface), quelle configuration est requise pour leur donner suffisamment de puissance? J'ai pensé à quelques solutions à ce problème, mais je me demande s'il existe un moyen standard de le résoudre. Plus précisément, je voudrais savoir quel objet / classe / quoi que ce soit qui est responsable du suivi des actions que chaque joueur doit faire à la suite de la lecture d'une carte d'action, et aussi comment cela se rapporte aux changements temporaires dans la séquence normale de la machine d'état de virage.