Estoy escribiendo una versión para computadora del juego Dominion . Es un juego de cartas por turnos donde las cartas de acción, las cartas del tesoro y las cartas de puntos de victoria se acumulan en el mazo personal de un jugador. Tengo la estructura de clase bastante bien desarrollada, y estoy empezando a diseñar la lógica del juego. Estoy usando python, y puedo agregar una GUI simple con pygame más tarde.
La secuencia de turnos de los jugadores se rige por una máquina de estados muy simple. Los giros pasan en sentido horario, y un jugador no puede salir del juego antes de que termine. El juego de un solo turno también es una máquina de estados; en general, los jugadores pasan por una "fase de acción", una "fase de compra" y una "fase de limpieza" (en ese orden). Basado en la respuesta a la pregunta ¿Cómo implementar un motor de juego por turnos? , la máquina de estados es una técnica estándar para esta situación.
Mi problema es que durante la fase de acción de un jugador, ella puede usar una carta de acción que tenga efectos secundarios, ya sea en sí misma o en uno o más de los otros jugadores. Por ejemplo, una carta de acción le permite a un jugador tomar un segundo turno inmediatamente después de la conclusión del turno actual. Otra carta de acción hace que todos los demás jugadores descarten dos cartas de sus manos. Sin embargo, otra carta de acción no hace nada para el turno actual, pero permite que un jugador robe cartas adicionales en su próximo turno. Para complicar aún más las cosas, con frecuencia hay nuevas expansiones en el juego que agregan nuevas cartas. Me parece que codificar los resultados de cada tarjeta de acción en la máquina de estado del juego sería feo e inadaptable. La respuesta al bucle de estrategia por turnos no entra en un nivel de detalle que aborde los diseños para resolver este problema.
¿Qué tipo de modelo de programación debo usar para abarcar el hecho de que el patrón general para tomar turnos puede modificarse mediante acciones que tienen lugar dentro del turno? ¿Debería el objeto del juego hacer un seguimiento de los efectos de cada carta de acción? O, si las tarjetas deben implementar sus propios efectos (por ejemplo, mediante la implementación de una interfaz), ¿qué configuración se requiere para darles suficiente potencia? He pensado algunas soluciones a este problema, pero me pregunto si hay una forma estándar de resolverlo. Específicamente, me gustaría saber qué objeto / clase / lo que sea responsable de realizar un seguimiento de las acciones que cada jugador debe hacer como consecuencia de una carta de acción que se está jugando, y también cómo se relaciona eso con los cambios temporales en la secuencia normal de La máquina de estado de giro.