CS193P-2013 Lecture 2

Deck

  • .h
#import <Foundation/Foundation.h>
@interface Deck : NSObject
- (void)addCard:(Card *)card;
- (void)addCard:(Card *)card atTop:(Bool)atTop;
- (Card *)drawRandomCard;
@end
  • .m
#import "Deck.h"
@interface Deck()
@property (strong, nonatomic) NSMutableArray *cards;
@end
@implementation Deck
  
//一開始 cards 實例變量是 nil,要重寫 getter 來初始化
- (NSMutableArray *)cards {
    //惰性初始化,即當要使用該變量時才初始化
    if (!_cards) _cards = [[NSMutableArray alloc] init];
    return _cards;
}

- (void)addCard:(Card *)card atTop:(Bool)atTop {
    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
    }
}
- (void)addCard:(Card *)card {
    [self addCard:card atTop:NO];
}

- (Card *)drawRandomCard {
    Card *randomCard = nil;
    if ([self.cards count]){}
        unsigned index = arc4random() % [self.cards count]
        randomCard = self.cards[index];
        [self.cards removeObjectAtIndex:index];
    }
    return randomCard; 
}
@end

PlayingCard

  • .h

    #import "Card.h"
    @interface PlayingCard: Card
    @property (strong, nonatomic) NSString *suit;
    @property (nonatomic) NSUInteger rank;
    + (NSArray *)validSuits;
    + (NSUInteger)maxRank;
    //外部只需要知道最大牌點是多少,而不需要知道詳細有什么牌
    @end
    
  • .m

    #import "PlayingCard.h"
    @implementation PlayingCard
    - (NSString *)contents {
          NSArray *rankStrings = [self rankStrings];
          return [rankStrings[self.rank] stringByAppendingString:self.suit]; 
    }
    
    + (NSArray *)rankStrings {
          return @[@"?", @"A", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"J", @"Q", @"K"];
    }
    
    + (NSArray *)validSuits {
          return @[@"??", @"??", @"??", @"??"];
    }
    //上述兩個類方法不會影響性能,只是為了可讀性
    
    + (NSUInteger)maxRank { return [[self rankStrings] count]-1; }
    
    - (void)setRank:(NSUInteger)rank {
          if (rank M= [PlayingCard maxRank]) {
              _rank = rank;
        }
    }
    @synthesize suit = _suit;
    //同時重寫 setter 和 getter 時必須手寫 synthesize
    - (void)setSuit:(NSString *)suit {
          if ([validSuits containsObject:suit]) {
              _suit = suit;
        }
    }
    
    - (NSString *)suit {
          return _suit? : _suit : @"?";
    }
    @end
    

PlayingCardDeck

  • .h

    import "Deck.h"
    
    @interface PlayingCardDeck : Deck
    @end
    
  • .m

    #import "PlayingCardDeck.h"
    #import "PlayingCard.h"
    @implementation Deck
    - (instancetype)init {
          //instancetype 是 NSObject 中規(guī)定的 init 的返回值
          //它的意思是這個返回的對象和這個消息將要發(fā)送給的對象是同一類型的
      self = [super init];
          if (self) {
              for (NSString *suit in [PlayingCard validSuits]) {
                  for (NSUInteger rank = 1; rank <= [PlayingCard maxRank]); ++rank) {
                      PlayingCard *card = [[PlayingCard alloc] init];
                      card.rank = rank;
                  card.suit = suit;
                      [self addCard: card]; 
                }
            }
        }
          return self;
    }
    @end
    

CardGameViewController

IBAction 和 IBOutlet 實際上都是 typedef void

只是為了方便 xcode,編譯時會忽略

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容