2013-03-06 68 views
0

我正在使用Xcode版本4.6。在我製作的iPhone和iPad應用程序中,我製作了一個名爲dealCard的功能。那就是:爲什麼我的函數不會改變我的外部變量的值?

- (void)dealCard : (UIImageView *)cardImage : (int)card : (int)suit : (BOOL)aceBool : (int) cardValue : (int)total 
{ 
suit = arc4random() % 4; 
card = arc4random() % 13; 
if (suit == 0) 
{ 
    //set images 

if (suit == 1) 
{ 
    //set images 
} 

if (suit == 2) 
{ 
    //set images 
} 

if (suit == 3) 
{ 
    //set images 
} 
if (card < 10 && card != 0) 
{ 
    NSLog(@"Setting cardValue"); 
    cardValue = card+1; 
} 
else if (card != 0) 
{ 
    NSLog(@"Setting cardValue"); 
    cardValue = 10; 
} 
else 
{ 
    NSLog(@"Setting cardValue"); 
    aceBool = YES; 
    if (total + 11 <= 21) 
    { 
     cardValue = 11; 
    } 
    else 
    { 
     cardValue = 1; 
    } 

} 
total = total + cardValue; 
NSLog(@"Total = %d cardValue = %d",total,cardValue); 
NSLog(@"playerTotal = %d playerCard3Value = %d",playerTotal,playerCard3Value); 
} 

進一步下跌的一頁,我把:

[self dealCard: playerCard3Image : playerCard3 : playerSuit3 : playerCard3ace : playerCard3Value : playerTotal]; 

我的問題是在cardValue。輸出顯示「設置cardValue」,然後實例變量編號都是正確的,但其他兩個都是錯誤的。 playerTotal讀取此卡發放前的總數,並且playerCard3Value讀數爲0.要給你一些上下文,當第一張或第二張牌被髮出時,而不是第三張和第二張牌被調用時,該函數被調用。前兩個不在函數中處理。有誰知道爲什麼會發生這種情況?

+0

請問這是由於變量的範圍是什麼? – PsyKzz 2013-03-06 23:49:38

+0

@Matt PsyK - 如何讓他們成爲全球?我只是在.h文件中聲明它們:'int playerCard3Value;' – 2013-03-06 23:52:58

+0

不幸的是,我不知道obj-​​c或xcode足以發表評論。 – PsyKzz 2013-03-06 23:56:46

回答

1

面向對象的編程是一件很美的事情。編碼這個真正的快速向你展示它是如何工作...

// 
// PlayingCard.h 
// 

#import <Foundation/Foundation.h> 

@interface PlayingCard : NSObject 

- (id)initWithSuit:(NSInteger)suit value:(NSInteger)value; 
- (BOOL)isAce; 
- (BOOL)isFace; 

@end 


// 
// PlayingCard.m 
// 

#import "PlayingCard.h" 

@interface PlayingCard() 
@property(nonatomic, assign) NSInteger suit; 
@property(nonatomic, assign) NSInteger value; 

@end 

@implementation PlayingCard 

- (id)initWithSuit:(NSInteger)suit value:(NSInteger)value { 
    self = [self init]; 
    if (self) { 
     _suit = suit; 
     _value = value; 
    } 
    return self; 
} 

- (BOOL)isAce { 
    return self.value == 0; 
} 

- (BOOL)isFace { 
    return self.value > 10; 
} 

- (NSString *)suitName { 
    switch (self.suit) { 
     case 0: 
      return @"spades"; 
      break; 
     case 1: 
      return @"diamonds"; 
      break; 
     case 2: 
      return @"clubs"; 
      break; 
     case 3: 
      return @"hearts"; 
      break; 

     default: 
      return @""; 
      break; 
    } 
} 

// so it prints nicely. you should consider making the suits enums 
- (NSString *)description { 
    return [NSString stringWithFormat:@"%@: suit:%@, value:%d", [super description], [self suitName], self.value]; 
} 

@end 


// 
// CardDeck.h 
// 

#import <Foundation/Foundation.h> 

@class PlayingCard; 

@interface CardDeck : NSObject 

+ (id)cardDeck; 
- (void)shuffle; 
- (NSUInteger)count; 
- (PlayingCard *)dealOne; 

@end 

// 
// CardDeck.m 
// 

#import "CardDeck.h" 
#import "PlayingCard.h" 

@interface CardDeck() 
@property(nonatomic,strong) NSMutableArray *cards; 
@end 

@implementation CardDeck 

+ (id)cardDeck { 

    CardDeck *deck = [[self alloc] init]; 
    for (NSInteger suit = 0; suit < 4; suit++) { 
     for (NSInteger value = 0; value < 13; value++) { 
      PlayingCard *card = [[PlayingCard alloc] initWithSuit:suit value:value]; 
      [deck.cards addObject:card]; 
     } 
    } 
    return deck; 
} 

- (id)init { 
    self = [super init]; 
    if (self) { 
     _cards = [NSMutableArray array]; 
    } 
    return self; 
} 


- (void)shuffle { 
    NSMutableArray *shuffledCards = [NSMutableArray array]; 
    for (int i=0; i<52; i++) { 
     int randomIndex = arc4random_uniform(52-i); 
     [shuffledCards addObject:[self.cards objectAtIndex:randomIndex]]; 
     [self.cards removeObjectAtIndex:randomIndex]; 
    } 
    self.cards = shuffledCards; 
} 

- (NSUInteger)count { 
    return self.cards.count; 
} 


- (PlayingCard *)dealOne { 

    PlayingCard *card = [self.cards lastObject]; 
    [self.cards removeLastObject]; 
    return card; 
} 

@end 

這樣稱呼它......

CardDeck *deck = [CardDeck cardDeck]; 
// try it with and without shuffle 
[deck shuffle]; 
while (deck.count) { 
    PlayingCard *card = [deck dealOne]; 
    NSLog(@"%@", card); 
} 
相關問題