如何扩展我的方法来检查 2 张卡是不是匹配到 3 张匹配的卡?
Posted
技术标签:
【中文标题】如何扩展我的方法来检查 2 张卡是不是匹配到 3 张匹配的卡?【英文标题】:How to extend my method that checking if 2 cards are matched to 3 cards that are matched?如何扩展我的方法来检查 2 张卡是否匹配到 3 张匹配的卡? 【发布时间】:2013-03-14 15:48:57 【问题描述】:我正在学习斯坦福的课程,我们必须为应用程序构建一个方法来检查 2 张卡片是否匹配,这就是具有逻辑的模型的样子(查看那里的方法是 flipCardAtIndex):
#import "CardMatchingGame.h"
#import "PlayingCardsDeck.h"
@interface CardMatchingGame()
@property (readwrite, nonatomic) int score;
@property (strong, nonatomic) NSMutableArray *cards;
@property (strong, nonatomic) NSString *notification;
@end
@implementation CardMatchingGame
-(NSMutableArray *) cards
if (!_cards) _cards = [[NSMutableArray alloc] init];
return _cards;
-(id)initWithCardCount:(NSUInteger)count usingDeck:(Deck *)deck
self = [super init];
if (self)
for (int i = 0; i < count; i++)
Card *card = [deck drawRandonCard];
if (!card)
self = nil;
else
self.cards[i] = card;
return self;
-(Card *) cardAtIndex:(NSUInteger)index
return (index < self.cards.count) ? self.cards[index] : nil;
#define FLIP_COST 1
#define MISMATCH_PENALTY 2
#define BONUS 4
-(void) flipCardAtIndex:(NSUInteger)index
Card *card = [self cardAtIndex:index];
if (!card.isUnplayable)
if (!card.isFaceUp)
for (Card *otherCard in self.cards)
if (otherCard.isFaceUp && !otherCard.isUnplayable)
int matchScore = [card match:@[otherCard]];
if (matchScore)
otherCard.unplayble = YES;
card.unplayble = YES;
self.notification = [NSString stringWithFormat:@"%@ & %@ match!", card.contents, otherCard.contents];
self.score += matchScore * BONUS;
else
otherCard.faceUp = NO;
self.score -= MISMATCH_PENALTY;
self.notification = [NSString stringWithFormat:@"%@ did not matched to %@", card.contents, otherCard.contents];
break;
self.score -= FLIP_COST;
card.faceUp = !card.isFaceUp;
@end
这是整个游戏的类模型,得到了实际的匹配方法:
#import "PlayingCards.h"
@implementation PlayingCards
@synthesize suit = _suit;
//overriding the :match method of cards to give different acore if its only a suit match or a number match
-(int)match:(NSArray *)cardToMatch
int score = 0;
if (cardToMatch.count == 1)
PlayingCards *aCard = [cardToMatch lastObject];
if ([aCard.suit isEqualToString: self.suit])
score = 1;
else if (aCard.rank == self.rank)
score = 4;
return score;
//more stuff...
W 已经用数组创建了它,所以我们可以为更多对象扩展它,但现在我想弄清楚如何扩展它:/
这是我的项目 github https://github.com/NirOhayon/Matchismo
我是 Objective C 的新手,如果你能帮我弄清楚,我会很感激。
非常感谢
【问题讨论】:
这不是答案。你应该将这些if (!card.isUnplayable) if (!card.isFaceUp)
结合到if(!card.isUnplayable && !card.isFaceUp))
抱歉没有更新你,我正忙着招聘。现在我没有mac。如果您在文本中解释您的要求会更好。
@AnoopVaidya:这是风格问题。我们中的一些人更喜欢他拥有它的方式,因为它可以更容易地确定为什么在调试和单步执行代码时特定检查为真。
@AnoopVaidya 嘿,Anoop,谢谢。我有一个应用程序已经在使用 2 张卡片匹配,我现在的要求是添加匹配 3 张卡片的可能性......我可以添加更多细节吗?这是我的项目的 github 文件夹github.com/NirOhayon/Matchismo
我是按照斯坦福课程中 Paul Hugerty 的指示做的
【参考方案1】:
您可以使用循环将它们链接起来以检查它们。非常基本的方法。只需循环遍历每张卡片并对照您拥有的“自我”卡片检查它并增加分数而不是设置分数。
-(int)match:(NSArray *)cardToMatch
int score = 0;
for(int i = 0; i < cardToMatch.count; i++)
PlayingCards *aCard = cardToMatch[i];
if ([aCard.suit isEqualToString: self.suit])
score += 1;
else if (aCard.rank == self.rank)
score += 4;
return score;
对于flipCardAtIndex: ,我会将其更改为flipCardsAtIndexes:(NSArray*)indexes,其中indexes 是NSNumber 的NSArray。然后我会运行一个 for 循环检查并删除任何无法播放或面朝上的牌,并通过这些索引处的剩余牌来检查匹配,并检索匹配分数。
告诉您的视图控制器添加另一张卡取决于您如何设置视图控制器。您可以在视图控制器成为委托的方法中执行协议,并通过协议方法告诉它切换。它也可能比这更简单,这取决于它如何检查你的卡片模型来决定显示什么,如果它看到三张卡片而不是两张,它可以切换。
由于本练习的重点是学习 ios 编程,我想给你一个良好的开端,你应该自己调整和解决一些问题。我有一种感觉,你是编程的新手,如果你是,你会惊讶于你的阶段有多少编程是反复试验。最终它将成为第二天性。
【讨论】:
看起来非常感谢,但是根据此更改,我需要在flipCardAtIndex
中进行哪些更改? @Joel Fischer
另外,如果这将是一个单独的方法,我如何告诉我的视图切换到 3 卡模式? @Joel Fischer
@Nir 查看我编辑的答案。我不只是想给出“家庭作业”的答案,但如果可以的话,我会帮助你指出正确的方向。
谢谢乔尔 :) @Joel Fischer
这是错误的,因为它没有考虑到多个 cardToMatch 相互匹配,而与它们正在检查的卡不匹配。以上是关于如何扩展我的方法来检查 2 张卡是不是匹配到 3 张匹配的卡?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查我的字符串是不是与正则表达式匹配 - Swift 3 [重复]
如何在 Spring Boot 中明确检查请求内容类型是不是与实际内容匹配?