首页 > 如果在UI上想做一个重置游戏数据的按钮,那么在控制器中需要做什么?

如果在UI上想做一个重置游戏数据的按钮,那么在控制器中需要做什么?

开始游戏时:

点击Re-Deal按钮后:

再点击头像发现Score并未重置为0

请问在控制其中如何做到当点击Re-Deal按钮后,重新开始游戏时让Score重置为0.

    //  ViewController.m

#import "ViewController.h"
#import "PlayingCardDeck.h"
#import "CardMatchingGame.h"

@interface ViewController ()
@property (nonatomic,strong) Deck *deck;
@property (nonatomic,strong) CardMatchingGame *game;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
@property (weak, nonatomic) IBOutlet UILabel *scoreLable;

@end

@implementation ViewController

- (IBAction)touchReDealCardButton {
    [self reDealUI];
}

- (void)reDealUI
{
    for (UIButton *cardButton in self.cardButtons) {
        NSUInteger cardIndex = [self.cardButtons indexOfObject:cardButton];
        Card *card = [self.game cardAtIndex:cardIndex];
        [cardButton setTitle:@"" forState:UIControlStateNormal];
        [cardButton setBackgroundImage:[UIImage imageNamed:@"cardback"] forState:UIControlStateNormal];
        cardButton.enabled = YES;
        card.matched = NO; 
        card.chosen = NO;
    }
    self.scoreLable.text = [NSString stringWithFormat:@"Score: 0"]; 
}

#pragma mark - game
- (CardMatchingGame *)game
{
    if (!_game) {
        _game = [[CardMatchingGame alloc] initWithCardCount:self.cardButtons.count usingDeck:self.deck]; 
    }
    return _game;
}

#pragma mark - deck
- (Deck *)deck
{
    if (!_deck) {
        _deck = [self createDeck];
    }
    return _deck;
}

- (Deck *)createDeck
{
    return [[PlayingCardDeck alloc] init]; 
}

#pragma mark - touchCardButton
- (IBAction)touchCardButton:(UIButton *)sender {
    NSUInteger cardIndex = [self.cardButtons indexOfObject:sender]; // 得倒这个发送按钮在数组中的什么地方
    [self.game chooseCardAtIndex:cardIndex]; // 让游戏选择那一下标处的纸牌!
    [self updateUI]; // 更新UI,控制器的首要任务之一:它会同步模型和UI
}

#pragma mark - updateUI
- (void)updateUI   // 遍历所有纸牌按钮,获得那个纸牌按钮,同时在模型中观察相应纸牌,确保纸牌按钮展示出它所应该展示的纸牌内容
{
    for (UIButton *cardButton in self.cardButtons) { // 得倒纸牌按钮和纸牌
        NSUInteger cardIndex = [self.cardButtons indexOfObject:cardButton];
        Card *card = [self.game cardAtIndex:cardIndex]; 
        [cardButton setTitle:[self titleForCard:card] forState:UIControlStateNormal]; 
        [cardButton setBackgroundImage:[self backgroundImageForCard:card] forState:UIControlStateNormal];
        cardButton.enabled = !card.isMatched; 
    }
    self.scoreLable.text = [NSString stringWithFormat:@"Score: %ld",self.game.score]; 
}

- (NSString *)titleForCard:(Card *)card
{
    return card.isChosen ? card.contents : @"";
}

- (UIImage *)backgroundImageForCard:(Card *)card
{
    return [UIImage imageNamed:card.isChosen ? @"cardfront" : @"cardback"];
}

@end

self.scoreLable.text 的设置一共在两个地方出现了。分别在:

reDealUI 函数中的:

self.scoreLable.text = [NSString stringWithFormat:@"Score: 0"];

还有 updateUI 函数中的:

self.scoreLable.text = [NSString stringWithFormat:@"Score: %ld",self.game.score];

所以是不是只要在 reDealUI 的时候一起 self.game.score = 0 了就好了?


建议把一切初始化的操作封装成一个函数,这样不管是重新开始游戏还是第一次开始游戏都调用这个函数用于游戏初始化行为的函数

【热门文章】
【热门文章】