【发布时间】:2013-12-05 04:24:29
【问题描述】:
我最近一直在探索虚拟卡片组随机化和卡片绘制作为一个小爱好,并且一直专注于在Ontswedder 找到的一个很棒的教程。但是,我遇到了一个小问题,希望您能帮助我!
下面,我包含了代码的一些关键方面供您查看。
在我的 viewController 中,我想调用 Deck.m 中的 shuffle 和 draw 方法。如果我执行以下操作,这是可能的:
Deck *d = [[Deck alloc] init];
[d shuffle];
[d deal];
但是,我需要能够拆分这些。例如,单击一个按钮会初始化牌组并将其洗牌,而另一个新按钮会抽一张新牌(直到牌组为空)。
我对此有疑问,我可以执行以下操作:
Deck *d = [[Deck alloc] init];
[d shuffle];
Deck *d = [[Deck alloc] init];
[d deal];
但这对我来说没用,就像我调用init 然后创建一个新的、未洗牌的牌组,并从这个新牌组中发牌。
我尝试在 viewController.h 中声明 Deck *DeckObject,然后简单地调用 [DeckObject draw];,但这提供了一个空值。
最后,我想分别调用这两个方法。如果可能的话,每次都不需要init 一个新牌组! :-)
非常感谢大家对这篇文章以及整个网站的帮助!
我希望这也有意义。如果您想了解更多信息,请告诉我。 另外,如果我的任何术语不正确,我深表歉意 - 还是有点新手!
包含的上下文代码:
Card.h
typedef enum {
Hearts,
Diamonds,
Spades,
Clubs
} Suit;
#define Ace 1
#define Jack 11
#define Queen 12
#define King 13
@interface Card : NSObject {
NSInteger value;
Suit suit;
}
@property (nonatomic) NSInteger value;
@property (nonatomic) Suit suit;
- (id) initWithValue:(NSInteger) aValue suit:(Suit) aSuit;
@end
Card.m
@interface Card(Private)
- (NSString *) valueAsString;
- (NSString *) suitAsString;
@end
@implementation Card
@synthesize value,suit;
- (id) initWithValue:(NSInteger) aValue suit:(Suit) aSuit {
if(self = [super init]) {
self.value = aValue;
self.suit = aSuit;
}
return self;
}
- (NSString *) valueAsString {
switch (self.value) {
case Ace:
return @"Ace";
break;
case Jack:
return @"Jack";
break;
case Queen:
return @"Queen";
break;
case King:
return @"King";
break;
default:
return [NSString stringWithFormat:@"%d",self.value];
break;
}
}
- (NSString *) suitAsString {
switch (self.suit) {
case Hearts:
return @"Hearts";
break;
case Diamonds:
return @"Diamonds";
break;
case Spades:
return @"Spades";
break;
case Clubs:
return @"Clubs";
break;
default:
return nil;
break;
}
}
- (NSString *) description {
return [NSString stringWithFormat:@"%@ %@",
[self valueAsString],
[self suitAsString]];
}
@end
Deck.h
@interface Deck : NSObject {
@private
NSMutableArray *cards;
}
- (void) shuffle;
- (Card *) draw;
- (NSInteger) cardsRemaining;
@end
Deck.m
@implementation Deck
- (id) init {
if(self = [super init]) {
cards = [[NSMutableArray alloc] init];
for(int suit = 0; suit <= 3; suit++) {
for(int value = 1; value <= 13; value++) {
Card *card = [[Card alloc] initWithValue:value suit:suit];
[cards addObject:card];
[card release];
}
}
}
return self;
}
int randomSort(id obj1, id obj2, void *context ) {
// returns random number -1 0 1
return (arc4random()%3 - 1);
}
- (void) shuffle {
for(int x = 0; x < 500; x++) {
[cards sortUsingFunction:randomSort context:nil];
}
}
- (Card *) draw {
if([self cardsRemaining] > 0) {
Card *card = [[cards lastObject] retain];
[cards removeLastObject];
return [card autorelease];
}
NSException* myException = [NSException
exceptionWithName:@"OutOfCardsException"
reason:@"Tried to draw a card from a deck with 0 cards." userInfo:nil]; @throw
myException;
}
- (NSInteger) cardsRemaining {
return [cards count];
}
- (NSString *) description {
NSString *desc = [NSString stringWithFormat:@"Deck with %d cards\n",[self
cardsRemaining]];
for(int x = 0; x < [self cardsRemaining]; x++) {
desc = [desc stringByAppendingFormat:@"%@\n",[[cards objectAtIndex:x] description]];
}
return desc;
}
- (void) dealloc {
[cards release];
[super dealloc];
}
@end
【问题讨论】:
-
也许我遗漏了一些东西,但看起来你只是想要一个在 VC 初始化时初始化的视图控制器中的 Deck 属性,然后你调用 shuffle 并随意绘制。还有其他的吗?
-
如果你使用过这个 vc 然后从 self.navigationcontroller.viewcontrollers 获取那个实例或者创建新实例并访问那个方法
标签: ios iphone methods viewcontroller