版权声明:本文为博主原创文章,如需转载请注明出处。
Matchismo
Stanford iOS7 Assignment
Use Xcode 7.3 AND OS X EI Captian 10.11.4
更新时间:2016.04.22
简单牌面翻转
修改Main.storyboard:设置背景色,添加一个Button,添加背景图和前景图。设置Title为A♣︎。并在ViewController.m中添加一个方法:
1  | - (IBAction)touchCardButton:(UIButton *)sender {  | 
接下来添加一个计算翻转次数的Label,并在ViewController.m添加代码:
1  | @interface ViewController ()  | 
这里还需要在touchCardButton:中添加一行代码来更新flipCount数据:
1  | self.flipCount++;  | 
更新时间:2016.04.24
添加Card类
添加Model类Card(Card.h,Card.m),Card.h内容为:
1  | @property (strong, nonatomic) NSString *contents;  | 
contents记录牌面信息,比如A♣︎;chosen属性表示当前card是否被选中;matched属性表示当前card是否匹配。match:方法:当传入参数otherCards中只要有一个和自身的contents相等,就让得1分,即score = 1。
添加PlayingCard类
添加Model类PlayingCard,父类是Card。PlayingCard.h内容为:
1  | @interface PlayingCard : Card  | 
suit属性存放牌面花色;rank属性存放牌面数值;类方法validSuits返回当前牌类可以使用花色字符串(这里为@[@"♠︎", @"♣︎", @"♥︎", @"♦︎"]);类方法maxRank返回当前牌面可以支持的最大数值(当前为13)。
PlayingCard.m中需要重载contents属性的getter方法:
1  | - (NSString *)contents  | 
PlayingCard.m其他内容请查看工程源文件。
更新时间:2016.04.26
添加Deck类
添加Model类Deck。用于存放一副牌,Deck.h内容:
1  | @interface Deck : NSObject  | 
addCard:atTop方法和addCard:都是想牌组中添加一张牌,这里是为了演示如果需要一个有参数的函数和另一个无参数的函数做类似的事情,这里所做的效果不是像C++一样进行重载,这里是两个完全不同的函数,从这里的函数名也能看出这是两个函数,切记。给出Deck.m的内容:
1  | 
  | 
类拓展里面申明了一个数组cards用来存放一副牌。drawRandomCard方法从牌组中抽出一张牌返回,并从牌组中删掉这张牌。
添加PlayingCardDeck类
添加Model类PlayingCardDeck,只在.m文件中重载init方法:
1  | - (instancetype)init  | 
生成一副牌组,包含所有rank和suit的组合。
让stroyboard中的牌面随机显示rank和suit
在ViewController.m中,添加一个deck属性:
1  | @property (strong, nonatomic) Deck *deck;  | 
然后添加两个方法:
1  | - (Deck *)deck  | 
creatDeck方法创建并返回了一个PlayingCardDeck类,用于初始化deck属性。
这里注意父类指针可以指向子类。
然后在touchCardButton:方法中修改代码,每次翻到正面时都随机抽出一张牌,然后将牌面contents给Title。
1  | - (IBAction)touchCardButton:(UIButton *)sender {  | 
storyboard中将牌Button的Title删掉,然后将Background设为CardBack,这样初始牌面为背面,并且牌面没有内容,点击之后就会进入touchCardButton:的else部分。实现了随机的效果。
更新时间:2016.05.06
现在需要做一个可以进行匹配的游戏,在界面上需要放置12个Button,每行4个,3行,共12个。我这里用AutoLayout,从左边的Container Margin到右边的Container Margin长度为560。每行放置4张牌,如果没有间隔,每张牌的宽度为140,但是为了每张牌中间留出一个小间隙,需要3个间隙,就找到3和4的最小公倍数12。这样设计最后每张牌的宽度即为137,牌与牌之间的间隔都是4,然后加上Constraints。如下图所示:
在iPhone6s上的测试结果如下图所示:
我更改了PlayingCard.m文件中的validSiuts函数,就是将里面的生成牌Suit的字符换成了彩色的字符,之前全都是黑色的。
更新时间:2016.06.13
添加CardMatchingGame类
添加Model类CardMatchingGame,在.h文件中添加3个方法和1个属性:
1  | 
  | 
这些就是将要实现的游戏的逻辑。在.m文件中添加一个Class Extension,将头文件中声明的属性为readonly的score数据重新声明为readwrite,在添加一个私有属性来存放牌组:
1  | @interface CardMatchingGame ()  | 
接下来实现方法:
1  | 
  | 
接下来需要在PlayingCard.m中重写Card类中的方法otherCards:
1  | 
  | 
在ViewController.m中import``CardMatchingGame.h类,然后需要一个属性:
1  | @property (strong, nonatomic) CardMatchingGame *game;  | 
然后lazily instantiate it:
1  | - (CardMatchingGame *)game  | 
把12个牌按住Ctrl拖拽,产生`Outlet Collection:
1  | @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;  | 
将touchCardButton:方法中的内容删掉,重新写,为了对比,将删掉的内容注释起来。
1  | 
  | 
deck方法也不需要了。实现updateUI方法:
1  | - (void)updateUI  | 
然后添加一个Label显示分数:
1  | @property (weak, nonatomic) IBOutlet UILabel *scoreLabel;  | 
效果如图: