Note: I am aware of the poor wording of the title but I was unable to come up with a better one. If anyone has a better idea, then please edit the title.
I'm trying to recreate a card game but kind of struggling with a problem. Every card in the game has a color
(enum) and rank
(enum). Some of the cards have some special abilities which require additional data. These cards always have a special color only given to cards with special abilities. The Game
has a stack to which played cards are added through a method void playCard(Card)
.
An example special ability is changing the color of the card on the top of the stack. The new color is totally up to the player to decide. The problem is that this new color needs to be decided when the card is played and before that the special card's color is just SPECIAL
. But how do I pass the new color data in a nice way (i.e. so I don't need to use instanceof
and extract the data but just get it as card.getColor()
)? Ideally I'd like it to be a special card before and after playing it to disguise as a normal card (or make it seem like to). If possible I'd still want to be able to retrieve the original, special card.
I thought about solving this by creating a FakeCard
and adding a method to SpecialCard
to generate the FakeCard
and pass the required data to that method but I'm afraid of additional coupling that would occur as different special cards require different additional data and don't want to violate Open/Closed principle (using this approach would require me to). I can't think of anything else though. Do you have any suggestions as to how approach this problem?
SPECIAL
but after I place it I'd like it to change color to which the player wants. I've done it this way because of the mechanics of this game (you can play a card if it's color matches with the one on top of the stack). It just plays nicely this way without any additional methods for special cards. I need to remember the original card because the game has a specified amount of each of the cards and briefly one of the mechanics is taking a card.