扑克牌手力量

时间:2018-02-08 16:08:57

标签: objective-c poker

我已经以编程方式确定了手的排名,如下所示。然而,问题是 - 如果说,两个玩家最终得到一对......我如何确定获胜者?

对于每个卡片对象,我添加了素数值。 Ace为41,平均为3和中间。我正在考虑在确定手牌时将这些值乘以,并且谁拥有最高值就赢了。我需要帮助确定这是否是正确的方法。

+(BOOL)isFull:(NSArray*)cards {
    Cards *card1 = [cards objectAtIndex:0];
    Cards *card2 = [cards objectAtIndex:1];
    Cards *card3 = [cards objectAtIndex:2];
    Cards *card4 = [cards objectAtIndex:3];
    Cards *card5 = [cards objectAtIndex:4];

    if (([card1.face isEqualToString:card3.face] && [card4.face isEqualToString:card5.face]) || ([card1.face isEqualToString:card2.face] && [card3.face isEqualToString:card5.face])) {
        return true;
    }
    return false;
}
+(BOOL)isFlush:(NSArray*)cards {
    NSMutableArray *organizedBySuit = [self organizeCardsSuitOrder:cards];

    Cards *card1 = [organizedBySuit objectAtIndex:0];
    Cards *card2 = [organizedBySuit objectAtIndex:4];

    if ([card1.suit isEqualToString:card2.suit]) {  return true; } else { return false; } // cards are organized by suit, so if the first equals the last..
}
+(BOOL)isStraight:(NSArray*)cards {
    Cards *card1 = [cards objectAtIndex:0];
    Cards *card2 = [cards objectAtIndex:1];
    Cards *card3 = [cards objectAtIndex:2];
    Cards *card4 = [cards objectAtIndex:3];
    Cards *card5 = [cards objectAtIndex:4];

    if ((card1.rankByInt) == 0 && (card2.rankByInt) == 9 && (card3.rankByInt) == 10 && (card4.rankByInt) == 11 && (card5.rankByInt) == 12) {
        return true;
    }
    else if ((card1.rankByInt) < 9) {
        if ((card2.rankByInt) == (card1.rankByInt) + 1) {
            if ((card3.rankByInt) == (card1.rankByInt) + 2) {
                if ((card4.rankByInt) == (card1.rankByInt) + 3) {
                    if ((card5.rankByInt) == (card1.rankByInt) + 4) {
                        return true;
                    }
                }
            }
        }
    }

    return false;
}
+(BOOL)isTrip:(NSArray*)cards {
    NSArray *faces = [self returnArrayOfFaces];

    __block int pairCounter = 0;
    for (int i = 0; i < [faces count]; i++) {
        for (int t = 0; t < [cards count]; t++) {
            Cards *card = [cards objectAtIndex:t];
            if ([card.face isEqualToString:faces[i]]) {
                pairCounter++;
            }
        }
        if (pairCounter > 2) {
            return true;
        }
        pairCounter = 0;
    }
    return false;
}
+(BOOL)isTwoPair:(NSArray*)cards {
    NSArray *faces = [self returnArrayOfFaces];

    __block int pairCount = 0;
    __block int doublePairCount = 0;

    for (int i = 0; i < [faces count]; i++) {
        for (int t = 0; t < [cards count]; t++) {
            Cards *card = [cards objectAtIndex:t];
            if ([card.face isEqualToString:faces[i]]) {
                pairCount++;
            }
        }
        if (pairCount > 1) {
            doublePairCount++;
        }
        pairCount = 0;
    }
    if (doublePairCount > 1) {
        return true;
    }

    return false;
}
+(BOOL)isPair:(NSArray*)cards {
    NSArray *faces = [self returnArrayOfFaces];

    __block int pairCounter = 0;
    for (int i = 0; i < [faces count]; i++) {
        for (int t = 0; t < [cards count]; t++) {
            Cards *card = [cards objectAtIndex:t];
            if ([card.face isEqualToString:faces[i]]) {
                pairCounter++;
            }
        }
        if (pairCounter > 1) {
            return true;
        }
        pairCounter = 0;
    }

    return false;
}

生成这些牌以包含他们的素数。

+(NSMutableArray*)createDeck:(id)sender {
    [sender removeAllObjects];
    NSArray *faces = [[NSArray alloc] initWithObjects:@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K", nil];
    NSArray *suits = [[NSArray alloc] initWithObjects:@"h",@"d",@"c",@"s", nil];
    NSArray *primes = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:41],[NSNumber numberWithInt:2],[NSNumber numberWithInt:3],[NSNumber numberWithInt:5],[NSNumber numberWithInt:7],[NSNumber numberWithInt:11],[NSNumber numberWithInt:13],[NSNumber numberWithInt:17],[NSNumber numberWithInt:19],[NSNumber numberWithInt:23],[NSNumber numberWithInt:29],[NSNumber numberWithInt:31],[NSNumber numberWithInt:37], nil];
    for (int i = 0; i < 52; i++) {
        Cards *card = [[Cards alloc]init];
        card.face = [NSString stringWithFormat:@"%@", faces[i % 13]];
        card.suit = [NSString stringWithFormat:@"%@", suits[i / 13]];
        card.rankByInt = i % 13;
        card.symbol = [Cards symbolForSuit:card.suit];
        card.prime = [[primes objectAtIndex:(i % 13)] intValue];

        [sender addObject:card];
    }
    [sender shuffle];

    return sender;
}

所以,如果可能的话,你可以在我找到他们的等级(如冲洗,直接等)之后,向我提供基本上按照牌值排名的方法。

此外,如果您发现任何方法可以提高我的手牌检查效率,请分享。

1 个答案:

答案 0 :(得分:0)

首先评估手型。如果这些相等,则比较组成手牌的最高牌(除非是满座的,然后比较集合)。如果手型中的所有牌均相等,并且手型少于5张牌,则比较5张牌中第二高的牌。只有在两只手的5张牌的最佳组合相等的情况下,才可以平局。

我用python编写了一个扑克手生成器和强度比较器,您可能对此有些兴趣:https://github.com/Alec-ala/poker-stud-showdown