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; // 制作随机卡组算法的方法@endCard.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; // 返回被抽出的卡牌,用于显示在屏幕上}@end3.定义一个PlayingCard类,该类继承自Card类,用于存入卡牌的玩法(规则)PlayingCard.h
#import "Card.h"@interface PlayingCard : Card@property (strong, nonatomic) NSString *suit;@property (nonatomic) NSUInteger rank;+ (NSArray *)validSuits;+ (NSUInteger)maxRank;@endPlayingCard.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; }}@end4.定义一个PlayingCardDeck类,该类继承自Deck类PlayingCardDeck.h
#import "Deck.h"@interface PlayingCardDeck : Deck@endPlayingCardDeck.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
- iOS-CS193p-01-简单的抽牌应用
- [IOS]地图的简单应用
- iOS 地图的简单应用
- iOS NSRunLoop的简单应用
- iOS-地图的简单应用
- iOS AVPlayer的简单应用
- cs193p斯坦福视频学习总结——iOS基础知识
- Ios中SQLite3.0的简单应用。。
- ios 简单的rss 解析应用demo
- iOS策略模式的简单应用
- IOS开发之UIAlertView的简单应用
- IOS 枚举的简单应用;使用
- ios sqlite数据库的简单应用
- ios sqlite框架FMDB 的简单应用
- IOS 页面统计 SWIZZLE 的简单应用
- iOS中sqlite3的简单应用
- iOS简单的全局变量定义与应用
- iOS之AVPlayer的简单应用
- IOS沙盒位置
- 网页代码优化
- stdafx.h
- try,catch,finall,return的执行顺序
- 游戏地图,精灵移动处理,粒子系统,声音引擎,地图移动,游戏暂停
- iOS-CS193p-01-简单的抽牌应用
- iOS开发之远程推送
- MySQL 官方示例数据库安装
- Value Object模式
- Activity.setContentView()源码分析
- Java中异常处理机制
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- Jquery和Ajax的使用参考手册
- sql之left join、right join、inner join的区别