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にあります。出力には「カード値の設定」と表示され、インスタンス変数番号は両方とも正しいですが、他の2つは間違っています。playerTotalは、このカードが配られる前の合計を読み取り、playerCard3Valueは0を読み取ります。コンテキストを提供するために、この関数は、1枚目または2枚目のカードが配られたときではなく、3枚目以降が配られたときに呼び出されます。最初の2つは関数で処理されません。なぜこれが起こっているのか誰かが知っていますか?

4

1 に答える 1

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);
}
于 2013-03-07T01:02:53.080 に答える