我最近一直在探索虚拟卡牌随机化和抽奖卡作为一个小小的爱好,并且一直专注于在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
然后创建一个新的UNSHUFFLED牌组,并从这个新牌组中发牌。
我已尝试在 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
答案 0 :(得分:1)
当你声明属性deckObject时,它只是创建指针,你仍然需要为init创建一个实例来分配一个Deck对象。
self.deckObject = [[Deck alloc] init];
然后,您可以在不同的按钮方法中使用[self.deckObject shuffle]
和[self.deckObject deal]
。
答案 1 :(得分:1)
您必须在 viewController.h 中声明Deck *DeckObject
,如下所示
@interface firstViewController : UIViewController {
Deck *DeckObject;
}
现在在 viewController.m 文件的 viewDidLoad 方法中将其初始化为如下所示
Deck *DeckObject = [[Deck alloc] init];
之后你可以在uibutton的动作方法中调用方法
- (IBAction)BtnShuffle:(id)sender
{
if (DeckObject) {
[DeckObject shuffle];
}
}
和
- (IBAction)BtnDraw:(id)sender
{
if (DeckObject) {
[DeckObject draw];
}
}