2014-08-30 6 views
0

나는 CS193P의 첫 번째와 두 번째 수업을 배웠고 한 번에 하나씩 각 카드를 보여주기 위해 무작위 순서로 카드의 전체 데크를 통해 매치니스를 뒤집기를 요청하는 첫 번째 과제를 마쳤습니다. 여기서 물론,이 일을하기 전에, 내가 삭제 한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 

CardGameViewController.m의 내 코드 년대 "A ♣ ︎"먼저 데모를 teching의 버튼에 대한 힌트를 말해 나는 그것이 보여주는 와서해야하기 때문에 대신 카드의 뒷면. 나는 응용 프로그램을 성공적으로 구축하고 그것은 아주 잘 작동 보인다.

그러나, 할당의 힌트를 말해 :

좋은 해결책은 갑판에있는 모든 카드가 표시되어 사용자가 아직 반전을 유지하는 경우 발생하는 몇 가지 생각을 준 것입니다. 간단하고 합리적인 것을하십시오 (예를 들어, 어떤 방식 으로든 모델의 클래스를 수정하지 않아도 됨).

하지만 내 솔루션은 사용자가 카드를 뒤집어하게됩니다 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

당신은 cardDeck.h의 목적은 기억이

if (card) { 
     //flip the card 
} 

같은 if 문으로 포장해야하고, 우리는 이미이 카드가 부족하면 전무를 반환하는 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++; 
}