我正在遵循斯坦福大学的课程,我们必须为应用程序构建一个检查2个卡匹配的方法,这就是具有逻辑的模型的样子(查看那里的方法是flipCardAtIndex): / p>
#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已经使用数组创建了它,因此我们可以将其扩展为更多对象,但现在我想弄清楚如何扩展它:/
这是我的项目https://github.com/NirOhayon/Matchismo
的github我是客观C的新手,如果你能帮助我解决这个问题,我会很感激。
非常感谢
答案 0 :(得分: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 *)索引,其中索引是NSNumber的NSArray。然后我会运行for循环检查并删除任何无法播放或面朝上的牌,并通过这些索引处的剩余牌来检查匹配,并检索匹配分数。
告诉视图控制器添加另一张卡取决于您设置视图控制器的方式。您可以在视图控制器成为其委托的方法中执行协议,并通过协议方法告诉它切换。它也可能比这更简单,取决于它如何检查您的卡片型号以决定要显示的内容,如果它看到三张牌可用而不是两张,它可以切换。
本练习的目的是学习iOS编程,我想给你一个良好的开端,你应该自己调整并找出一些东西。我有一种感觉,你是编程的新手,如果你是,你会惊讶于你的阶段编程是多少是试错。最终它将成为第二天性。