可能是一个简单的问题......我是一名初学程序员,所以请耐心等待:) 我已经创造了我的第一个真实的'从甲板上抽取卡片直到抽出小丑的iPhone应用程序,然后游戏就结束了。
到目前为止,这么好并且一切正常,除了我必须使用我真正讨厌的解决方法。 我的Deck对象仅在我声明它的地方可用,这似乎正常但令人恼火。
基本上,每次用户点击" Draw Card"时,我都必须制作一个全新的牌组。按钮...
- (IBAction)drawCard:(id)sender {
Deck *deck = [[Deck alloc]init];
deck.generate;
unsigned int randomIndex = arc4random_uniform(deck.deckArray.count);
Card *topCard = [deck.deckArray objectAtIndex:randomIndex - 1];
if (topCard.value == 11) {
NSString *cardInfo = [NSString stringWithFormat:@"You drew a Jack of %@", topCard.suit];
self.cardDrawn.text = cardInfo;
}else if (topCard.value == 12) {
NSString *cardInfo = [NSString stringWithFormat:@"You drew a Queen of %@", topCard.suit];
self.cardDrawn.text = cardInfo;
}else if (topCard.value == 13) {
NSString *cardInfo = [NSString stringWithFormat:@"You drew a King of %@", topCard.suit];
self.cardDrawn.text = cardInfo;
}else {
NSString *cardInfo = [NSString stringWithFormat:@"You drew a %d of %@", topCard.value, topCard.suit];
self.cardDrawn.text = cardInfo;
}
[deck removeCard];
if (topCard.value == 14) {
self.cardDrawn.text = @"You drew the Joker Bomb!";
//Destroy deck
deck = nil;
[drawCard setEnabled:NO];
[playAgain setEnabled:YES];
[playAgain setHidden:NO];
}
}
- (IBAction)playAgain:(id)sender {
self.cardDrawn.text = nil;
[drawCard setEnabled:YES];
[playAgain setEnabled:NO];
[playAgain setHidden:YES];
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self =[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
Deck *deck = [[Deck alloc]init];
deck.generate;
}
return self;
}
@end
如果我在Deck *deck = [[Deck alloc]init];
按钮方法中删除drawCard
,我会收到一堆错误,而且应用程序不会构建。我已尝试@synthesize
deck
对象,但这似乎也无效,我也尝试制作指向deck
的指针,但这有点像没用,也没用。
我想实现一个标签,显示牌组中剩余的牌数,但这是不可能的,因为每次用户点击drawCard
时都会生成一个新牌组。
对不起,如果这是一个愚蠢的问题&谢谢!
答案 0 :(得分:0)
您的代码中存在一些问题。首先是" deck.generate;"做?这不是有效的Objective-C语法。
另一件事是,每次调用drawCard方法时,你都会重新定位一个套牌。而不是使用:
Deck *deck = [[Deck alloc]init];
您可以在界面中将Deck声明为实例变量,并使用以下内容更改上面的行:
deck = [Deck new];
答案 1 :(得分:0)
@interface ViewControllerTheOPDidntProvideANameFor ()
@property (nonatomic, strong) Deck *deck;
@end
@implementation ViewControllerTheOPDidntProvideANameFor
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self =[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
self.deck = [[Deck alloc]init];
[self.deck generate];
return self;
}
@end
答案 2 :(得分:0)
在.h
文件中,声明如下内容:
@property (nonatomic, strong) Deck *deck;
然后,在您的.m
文件中,使用以下内容初始化套牌(最有可能在viewDidLoad
或viewWillAppear
中):
self.deck = [[Deck alloc] init];
然后,您将能够使用deck
这样的self.deck
属性:
[self.deck generate]; //Good practice to use brackets instead of dot notation for function calls in Objective-C since dot operators indicate properties
希望这有帮助!
编辑:
根据DarkDust
的注释,您也可以使用实例变量:
//.h
@interface YourViewControllerName : UIViewController {
Deck *deck;
}
//.m
- (void)viewDidLoad
{
[super viewDidLoad];
//Initialize the deck
deck = [[Deck alloc] init];
}
然后可以使用deck
访问您的套牌。