Lecture 3: Card Match Game


lecture 3のslidesと先生の話の実際は少し違います
実はlecture 2が終わった時にflip cardのappを作りましたが、実は私たちが前に書いた4つのクラスは使いませんでした.lecture 3になると、私もぼんやりして、少し気絶し始めました.
やはり基礎的な理由で、複数の種類を書いた経験がなく、少し大きなプロジェクトをした経験がありません.
それから私はまたこのすべてがあまりにも複雑だと感じて、各種類の間の関係を整理してPythonで1つの小さいParse Headerのシナリオを書きました(Githubの上で1つの少し直したことを探して、正則の表現式さえめったに調べなくて、本当に半缶の水とあちこち漂っています)私に1理をさせます
Card
objectivec   ,   NSObject

+------------Class Name--------------+
            Card : NSObject

+------------Public Methods----------+

-(int)match :(NSArray *)otherCards;

+---------Public Properties----------+

@property (strong, nonatomic) NSString *contents;
@property (nonatomic, getter = isChosen) BOOL chosen;
@property (nonatomic, getter = isMatched) BOOL matched;

+------------------------------------+

Deck
objectivec   ,import Card,  Deck Card  


+-------------Class Name--------------+

          Deck : NSObject

+------------Public Methods----------+

-(void)addCard:(Card *)card atTop:(BOOL)atTop;
-(void)addCard:(Card *)card;
-(Card *)drawRandomCard;

+---------Public Properties----------+


PlayingCard
objectivec   Card,   match  ,   contents getter

+-----------------------------------+
       PlayingCard : Card

+------------Public Methods----------+

+ (NSArray *)validSuits;
+ (NSArray *)rankStrings;
+ (NSUInteger)maxRank;

+---------Public Properties----------+

@property (strong, nonatomic) NSString *suit;
@property (nonatomic) NSUInteger rank;


PlayingCardDeck
objectivec   Deck,         
-(instancetype)init      init      

+-----------------------------------+
     PlayingCardDeck : Deck

+------------Public Methods----------+


+---------Public Properties----------+

この4つのクラスはすべてModelです
この话ではまずlecture 2の答えを解きました.制作も精巧ですね~~slidesを见ても面白いと思います.例えば、贴ったボタンを直接コピーするとdrawRandomCardの効果があります...
しかし、最終的にゲームを作る手順を見てみましょう.
新しいモデル、つまりこのモデルがゲームを制御します
objectivec
CardMatchingGame ,import Deck Card , import +-----------------------------------+ CardMatchingGame : NSObject +------------Public Methods----------+ -(instancetype)initWithCardCount :(NSUInteger)count -(void)chooseCardAtIndex:(NSUInteger)index; -(Card *)cardAtIndex:(NSUInteger)index; +---------Public Properties----------+ @property (nonatomic,readonly)NSInteger score;

このmethod-(instancetype)initWithCardCount:(NSUInteger)countはCardをロードします
実は私は-(void)chooseCardAtIndex:(NSUInteger)indexはそんなに難しくないと思いますが、書くのは難しいと思います.readonly propertyは外部からscore内部を修正されないようにscoreをreadwriteと再定義できるだけです
最終的には、この5つのクラスを支配/使用することができます.
objectivec
#import "CardGameViewController.h" #import "PlayingCardDeck.h" #import "Deck.h" #import "CardMatchingGame.h" @interface CardGameViewController () @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons; @property (weak, nonatomic) IBOutlet UILabel *scoreLabel; @property (strong,nonatomic) CardMatchingGame *game; @end @implementation CardGameViewController -(CardMatchingGame *)game{ if (!_game) _game = [[CardMatchingGame alloc]initWithCardCount:[self.cardButtons count] usingDeck:[self createDeck]]; return _game; } -(Deck *)createDeck{ return [[PlayingCardDeck alloc]init]; } - (IBAction)touchCardButton:(UIButton *)sender { int chosenButtonIndex = [self.cardButtons indexOfObject:sender]; [self.game chooseCardAtIndex:chosenButtonIndex]; [self updateUI]; } - (void)updateUI{ for (UIButton *cardButton in self.cardButtons) { int cardButtonIndex = [self.cardButtons indexOfObject:cardButton]; Card *card = [self.game cardAtIndex:cardButtonIndex]; [cardButton setTitle:[self titleForCard:card] forState:UIControlStateNormal]; [cardButton setBackgroundImage:[self backgroundImageForCard:card] forState:UIControlStateNormal]; cardButton.enabled = !card.isMatched; self.scoreLabel.text = [NSString stringWithFormat:@"Score : %d",self.game.score]; } } -(NSString *)titleForCard:(Card *)card{ return card.isChosen ? card.contents : @""; } -(UIImage *)backgroundImageForCard:(Card *)card{ return [UIImage imageNamed:card.isChosen ? @"cardfront" : @"cardback"]; } @end

コードがとてもきれいに書かれていて、私にとっては想像しがたいと思います.T_T
IBOutletCollectionなど、精巧で面白いところがたくさんあります.
でも簡潔なsettitleとbackgroundも...とにかく、精巧すぎて構造が難しい...
こんなコードを眺めてよだれを流す.....