2014-08-30 71 views
0

我已经学会了CS193P的第一堂课和第二堂课,并完成了第一个任务,让我让Matchismo以随机顺序翻阅整副扑克牌,每次只显示一张牌。这里是我的CardGameViewController.m的代码关于CS193P任务1的问题

#import "CardGameViewController.h" 
#import "Deck.h" 
#import "PlayingCardDeck.h" 

@interface CardGameViewController() 

@property (weak, nonatomic) IBOutlet UILabel *flipsLabel; 
@property (nonatomic) int flipCount; 
@property (strong, nonatomic) Deck *fullDeck; 

@end 

@implementation CardGameViewController 

- (void)setFlipCount:(int)flipCount{ 
    _flipCount = flipCount; 
    self.flipsLabel.text = [NSString stringWithFormat:@"Flips: %d",self.flipCount]; 
    NSLog(@"flipCount changed to %d",self.flipCount); 
} 

- (Deck *)fullDeck{ 
    if (!_fullDeck) _fullDeck =[[PlayingCardDeck alloc] init]; 
    return _fullDeck; 
    } 

- (IBAction)touchCardButton:(UIButton *)sender { 
    if (!sender.currentTitle) { 
    [sender setBackgroundImage:[UIImage imageNamed:@"cardfront"] 
         forState:UIControlStateNormal]; 
    [sender setTitle:[[self.fullDeck drawRandomCard] contents] 
      forState:UIControlStateNormal]; 
    } else { 
    [sender setBackgroundImage:[UIImage imageNamed:@"cardback"] 
         forState:UIControlStateNormal]; 
    [sender setTitle:nil forState:UIControlStateNormal]; 
} 

self.flipCount++; 
} 

@end 

当然,在此之前,我已经删除了“A♣︎”在第一次攀科技演示的按钮,因为提示告诉我,我应该让拿出展示而不是卡的背面。我成功构建应用程序,看起来工作得很好。

然而,转让的提示告诉我:

一个很好的解决方案将给予一些思想,如果在甲板上的每卡已被证明与用户仍保持翻转会发生什么。做一些简单明智的事情(例如,你不应该以任何方式修改模型中的类)。

但我的解决方案将让用户翻转卡infinitely.So我尝试如果()这样增加了达到目标:

- (IBAction)touchCardButton:(UIButton *)sender { 

    if (self.flipCount < 53){   /*There are 52 cards in a deck */ 
    if (!sender.currentTitle) { 
     [sender setBackgroundImage:[UIImage imageNamed:@"cardfront"] 
         forState:UIControlStateNormal]; 
     [sender setTitle:[[self.fullDeck drawRandomCard] contents] 
       forState:UIControlStateNormal]; 
    } else { 
     [sender setBackgroundImage:[UIImage imageNamed:@"cardback"] 
         forState:UIControlStateNormal]; 
     [sender setTitle:nil forState:UIControlStateNormal]; 
    } 

     self.flipCount++; 
} 
} 

然后当我运行应用程序,触摸屏,当fliplabel达到52时,它不会翻转。

这种解决方案是否幼稚和荒谬?我搜索了github以查看其他人的解决方案,似乎忽略了这些提示。可以与我分享您的想法吗?

任何建议将不胜感激!

回答

2

你只需要使用if语句来包装它像这样

if (card) { 
     //flip the card 
} 

记得cardDeck.h一个对象,我们已经设置Deck其用完卡时返回零。所以,一旦套牌用完卡片,它就会停止翻转

此外,最重要的是,没有幻数!即使你已经写了一个命令来解释它,你也不能仅仅抛出53。这只是一个不好的编程练习

- (IBAction)touchCardButton:(UIButton *)sender { 

    // No magic number! --> if (self.flipCount < 53){   

    if (!sender.currentTitle) { 
     Card *card = [self.fullDeck drawRandomCard]; 

     if (card) { // <----- this is what I'm talking about 
      [sender setBackgroundImage:[UIImage imageNamed:@"cardfront"] 
          forState:UIControlStateNormal]; 
      [sender setTitle:card.contents 
        forState:UIControlStateNormal]; 
     } 
    } else { 
     [sender setBackgroundImage:[UIImage imageNamed:@"cardback"] 
         forState:UIControlStateNormal]; 
     [sender setTitle:nil forState:UIControlStateNormal]; 
    } 
     self.flipCount++; 
}