【问题标题】:Issues about assignment 1 of CS193PCS193P作业1的问题
【发布时间】:2014-08-30 08:16:41
【问题描述】:

我已经学习了 CS193P 的第一课和第二课,并完成了第一项作业,该作业要求我让 Matchismo 以随机顺序翻阅一副扑克牌,一次显示一张牌。这是我的 CardGameViewController.m 代码

#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

当然,在此之前,我先删除了teching demo按钮上的“A♣︎”,因为提示告诉我应该让它显示卡的背面。我成功构建了应用程序它似乎工作得很好。

但是,作业的提示告诉我:

一个好的解决方案会考虑如果牌堆中的每张牌都已显示并且用户仍然不断翻转会发生什么。做一些简单而明智的事情(例如,您不应该以任何方式修改模型中的类)。

但我的解决方案会让用户无限地翻转卡片。所以我尝试通过添加这样的 if() 来达到目标​​:

- (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++;
}
}

然后当我运行应用程序并触摸屏幕时,当翻转标签达到 52 时,它将不再翻转。

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

任何建议将不胜感激!!!

【问题讨论】:

    标签: ios iphone ios7 cs193p


    【解决方案1】:

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

    if (card) {
           //flip the card
    }
    

    记住cardDeck.h的一个对象,我们已经设置Deck在卡用完时返回nil。所以,一旦牌库用完卡,它就会停止翻转

    另外,最重要的是,没有幻数!即使您编写了一个命令来解释它,您也不能像那样随便扔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++;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多