在Matchismo任务2中重新启动物体-重新开始游戏



我试图解决作业2从斯坦福iOS7开发(Matchismo卡牌游戏)

游戏运行良好。现在我必须添加Restart功能。如果用户按下重启按钮,游戏将重新开始(游戏邦注:它会发新牌并重置分数)

我的游戏模型是@property (nonatomic, strong) CardMatchingGame *game;

这是CardMatchingGame.m的代码:

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


@interface CardMatchingGame()
@property (nonatomic, readwrite) NSInteger score;
@property (nonatomic, strong) NSMutableArray *cards;
@end
@implementation CardMatchingGame

static const int MATCH_BONUS = 4;
static const int MATCH_PENALTY = 2;
static const int COST_TO_CHOOSE = 1;
-(NSMutableArray *)cards{
    if(!_cards) _cards = [[NSMutableArray alloc]init];
    return _cards;
}
-(instancetype)initWithCardCount:(NSUInteger)count usingDeck:(Deck *)deck{
    self = [super init];
    if(self){
        for(int i=0; i < count; i++){
            Card *card = [deck drawRandomCard];
            if(card){
                [self.cards addObject:card];
            } else{
                self = nil;
                break;
            }
        }
    }
    return self;
}
-(void)chooseCardAtIndex:(NSUInteger)index{
    Card *card = [self cardAtIndex:index];
    if(!card.isMatched){
        if(card.isChosen){
            card.chosen = NO;
        } else{
            for(Card *otherCard in self.cards){
                if(otherCard.isChosen && !otherCard.isMatched){
                    int matchScore = [card match:@[otherCard]];
                    if(matchScore){
                        self.score += matchScore * MATCH_BONUS;
                        card.matched = YES;
                        otherCard.matched = YES;
                    } else{
                        self.score -= MATCH_PENALTY;
                        otherCard.chosen = NO;
                    }
                    break;
                }
            }
            self.score -= COST_TO_CHOOSE;
            card.chosen = YES;
        }
    }
}
-(Card *)cardAtIndex:(NSUInteger)index{
    return (index < [self.cards count]) ? self.cards[index] : nil;
}

@end

这里是我的CardGameViewController.m:

#import "CardGameViewController.h"
#import "PlayingCardDeck.h"
#import "CardMatchingGame.h"
@interface CardGameViewController ()

@property (nonatomic, strong) Deck *deck;
@property (nonatomic, strong) CardMatchingGame *game;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardsCollection;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@end
@implementation CardGameViewController
@synthesize game = _game;
-(CardMatchingGame *)game{
    if(!_game) _game = [[CardMatchingGame alloc] initWithCardCount:[self.cardsCollection count]
                                                         usingDeck:self.deck];
    return _game;
}
-(Deck *)deck{
    if(!_deck) _deck = [[PlayingCardDeck alloc] init];
    return _deck;
}
- (IBAction)touchRestartButton:(id)sender {
    self.game = nil;
    [self updateUI];
}
- (IBAction)touchCardButton:(UIButton *)sender {
    int chosenButtonIndex = [self.cardsCollection indexOfObject:sender];
    [self.game chooseCardAtIndex:chosenButtonIndex];
    [self updateUI];


}
-(void)updateUI{
   for(UIButton *cardButton in self.cardsCollection){
        int buttonIndex = [self.cardsCollection indexOfObject:cardButton];
        Card *card = [self.game cardAtIndex:buttonIndex];
        [cardButton setTitle:[self titleForCard:card] forState:UIControlStateNormal];
        [cardButton setBackgroundImage:[self backgroundImageForCard:card] forState:UIControlStateNormal];
        cardButton.enabled = !card.isMatched;
    }
    self.scoreLabel.text = [NSString stringWithFormat:@"Score: %d", self.game.score];
}
-(NSString *)titleForCard:(Card *)card{
    return card.isChosen ? card.contents : @"";
}
-(UIImage *)backgroundImageForCard:(Card *)card{
    return [UIImage imageNamed: card.isChosen ? @"cardfront" : @"cardback"];
}
@end

为了重新启动游戏,我认为我应该简单地重新初始化属性CardMatchingGame *game。

这就是我想做的,通过设置self.game = nil;,然后它应该自动在game的getter中重新初始化。

这确实是我在网上找到的解决方案。然而,在我的程序中,它不起作用。*游戏设置为nil,永远不会恢复,所以当你点击重启游戏结束。

你能帮我弄清楚为什么self.game = nil在我的情况下不起作用吗?

- (IBAction)startover:(UIButton *)sender {
    self.game= [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:[self createDeck]];
    [self updateUI];
}

如果您的程序具有推荐的惰性初始化样式,则不需要使用诸如重新开始之类的新方法。你自我设定是正确的。Game变成nil,现在调用getter会启动一个新的Game实例。我在self之后调用了UIUpdate。Game = nil。它调用getter并惰性地初始化游戏的新实例

最新更新