首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让我的扑克逻辑正确地检查“卡片”对象的NSMutableArray中的直接刷新

无法让我的扑克逻辑正确地检查“卡片”对象的NSMutableArray中的直接刷新
EN

Stack Overflow用户
提问于 2013-03-14 17:45:18
回答 1查看 982关注 0票数 0

在这个问题上被困了三天。我原以为写这个问题比自己解决这个问题要花费更长的时间,但我在这个问题上毫无进展。我将尽我所能简明扼要和合乎逻辑地阐述这一点。目标-C,cocos2d-iPhone2.0,Xcode 4.6。

我正在写一个德克萨斯州的游戏,我被困在试图让我的游戏层,以评估哪一只手是直冲和皇家冲。

(对于那些不熟悉德州扑克牌的人来说,一旦所有可能的牌都发出来了,玩家就必须从7张牌中拿出最好的5张牌。在这种情况下,我只关心的是,是否玩家有一个直线冲水,这是同一套西装的任何5张牌,也是顺序顺序。例如,7,8,9,10,和杰克的俱乐部,或王牌,杜斯,3,4和5的红心等。“皇家”同花顺只是最高的直冲,这是十,杰克,皇后,国王和艾斯所有相同的西服。

我所有的卡片类都是分配和移动的方法。我觉得很舒服,说这些都很好。我在那里没遇到任何问题。

这里是我的卡片类的相关部分:

代码语言:javascript
复制
Card.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface Card : CCSprite {
    BOOL removedFromLayer, reachedDestination, isMoving;
    NSString *imageName;
    NSString *suit;
    NSNumber *rank;
}

@property BOOL removedFromLayer, reachedDestination, isMoving;
@property (nonatomic, retain) NSNumber *rank;
@property (nonatomic, retain) NSString *suit;
@property (nonatomic, retain) NSString *imageName;

// ... movement and animation methods

@end

执行情况:

代码语言:javascript
复制
#import "Card.h"
@implementation Card
@synthesize removedFromLayer, reachedDestination, isMoving, rank, suit, imageName;
    // ... implementations
@end

我扩展了NSMutableArray类以包括扑克手评估逻辑。我最初试图创建一个NSMutableArray的子类,但是经验程序员会意识到,它的效果不太好。根据我从控制台的读数中可以看出,排序方法工作得很好。我现在就坚持直接冲水的方法。我承认这很难看。(哈)“很丑”):

代码语言:javascript
复制
#import "NSMutableArray+HandAnalysis.h"
#import "Card.h"

#define cards1And2AreSequential (card1Rank == (card2Rank - 1))
#define cards2And3AreSequential (card2Rank == (card3Rank - 1))
#define cards3And4AreSequential (card3Rank == (card4Rank - 1))
#define cards4And5AreSequential (card4Rank == (card5Rank - 1))
#define cards5And6AreSequential (card5Rank == (card6Rank - 1))
#define cards6And7AreSequential (card6Rank == (card7Rank - 1))

#define cards1And2AreSameSuit (card1Suit == card2Suit)
#define cards2And3AreSameSuit (card2Suit == card3Suit)
#define cards3And4AreSameSuit (card3Suit == card4Suit)
#define cards4And5AreSameSuit (card4Suit == card5Suit)
#define cards5And6AreSameSuit (card5Suit == card6Suit)
#define cards6And7AreSameSuit (card6Suit == card7Suit)

#define firstCardIsAnAce [[firstCard valueForKey:@"rank"] intValue] == 1
#define lastCardIsAKing [[lastCard valueForKey:@"rank"] intValue] == 13
#define secondToLastCardIsAQueen [[secondToLastCard valueForKey:@"rank"] intValue] == 12
#define thirdToLastCardIsAJack [[thirdToLastCard valueForKey:@"rank"] intValue] == 11
#define fourthToLastCardIsATen [[fourthToLastCard valueForKey:@"rank"] intValue] == 10

// clubs (NOTE:  These do not terminate with a semi-colon)
#define firstCardIsAClub [[firstCard valueForKey:@"suit"] isEqualToString:@"club"]
#define lastCardIsAClub [[lastCard valueForKey:@"suit"] isEqualToString:@"club"]
#define secondToLastCardIsAClub [[secondToLastCard valueForKey:@"suit"] isEqualToString:@"club"]
#define thirdToLastCardIsAClub [[thirdToLastCard valueForKey:@"suit"] isEqualToString:@"club"]
#define fourthToLastCardIsAClub [[fourthToLastCard valueForKey:@"suit"] isEqualToString:@"club"]

// diamonds
#define firstCardIsADiamond [[firstCard valueForKey:@"suit"] isEqualToString:@"diamond"]
#define lastCardIsADiamond [[lastCard valueForKey:@"suit"] isEqualToString:@"diamond"]
#define secondToLastCardIsADiamond [[secondToLastCard valueForKey:@"suit"] isEqualToString:@"diamond"]
#define thirdToLastCardIsADiamond [[thirdToLastCard valueForKey:@"suit"] isEqualToString:@"diamond"]
#define fourthToLastCardIsADiamond [[fourthToLastCard valueForKey:@"suit"] isEqualToString:@"diamond"]

// hearts
#define firstCardIsAHeart [[firstCard valueForKey:@"suit"] isEqualToString:@"heart"]
#define lastCardIsAHeart [[lastCard valueForKey:@"suit"] isEqualToString:@"heart"]
#define secondToLastCardIsAHeart [[secondToLastCard valueForKey:@"suit"] isEqualToString:@"heart"]
#define thirdToLastCardIsAHeart [[thirdToLastCard valueForKey:@"suit"] isEqualToString:@"heart"]
#define fourthToLastCardIsAHeart [[fourthToLastCard valueForKey:@"suit"] isEqualToString:@"heart"]

// spades
#define firstCardIsASpade [[firstCard valueForKey:@"suit"] isEqualToString:@"spade"]
#define lastCardIsASpade [[lastCard valueForKey:@"suit"] isEqualToString:@"spade"]
#define secondToLastCardIsASpade [[secondToLastCard valueForKey:@"suit"] isEqualToString:@"spade"]
#define thirdToLastCardIsASpade [[thirdToLastCard valueForKey:@"suit"] isEqualToString:@"spade"]
#define fourthToLastCardIsASpade [[fourthToLastCard valueForKey:@"suit"] isEqualToString:@"spade"]


@implementation NSMutableArray (HandAnalysis)

-(NSMutableArray *)sortByRank {

    NSSortDescriptor *rankSD = [[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObject:rankSD];
    NSArray *sortedHand = [self sortedArrayUsingDescriptors:sortDescriptors];
    NSMutableArray *handOrganizedByRank = [NSMutableArray arrayWithArray:sortedHand];

    for (Card* card in handOrganizedByRank) {
        NSLog(@"%@", [card valueForKey:@"rank"]);
    }

    return handOrganizedByRank;
}

-(NSMutableArray *)sortBySuit {

    NSSortDescriptor *suitSD = [[NSSortDescriptor alloc] initWithKey:@"suit" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObject:suitSD];
    NSArray *sortedHand = [self sortedArrayUsingDescriptors:sortDescriptors];
    NSMutableArray *handOrganizedBySuit = [NSMutableArray arrayWithArray:sortedHand];

    for (Card* card in handOrganizedBySuit) {
        NSLog(@"%@", [card valueForKey:@"suit"]);
    }

    return handOrganizedBySuit;
}

-(BOOL)isStraightFlush {

    [self sortByRank];
    [self sortBySuit];

    NSLog(@"Amount of cards in the array:  %d", [self count]);

    // this section is for if there are 7 cards in the array total.
    if ([self count] == 7) {

        int card1Rank = [[[self objectAtIndex:0] valueForKey:@"rank"] intValue];
        int card2Rank = [[[self objectAtIndex:1] valueForKey:@"rank"] intValue];
        int card3Rank = [[[self objectAtIndex:2] valueForKey:@"rank"] intValue];
        int card4Rank = [[[self objectAtIndex:3] valueForKey:@"rank"] intValue];
        int card5Rank = [[[self objectAtIndex:4] valueForKey:@"rank"] intValue];
        int card6Rank = [[[self objectAtIndex:5] valueForKey:@"rank"] intValue];
        int card7Rank = [[[self objectAtIndex:6] valueForKey:@"rank"] intValue];

        id card1Suit = [[self objectAtIndex:0] valueForKey:@"suit"];
        id card2Suit = [[self objectAtIndex:1] valueForKey:@"suit"];
        id card3Suit = [[self objectAtIndex:2] valueForKey:@"suit"];
        id card4Suit = [[self objectAtIndex:3] valueForKey:@"suit"];
        id card5Suit = [[self objectAtIndex:4] valueForKey:@"suit"];
        id card6Suit = [[self objectAtIndex:5] valueForKey:@"suit"];
        id card7Suit = [[self objectAtIndex:6] valueForKey:@"suit"];

        // if all cards (1-7) are straight flush
        if ((cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards6And7AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit && cards6And7AreSameSuit)) {
            NSLog(@"Player has a seven-card straight flush.  %d items in the array.", [self count]);

            return TRUE;
        }

        // (6-card straight flushes)  if cards 1-6 or 2-7 are straight flush
        else if ((cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit) ||  (cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards6And7AreSequential && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit && cards6And7AreSameSuit)) {
            NSLog(@"Player has a six-card straight flush.  %d in the array.", [self count]);

            return TRUE;
        }

        // (5-card straight flushes)  if 1-5 or 2-6 or 3-7 are straight flush
        else if ((cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit) ||  (cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit) || (cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards6And7AreSequential && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit && cards6And7AreSameSuit)) {

            NSLog(@"Player has a straight flush.  %d in the array.", [self count]);

            return TRUE;
        } else {
        NSLog(@"Player does not have a straight flush.  %d in the array.", [self count]);
        return  FALSE;
        }
    }

    // this section is for if there are 6 cards in the array total.
    else if ([self count] == 6) {
        int card1Rank = [[[self objectAtIndex:0] valueForKey:@"rank"] intValue];
        int card2Rank = [[[self objectAtIndex:1] valueForKey:@"rank"] intValue];
        int card3Rank = [[[self objectAtIndex:2] valueForKey:@"rank"] intValue];
        int card4Rank = [[[self objectAtIndex:3] valueForKey:@"rank"] intValue];
        int card5Rank = [[[self objectAtIndex:4] valueForKey:@"rank"] intValue];
        int card6Rank = [[[self objectAtIndex:5] valueForKey:@"rank"] intValue];

        id card1Suit = [[self objectAtIndex:0] valueForKey:@"suit"];
        id card2Suit = [[self objectAtIndex:1] valueForKey:@"suit"];
        id card3Suit = [[self objectAtIndex:2] valueForKey:@"suit"];
        id card4Suit = [[self objectAtIndex:3] valueForKey:@"suit"];
        id card5Suit = [[self objectAtIndex:4] valueForKey:@"suit"];
        id card6Suit = [[self objectAtIndex:5] valueForKey:@"suit"];

            // added
            // (6-card straight flush)  if cards 1-6 is straight flush
            if ((cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit)) {
                NSLog(@"Player has a six-card straight flush.  %d in the array.", [self count]);

                return TRUE;
            }
            // (5-card straight flushes)  if cards 1-5 or cards 2-6 make a straight flush
            else if ((cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit) ||  (cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards5And6AreSequential && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit && cards5And6AreSameSuit)) {
                NSLog(@"Player has a straight flush.  %d in the array.", [self count]);

                return TRUE;
            } else {
            NSLog(@"Player does not have a straight flush.  %d in the array.", [self count]);
            return  FALSE;
            }
        }

    // if only 5 cards in the array, only one possible straight flush
    else if ([self count] == 5) {
        int card1Rank = [[[self objectAtIndex:0] valueForKey:@"rank"] intValue];
        int card2Rank = [[[self objectAtIndex:1] valueForKey:@"rank"] intValue];
        int card3Rank = [[[self objectAtIndex:2] valueForKey:@"rank"] intValue];
        int card4Rank = [[[self objectAtIndex:3] valueForKey:@"rank"] intValue];
        int card5Rank = [[[self objectAtIndex:4] valueForKey:@"rank"] intValue];

        id card1Suit = [[self objectAtIndex:0] valueForKey:@"suit"];
        id card2Suit = [[self objectAtIndex:1] valueForKey:@"suit"];
        id card3Suit = [[self objectAtIndex:2] valueForKey:@"suit"];
        id card4Suit = [[self objectAtIndex:3] valueForKey:@"suit"];
        id card5Suit = [[self objectAtIndex:4] valueForKey:@"suit"];

        if (cards1And2AreSequential && cards2And3AreSequential && cards3And4AreSequential && cards4And5AreSequential && cards1And2AreSameSuit && cards2And3AreSameSuit && cards3And4AreSameSuit && cards4And5AreSameSuit) {
            NSLog(@"Player has a straight flush.  %d in the array.", [self count]);

            return TRUE;
        } else {
            NSLog(@"Player does not have a straight flush.  %d in the array.", [self count]);
            return FALSE;
        }
    }
    NSLog(@"Something is wrong in the isStraightFlush method.");

    return 0;
}

@end

下面是我的CCGamePlayLayer。这一层处理创造,洗牌,和处理甲板-在这种情况下,一个装载甲板,将使我每次皇家同花顺。我们首先制作一副牌,它包括两个不合身的球杆和10,J,Q,K和A的球杆。然后我们调用洗牌方法,然后发出棋盘,包括牌手的2张洞牌、3张牌、1张转弯牌和1张河牌。然后我们调用evaluateHand方法来确定玩家可以用他的7张牌做出的最好的牌。一旦确定了玩家拥有哪种类型的手,evaluateHand方法就会显示一个UIAlertView,它告诉玩家手是什么。

代码语言:javascript
复制
CCGamePlayLayer.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import <GameKit/GameKit.h>
#import <UIKit/UIKit.h>
#import "NSMutableArray+HandAnalysis.h"

@interface CCGamePlayLayer : CCLayer <CCTargetedTouchDelegate> {

    NSMutableArray *deck;
}

@property (nonatomic, retain) NSMutableArray *deck;
    @property (nonatomic, retain) hasPair, hasTwoPair, hasSet, hasStraight, hasFlush, hasBoat, hasQuads, hasStraightFlush, hasRoyalFlush;

CCGamePlayLayer.m

#import "CCGamePlayLayer.h"
#import "ItemsViewController.h"
#import "MGAppDelegate.h"
#import "Card.h"

@implementation CCGamePlayLayer

@synthesize deck;
@synthesize hasPair, hasTwoPair, hasSet, hasStraight, hasFlush, hasBoat, hasQuads, hasStraightFlush, hasRoyalFlush;

-(id)init {
    if (self = [super init]) {

        //  ... Make the buttons and background

        [self makeLoadedRoyalFlushDeck];
        [self shuffle];

        NSLog(@"Here's the shuffled deck, from the init method:");

        for (Card *c in deck) {
            NSLog(@"%@", c.imageName);
        }

        [self dealLoadedHoleCards];
    }
    return self;
}

-(NSMutableArray *)makeLoadedRoyalFlushDeck {
    Card *aceC = [Card spriteWithFile:@"pbwb1c.png"];
    [aceC setValue:@"Ac" forKey:@"imageName"];
    [aceC setValue:[NSNumber numberWithInt:1] forKey:@"rank"];
    [aceC setValue:@"club" forKey:@"suit"];

    Card *tenC = [Card spriteWithFile:@"pbwbtc.png"];
    [tenC setValue:@"Tc" forKey:@"imageName"];
    [tenC setValue:[NSNumber numberWithInt:10] forKey:@"rank"];
    [tenC setValue:@"club" forKey:@"suit"];

    Card *jackC = [Card spriteWithFile:@"pbwbjc.png"];
    [jackC setValue:@"Jc" forKey:@"imageName"];
    [jackC setValue:[NSNumber numberWithInt:11] forKey:@"rank"];
    [jackC setValue:@"club" forKey:@"suit"];

    Card *queenC = [Card spriteWithFile:@"pbwbqc.png"];
    [queenC setValue:@"Qc" forKey:@"imageName"];
    [queenC setValue:[NSNumber numberWithInt:12] forKey:@"rank"];
    [queenC setValue:@"club" forKey:@"suit"];

    Card *kingC = [Card spriteWithFile:@"pbwbkc.png"];
    [kingC setValue:@"Kc" forKey:@"imageName"];
    [kingC setValue:[NSNumber numberWithInt:13] forKey:@"rank"];
    [kingC setValue:@"club" forKey:@"suit"];

    Card *deuceS = [Card spriteWithFile:@"pbwb2s.png"];
    [deuceS setValue:@"2s" forKey:@"imageName"];
    [deuceS setValue:[NSNumber numberWithInt:2] forKey:@"rank"];
    [deuceS setValue:@"spade" forKey:@"suit"];

    Card *deuceD = [Card spriteWithFile:@"pbwb2d.png"];
    [deuceD setValue:@"2d" forKey:@"imageName"];
    [deuceD setValue:[NSNumber numberWithInt:2] forKey:@"rank"];
    [deuceD setValue:@"diamond" forKey:@"suit"];

    deck = [NSMutableArray arrayWithObjects: deuceS, deuceD, aceC, tenC, jackC, queenC, kingC, nil];

    for (Card *c in deck) {
        NSLog(@"%@", c.imageName);
    }

    return deck;
}

-(void)shuffle {
    NSLog(@"[self.deck count] == %d", [self.deck count]);
    for (int i = [self.deck count] - 1; i > 0; i--) {
        [self.deck exchangeObjectAtIndex:(arc4random_uniform([self.deck count] - 1)) withObjectAtIndex:i];
    }
    NSLog(@"The deck has been shuffled.");
    NSLog(@"Here is the shuffled deck:");

    for (Card *c in deck) {
        NSLog(@"%@", c.imageName);
    }
}

-(void)evaluateHand {
    if (playerHoleCard1 && playerHoleCard2 && !flop1 && !flop2 && !flop3 && !turn && !river) {
        UIAlertView *holeCardsAlert = [[UIAlertView alloc] initWithTitle:@"Whoa!" message:@"You've only been dealt your hole cards!  Slow down, there, killer!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [holeCardsAlert show];
    }
    else if (playerHoleCard1 && playerHoleCard2 && flop1 && flop2 && flop3 && !turn && !river) {
        UIAlertView *flopAlert = [[UIAlertView alloc] initWithTitle:@"FLOP" message:@"You need to wait until the board is completely dealt out to evaluate your hand." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [flopAlert show];
    }
    else if (playerHoleCard1 && playerHoleCard2 && flop1 && flop2 && flop3 && turn && !river) {
        UIAlertView *turnAlert = [[UIAlertView alloc] initWithTitle:@"TURN" message:@"Almost there.  One card to go, and then I'll tell you what kind of hand you have." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [turnAlert show];
    }
    else if (playerHoleCard1 && playerHoleCard2 && flop1 && flop2 && flop3 && turn && river) {

        // put the player's 2 hole cards and the 5 board cards in an array for sorting
        NSMutableArray *allCards = [NSMutableArray arrayWithObjects:flop1, flop2, flop3, turn, river, playerHoleCard1, playerHoleCard2, nil];

        // first check for higher hands
        // royal flush
        id sequentialHand           = [allCards sortByRank];
        id sequentialAndSuitedHand  = [sequentialHand sortBySuit];

        // Check for straight flush first
        hasRoyalFlush = [sequentialAndSuitedHand isStraightFlush];

        // Checking for straight or flush
        hasStraight = [sequentialHand isStraight];
        hasFlush = [sequentialAndSuitedHand isFlush];

        // Checking for quads, we check the original array
        hasQuads = [allCards isQuads];

        // Check for SF
        if (hasStraight == TRUE && hasFlush == TRUE) {
            if (hasRoyalFlush == TRUE) {
                hasStraightFlush = FALSE;
                hasStraight = FALSE;
                hasFlush = FALSE;
                NSLog(@"hasRoyalFlush == TRUE");
            } else if (hasRoyalFlush == FALSE) {
                NSLog(@"hasRoyalFlush == FALSE");
            }
        }
        else if (hasRoyalFlush == FALSE) {
                hasStraight = FALSE;
                hasFlush = FALSE;
                UIAlertView *straightFlushAlert = [[UIAlertView alloc] initWithTitle:@"STRAIGHT FLUSH" message:@"You have a straight flush." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [straightFlushAlert show];
            } else if (hasStraightFlush == FALSE) {
                NSLog(@"hasStraightFlush == FALSE");
            } else {
                NSLog(@"Some problem in determining whether hasStraightFlush is TRUE or FALSE.");
            }

        // check for straight
        if (hasStraight == TRUE) {
            UIAlertView *straightAlert = [[UIAlertView alloc] initWithTitle:@"STRAIGHT" message:@"You have a straight." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [straightAlert show];

            NSLog(@"Player has a straight.");
        }

        if (hasFlush == TRUE) {
            UIAlertView *flushAlert = [[UIAlertView alloc] initWithTitle:@"FLUSH" message:@"You have a flush." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [flushAlert show];

            NSLog(@"Player has a flush.");
        }

        if (hasQuads == TRUE) {
            hasPair = FALSE;
            hasTwoPair = FALSE;
            hasStraight = FALSE;
            hasFlush = FALSE;
            UIAlertView *quadsAlert = [[UIAlertView alloc] initWithTitle:@"QUADS" message:@"You have four of a kind." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [quadsAlert show];
        }
    }
}

@end

下面是我从控制台得到的,当我运行这个并试图评估我拥有的手时:

代码语言:javascript
复制
2013-03-14 10:27:53.045 TexasHoldemGame[7600:c07] sortByRank called.
2013-03-14 10:27:53.045 TexasHoldemGame[7600:c07] 1
2013-03-14 10:27:53.046 TexasHoldemGame[7600:c07] 2
2013-03-14 10:27:53.047 TexasHoldemGame[7600:c07] 2
2013-03-14 10:27:53.048 TexasHoldemGame[7600:c07] 10
2013-03-14 10:27:53.049 TexasHoldemGame[7600:c07] 11
2013-03-14 10:27:53.049 TexasHoldemGame[7600:c07] 12
2013-03-14 10:27:53.050 TexasHoldemGame[7600:c07] 13
2013-03-14 10:27:53.050 TexasHoldemGame[7600:c07] For thoroughness, here it is with both values and suits:
2013-03-14 10:27:53.051 TexasHoldemGame[7600:c07] 1 of club
2013-03-14 10:27:53.051 TexasHoldemGame[7600:c07] 2 of diamond
2013-03-14 10:27:53.052 TexasHoldemGame[7600:c07] 2 of spade
2013-03-14 10:27:53.053 TexasHoldemGame[7600:c07] 10 of club
2013-03-14 10:27:53.053 TexasHoldemGame[7600:c07] 11 of club
2013-03-14 10:27:53.054 TexasHoldemGame[7600:c07] 12 of club
2013-03-14 10:27:53.054 TexasHoldemGame[7600:c07] 13 of club
2013-03-14 10:27:53.055 TexasHoldemGame[7600:c07] sortBySuit called.
2013-03-14 10:27:53.055 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.056 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.056 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.057 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.057 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.058 TexasHoldemGame[7600:c07] diamond
2013-03-14 10:27:53.058 TexasHoldemGame[7600:c07] spade
2013-03-14 10:27:53.059 TexasHoldemGame[7600:c07] For thoroughness, here it is with both values and suits:
2013-03-14 10:27:53.059 TexasHoldemGame[7600:c07] 1 of club
2013-03-14 10:27:53.060 TexasHoldemGame[7600:c07] 10 of club
2013-03-14 10:27:53.061 TexasHoldemGame[7600:c07] 11 of club
2013-03-14 10:27:53.061 TexasHoldemGame[7600:c07] 12 of club
2013-03-14 10:27:53.062 TexasHoldemGame[7600:c07] 13 of club
2013-03-14 10:27:53.062 TexasHoldemGame[7600:c07] 2 of diamond
2013-03-14 10:27:53.063 TexasHoldemGame[7600:c07] 2 of spade
2013-03-14 10:27:53.063 TexasHoldemGame[7600:c07] isStraightFlush bool method called.
2013-03-14 10:27:53.064 TexasHoldemGame[7600:c07] sortByRank called.
2013-03-14 10:27:53.064 TexasHoldemGame[7600:c07] 1
2013-03-14 10:27:53.065 TexasHoldemGame[7600:c07] 2
2013-03-14 10:27:53.066 TexasHoldemGame[7600:c07] 2
2013-03-14 10:27:53.067 TexasHoldemGame[7600:c07] 10
2013-03-14 10:27:53.067 TexasHoldemGame[7600:c07] 11
2013-03-14 10:27:53.069 TexasHoldemGame[7600:c07] 12
2013-03-14 10:27:53.070 TexasHoldemGame[7600:c07] 13
2013-03-14 10:27:53.070 TexasHoldemGame[7600:c07] For thoroughness, here it is with both values and suits:
2013-03-14 10:27:53.071 TexasHoldemGame[7600:c07] 1 of club
2013-03-14 10:27:53.072 TexasHoldemGame[7600:c07] 2 of diamond
2013-03-14 10:27:53.073 TexasHoldemGame[7600:c07] 2 of spade
2013-03-14 10:27:53.073 TexasHoldemGame[7600:c07] 10 of club
2013-03-14 10:27:53.073 TexasHoldemGame[7600:c07] 11 of club
2013-03-14 10:27:53.074 TexasHoldemGame[7600:c07] 12 of club
2013-03-14 10:27:53.074 TexasHoldemGame[7600:c07] 13 of club
2013-03-14 10:27:53.076 TexasHoldemGame[7600:c07] sortBySuit called.
2013-03-14 10:27:53.077 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.078 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.079 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.080 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.082 TexasHoldemGame[7600:c07] club
2013-03-14 10:27:53.082 TexasHoldemGame[7600:c07] diamond
2013-03-14 10:27:53.083 TexasHoldemGame[7600:c07] spade
2013-03-14 10:27:53.083 TexasHoldemGame[7600:c07] For thoroughness, here it is with both values and suits:
2013-03-14 10:27:53.084 TexasHoldemGame[7600:c07] 1 of club
2013-03-14 10:27:53.084 TexasHoldemGame[7600:c07] 10 of club
2013-03-14 10:27:53.085 TexasHoldemGame[7600:c07] 11 of club
2013-03-14 10:27:53.086 TexasHoldemGame[7600:c07] 12 of club
2013-03-14 10:27:53.087 TexasHoldemGame[7600:c07] 13 of club
2013-03-14 10:27:53.088 TexasHoldemGame[7600:c07] 2 of diamond
2013-03-14 10:27:53.089 TexasHoldemGame[7600:c07] 2 of spade
2013-03-14 10:27:53.090 TexasHoldemGame[7600:c07] Amount of cards in the array:  7
2013-03-14 10:27:53.092 TexasHoldemGame[7600:c07] Player does not have a straight flush.  7 in the array.
2013-03-14 10:27:53.092 TexasHoldemGame[7600:c07] isStraight called.
2013-03-14 10:27:53.093 TexasHoldemGame[7600:c07] Back in the isStraight method again.
2013-03-14 10:27:53.094 TexasHoldemGame[7600:c07] We're about to start iterating through the array, and here are the ranks in the array, before elimination:
2013-03-14 10:27:53.095 TexasHoldemGame[7600:c07] Rank:  1
2013-03-14 10:27:53.096 TexasHoldemGame[7600:c07] Rank:  2
2013-03-14 10:27:53.098 TexasHoldemGame[7600:c07] Rank:  2
2013-03-14 10:27:53.098 TexasHoldemGame[7600:c07] Rank:  10
2013-03-14 10:27:53.099 TexasHoldemGame[7600:c07] Rank:  11
2013-03-14 10:27:53.099 TexasHoldemGame[7600:c07] Rank:  12
2013-03-14 10:27:53.099 TexasHoldemGame[7600:c07] Rank:  13
2013-03-14 10:27:53.102 TexasHoldemGame[7600:c07] This is how many items are in the array, currently:  6
2013-03-14 10:27:53.103 TexasHoldemGame[7600:c07] After elimination:
2013-03-14 10:27:53.104 TexasHoldemGame[7600:c07] Rank:  1
2013-03-14 10:27:53.104 TexasHoldemGame[7600:c07] Rank:  2
2013-03-14 10:27:53.105 TexasHoldemGame[7600:c07] Rank:  10
2013-03-14 10:27:53.105 TexasHoldemGame[7600:c07] Rank:  11
2013-03-14 10:27:53.105 TexasHoldemGame[7600:c07] Rank:  12
2013-03-14 10:27:53.106 TexasHoldemGame[7600:c07] Rank:  13
2013-03-14 10:27:53.106 TexasHoldemGame[7600:c07] There are 5 or more cards.  Proceed.
2013-03-14 10:27:53.107 TexasHoldemGame[7600:c07] tempHand objectAtIndex:0 == 1
2013-03-14 10:27:53.107 TexasHoldemGame[7600:c07] tempHand objectAtIndex:1 == 2
2013-03-14 10:27:53.108 TexasHoldemGame[7600:c07] tempHand objectAtIndex:2 == 10
2013-03-14 10:27:53.143 TexasHoldemGame[7600:c07] tempHand objectAtIndex:3 == 11
2013-03-14 10:27:53.144 TexasHoldemGame[7600:c07] tempHand objectAtIndex:4 == 12
2013-03-14 10:27:53.144 TexasHoldemGame[7600:c07] tempHand objectAtIndex:5 == 13
2013-03-14 10:27:53.145 TexasHoldemGame[7600:c07] You have a straight.
2013-03-14 10:27:53.145 TexasHoldemGame[7600:c07] isFlush bool method called.
2013-03-14 10:27:53.146 TexasHoldemGame[7600:c07] FLUSH!!!  FLUSH!!!  FLUSH!!!
2013-03-14 10:27:53.146 TexasHoldemGame[7600:c07] isQuads bool method called.
2013-03-14 10:27:53.147 TexasHoldemGame[7600:c07] Print out the array, so we know what we're dealing with:
2013-03-14 10:27:53.148 TexasHoldemGame[7600:c07] 12 of club
2013-03-14 10:27:53.148 TexasHoldemGame[7600:c07] 1 of club
2013-03-14 10:27:53.149 TexasHoldemGame[7600:c07] 13 of club
2013-03-14 10:27:53.150 TexasHoldemGame[7600:c07] 2 of diamond
2013-03-14 10:27:53.150 TexasHoldemGame[7600:c07] 2 of spade
2013-03-14 10:27:53.151 TexasHoldemGame[7600:c07] 11 of club
2013-03-14 10:27:53.152 TexasHoldemGame[7600:c07] 10 of club
2013-03-14 10:27:53.152 TexasHoldemGame[7600:c07] Number of Aces:  1
Number of Deuces:  2
Number of Threes:  0
Number of Fours:  0
Number of Fives:  0
Number of Sixes:  0
Number of Sevens:  0
Number of Eights:  0
Number of Nines:  0
Number of Tens:  1
Number of Jacks:  1
Number of Queens:  1
Number of Kings:  1
2013-03-14 10:27:53.153 TexasHoldemGame[7600:c07] PLayer does not have quads.
2013-03-14 10:27:53.153 TexasHoldemGame[7600:c07] hasRoyalFlush == FALSE
2013-03-14 10:27:53.522 TexasHoldemGame[7600:c07] Player has a straight.
2013-03-14 10:27:53.523 TexasHoldemGame[7600:c07] Player has a flush.

而且,正如您可以想象的那样,在屏幕上的两个UIAlertViews上弹出“直”和“冲”的警报视图。我已经为isStraightFlush和另一种方法尝试了上面的方法:在方法中创建一个临时数组,将接收数组存储在临时数组中的游戏播放层中,将卡片分散到四个单独的数组中(clubArray、diamondArray、heartArray、spadeArray),然后遍历数组以查看卡片是否顺序有序,就像我上面所做的那样。如果数组少于5张卡,那么当然不可能直接刷新。

我不知道我做错了什么。抱歉,这篇文章太长了。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-03-14 18:52:05

问题在于:

代码语言:javascript
复制
[self sortByRank];
[self sortBySuit];

这些方法不修改数组,而是返回排序数组,然后将其丢弃。

我的建议是:不要在NSMutableArray上创建一个类别,而是使用一个名为cards的NSMutableArray属性创建一个Hand类。然后-sortByRank-sortBySuit可以重新分配该属性,在逻辑的其余部分,用self.cards替换self

备注: Oops。我认为这并不是问题所在,因为在调用-isStraightFlush之前,您正在按级别和匹配进行排序。不过,这些台词只会让人迷惑。

我将留下这个答案,因为我关于建立一个更好的模型类的建议仍然有效。

补充道:,您也不应该对NSNumber和NSString对象进行指针比较。这可能就是问题所在。

代码语言:javascript
复制
card1.suit == card2.suit
card1.rank == (card2.rank - 1)

相反,请比较以下值:

代码语言:javascript
复制
[card1.suit isEqualToString:card2.suit]
card1.rank.integerValue == card2.rank.integerValue - 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15416519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档