Please note, this blog entry is from a previous course. You might want to check out the current one.
Make this a two player game. There’s no need to go overboard here. Think of a simple UI and a straightforward implementation that make sense.
Create a new property to hold the separate scores of the players and another one to know the current player:
@property (strong, nonatomic) NSMutableArray *playerScores; // of NSNumber @property (nonatomic) int currentPlayer; ... - (NSMutableArray *)playerScores { if (!_playerScores) { _playerScores = [NSMutableArray arrayWithObjects:@0, @0, nil]; } return _playerScores; }
The score for the current player derives from the game score minus the score of the other player. When the score has decreased, the current player looses the turn …
- (void)calculateMultiPlayerScore { int otherPlayer = (self.currentPlayer + 1) % 2; int newScore = self.game.score - [self.playerScores[otherPlayer] intValue]; if (newScore < [self.playerScores[self.currentPlayer] intValue]) { self.playerScores[self.currentPlayer] = @(newScore); self.currentPlayer = otherPlayer; } else { self.playerScores[self.currentPlayer] = @(newScore); } }
It is calculated when a card has been flipped, or when cards have been added:
- (IBAction)flipCard:(UITapGestureRecognizer *)gesture { ... [self calculateMultiPlayerScore]; ... } - (IBAction)addCardsButtonPressed:(UIButton *)sender { if ([[self.game matchingCards] count]) { ... [self calculateMultiPlayerScore]; ... } }
The scores are displayed in the current score label, where the score of the current player is highlighted using attributed strings:
- (void)updateUI { ... NSString *text = [NSString stringWithFormat:@"P1: %@ P2: %@", self.playerScores[0], self.playerScores[1]]; NSMutableAttributedString *label = [[NSMutableAttributedString alloc] initWithString:text]; NSRange range = ]]; if (range.location != NSNotFound) { [label addAttributes:@{ NSStrokeWidthAttributeName : @-3, NSForegroundColorAttributeName : [UIColor blueColor] } range:range]; } self.scoreLabel.attributedText = label; self.resultOfLastFlipLabel.alpha = 1; self.resultOfLastFlipLabel.text = self.game.descriptionOfLastFlip; [self updateSliderRange]; }
… and the scores need to be reset when a new deck is dealt:
- (IBAction)dealButtonPressed:(UIButton *)sender { ... self.playerScores = nil; self.currentPlayer = 0; ... }
Finally you might need to adjust the size of the label and/or its content-hugging setting.
Because we should not go overboard … the game concept is a little bit flawed. There could be better ways to determine who is the current player … Also the high scores are still saved for the “complete” game and not for the individual player … but we did not want to go overboard 😉
The complete code is available on github.