Lecture 3: Card Match Game
lecture 3のslidesと先生の話の実際は少し違います
実はlecture 2が終わった時にflip cardのappを作りましたが、実は私たちが前に書いた4つのクラスは使いませんでした.lecture 3になると、私もぼんやりして、少し気絶し始めました.
やはり基礎的な理由で、複数の種類を書いた経験がなく、少し大きなプロジェクトをした経験がありません.
それから私はまたこのすべてがあまりにも複雑だと感じて、各種類の間の関係を整理してPythonで1つの小さいParse Headerのシナリオを書きました(Githubの上で1つの少し直したことを探して、正則の表現式さえめったに調べなくて、本当に半缶の水とあちこち漂っています)私に1理をさせます
Card
Deck
PlayingCard
PlayingCardDeck
この4つのクラスはすべてModelです
この话ではまずlecture 2の答えを解きました.制作も精巧ですね~~slidesを见ても面白いと思います.例えば、贴ったボタンを直接コピーするとdrawRandomCardの効果があります...
しかし、最終的にゲームを作る手順を見てみましょう.
新しいモデル、つまりこのモデルがゲームを制御します
このmethod-(instancetype)initWithCardCount:(NSUInteger)countはCardをロードします
実は私は-(void)chooseCardAtIndex:(NSUInteger)indexはそんなに難しくないと思いますが、書くのは難しいと思います.readonly propertyは外部からscore内部を修正されないようにscoreをreadwriteと再定義できるだけです
最終的には、この5つのクラスを支配/使用することができます.
コードがとてもきれいに書かれていて、私にとっては想像しがたいと思います.T_T
IBOutletCollectionなど、精巧で面白いところがたくさんあります.
でも簡潔なsettitleとbackgroundも...とにかく、精巧すぎて構造が難しい...
こんなコードを眺めてよだれを流す.....
実は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も...とにかく、精巧すぎて構造が難しい...
こんなコードを眺めてよだれを流す.....