Вопросы о назначении 1 из CS193P
Я выучил первый и второй урок 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
Конечно, прежде чем сделать это, я сначала удалил "A♣ of" на кнопке показа демо, потому что подсказки подсказывают мне, что я должен сделать так, чтобы вместо нее отображалась задняя часть карты. Я успешно создаю приложение и оно Кажется, работа очень хорошо.
Тем не менее, подсказки о назначении говорят мне:
Хорошее решение даст некоторую мысль о том, что произойдет, если каждая карта в колоде была показана, и пользователь все еще продолжает переворачивать. Сделайте что-нибудь простое и разумное (например, вам не нужно каким-либо образом изменять классы в Модели).
Но мое решение позволит пользователю бесконечно переворачивать карту. Поэтому я пытаюсь достичь цели, добавив 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, чтобы увидеть решение других, и кажется, что советы игнорируются. Можете ли вы поделиться своей идеей со мной?
Любое предложение будет высоко оценено!!!
1 ответ
Вам просто нужно обернуть это утверждение if, как это
if (card) {
//flip the card
}
Помните card
является объектом Deck.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++;
}