iOS-CS193p-01-简单的抽牌应用

来源:互联网 发布:js修改对象的属性值 编辑:程序博客网 时间:2024/06/07 11:51

CS193p第二课的小练习,注意MVC互相独立

一.首先先设计模型

1.定义一个Card类,继承自NSObject,并在该类中创建一个NSString类型的contents的属性,用于调用卡牌组

#import <Foundation/Foundation.h>@interface Card : NSObject@property (strong, nonatomic) NSString *contents;@end

2.定义一个Deck类,同样继承自NSObject,并在该类中声明三个方法

Card.h

#import <Foundation/Foundation.h>#import "Card.h"@interface Deck : NSObject- (void)addCard:(Card *)card atTop:(BOOL)atTop; // 在卡组中添加卡片,并判断卡片是否在顶部的方法- (void)addCard:(Card *)card; // 在卡组中添加卡片的方法- (Card *)drawRandomCard; // 制作随机卡组算法的方法@end
Card.m

#import "Deck.h"@interface Deck ()@property (strong, nonatomic) NSMutableArray *cards; // 定义一个可变数组用于存放卡牌@end@implementation Deck- (NSMutableArray *)cards{    if (!_cards) _cards = [[NSMutableArray alloc] init]; // 惰性实例化cards,因为cards很忙    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 // 不判断卡牌是否在顶部,并通过调用addCard:atTop方法来完成方法体{    [self addCard:card atTop:NO];}- (Card *)drawRandomCard // 随机牌组的方法{    Card *randomCard = nil; // 创建一个随机牌组的Card类型对象,并赋予nil值    if ([self.cards count]) { // 如果牌组中没有卡牌则执行以下语句        unsigned index = arc4random() % [self.cards count]; // 通过arc4random() % [self.cards count]获取0-[self.cards count]之间的随机数        randomCard = self.cards[index]; // 将随机出的某张卡牌放入随机牌组对象中        [self.cards removeObjectAtIndex:index]; // 从牌组中删除这一张被抽出的卡牌    }    return randomCard; // 返回被抽出的卡牌,用于显示在屏幕上}@end
3.定义一个PlayingCard类,该类继承自Card类,用于存入卡牌的玩法(规则)

PlayingCard.h

#import "Card.h"@interface PlayingCard : Card@property (strong, nonatomic) NSString *suit;@property (nonatomic) NSUInteger rank;+ (NSArray *)validSuits;+ (NSUInteger)maxRank;@end
PlayingCard.m

#import "PlayingCard.h"@implementation PlayingCard@synthesize suit = _suit; // 将_suit 赋值给 suit- (NSString *)contents{    NSArray *rankStrings = [PlayingCard rankStrings];    return [rankStrings[self.rank] stringByAppendingString:self.suit];}+ (NSArray *)validSuits{    return @[@"♠︎",@"♦︎",@"♥︎",@"♣︎"]; // 花色}- (void)setSuit:(NSString *)suit // 重写setSuit方法{    if ([[PlayingCard validSuits] containsObject:suit]) {        _suit = suit;    }}- (NSString *)suit{    return _suit ? _suit : @"?";}+ (NSArray *)rankStrings{    return @[@"?",@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"]; // 定义卡牌的类型并存入数组}+ (NSUInteger)maxRank {return [[self rankStrings] count] - 1;} // 最大卡牌- (void)setRank:(NSUInteger)rank{    if (rank <= [PlayingCard maxRank]) {        _rank = rank;    }}@end
4.定义一个PlayingCardDeck类,该类继承自Deck类

PlayingCardDeck.h

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

#import "PlayingCardDeck.h"#import "PlayingCard.h"@implementation PlayingCardDeck- (instancetype)init{    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

二.搭建StoryBoard



三.控制器代码的编写

VIewController.m

#import "ViewController.h"#import "PlayingCardDeck.h"#import "Deck.h"@interface ViewController ()@property (weak, nonatomic) IBOutlet UILabel *flipsLabel;@property (nonatomic) int flipCount;@property (nonatomic, strong) Deck *deck;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}- (Deck *)deck{    if (!_deck) _deck = [self createDeck];    return _deck;}- (Deck *)createDeck{    return [[PlayingCardDeck alloc] init];}- (void)setFlipCount:(int)flipCount{    _flipCount = flipCount;    self.flipsLabel.text = [NSString stringWithFormat:@"已翻牌:%d张", self.flipCount];}- (IBAction)touchCardBtn:(UIButton *)sender {    if ([sender.currentTitle length]) {        [sender setBackgroundImage:[UIImage imageNamed:@"cardback"]                          forState:UIControlStateNormal];        [sender setTitle:nil                forState:UIControlStateNormal];    } else {        Card *card = [self.deck drawRandomCard];        if (card) {            [sender setBackgroundImage:[UIImage imageNamed:@"cardfront"]                              forState:UIControlStateNormal];            [sender setTitle:card.contents                    forState:UIControlStateNormal];            self.flipCount++;        }    }}@end


0 0
原创粉丝点击