Soy relativamente nuevo en el desarrollo de juegos, así que decidí que quería crear un proyecto de hobby desde cero tanto para la experiencia como para el entretenimiento. El juego específico es similar al póker conocido como Three Card Brag. El juego se juega en la película Lock, Stock y Two Smoking Barrels.Estrategia de diseño y arquitectura del juego para un juego de cartas multijugador
He estado leyendo sobre algunos de los temas en SO con respecto al desarrollo de juegos, aunque en su mayoría this question. Esto me ayudó a renovar la forma original en que estaba creando los objetos.
Un problema particular que estoy teniendo es definir el estado del juego. Mi enfoque inicial fue separar todo (por ejemplo, mantener pilas de fichas dentro de una clase Player
) pero después de leer las respuestas al question que mencioné anteriormente, parece que todos los estados posibles del juego deberían mantenerse dentro de un objeto GameState
. Lo que se me ocurrió es esencialmente esto:
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. */
donde cada CardGameState
se modifica mediante algún tipo de acción:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
ahora me siento muy fuertemente que este es derrotar el propósito de la programación orientada a objetos , porque los datos específicamente relacionados con el jugador (en este caso, su pila de fichas, mano y estado actual) no están encapsulados por el objeto Player
.
Por otro lado, si un jugador fuera a subir la apuesta, estaría creando un RaiseAction
que implementa IAction
, pero la interfaz IAction
sólo acepta el estado actual del juego, que no creo que sería ideal si el las pilas de fichas se almacenaron dentro de la clase Player
.
Básicamente, mi pregunta es: ¿puedo tener lo mejor de ambos mundos para que pueda tener una representación exacta del estado del juego y al mismo tiempo mantener todos los datos relacionados específicamente a un objeto dentro del estado del juego dentro de su objeto dado?
Hola, John, solo estaba revisando esta pregunta y me di cuenta de que también puedes obtener lo mejor de ambos mundos al reemplazar IAction. Aplicar con un IState. Aplicar con el patrón de visitante. Probablemente sea demasiado tarde ahora, pero de todos modos podría servir como referencia futura. –