如何在值数组中查找三个的所有序列

How to find all sequences of three in an array of values

这里是第一个问题... 我正在编写一个简单的 3 张牌扑克手牌评估器,并且遇到问题 finding/extracting 多个 "straights" (顺序值序列)来自一个值数组。

我需要提取和 return 阵列可能具有的每条直线。这是一个例子:

(假设数组首先按数字递增排序)

myArray = [1h,2h,3c,3h,4c]

可能的三值序列是: [1 小时,2 小时,3 小时] [1 小时,2 小时,3 小时] [2h,3c,4c] [2h,3h,4c]

这是我查找 3 序列的原始代码,其中数组包含带有 .value 和 .suit 的卡片对象。在这个问题中为了简单起见,我只是在这里输入“2h”等:

private var _pokerHand = [1h,2h,3c,3h,4c];
private function getAllStraights(): Array 
{
    var foundStraights:Array = new Array();
    for (var i: int = 0; i < (_handLength - 2); i++) 
    {
        if ((_pokerHand[i].value - _pokerHand[i + 1].value) == 1 && (_pokerHand[i + 1].value - _pokerHand[i + 2].value) == 1) 
        {
            trace("found a straight!");
            foundStraights.push(new Array(_pokerHand[i], _pokerHand[i + 1], _pokerHand[i + 2]));
        }
    }
    return foundStraights;
}

但当存在重复值时(如上面的 3),它当然会失败。我不能丢弃重复项,因为它们可能有不同的花色。如上例所示,我需要所有可能的直线。这允许我 运行 通过 "Flush" 函数找到 "straight flush".

我缺少什么数组迭代技术?

这是一个有趣的问题。考虑到扑克游戏(和 Flash)的流行,我确信这个问题以前已经解决过很多次,但我无法在网上找到示例。以下是我的处理方式:

  • 将其视为寻路问题。
  • 以手中的每张牌作为可能路径(直线)的起点。
  • 虽然有可能的顺子:
    • 从列表中删除一个。
    • 找到所有接下来的有效步骤(可以是 none,或最多 4 张具有相同值的后续卡片),对于每个接下来的有效步骤:
      • 如果达到目标(完成直道),将其添加到找到的直道列表中。
      • 否则将下一步的可能顺子添加回堆栈。

这似乎符合您的要求(Card 对象具有 .value 作为 int):

private function getAllStraights(cards:Vector.<Card>, straightLength:uint = 3):Vector.<Vector.<Card>> {
    var foundStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];

    var possibleStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[];
    for each (var startingCard:Card in cards) {
        possibleStraights.push(new <Card>[startingCard]);
    }

    while (possibleStraights.length) {
        var possibleStraight:Vector.<Card> = possibleStraights.shift();
        var lastCard:Card = possibleStraight[possibleStraight.length - 1];
        var possibleNextCards:Vector.<Card> = new <Card>[];
        for (var i:int = cards.indexOf(lastCard) + 1; i < cards.length; i++) {
            var nextCard:Card = cards[i];
            if (nextCard.value == lastCard.value)
                continue;
            if (nextCard.value == lastCard.value + 1)
                possibleNextCards.push(nextCard);
            else
                break;
        }
        for each (var possibleNextCard:Card in possibleNextCards) {
            var possibleNextStraight:Vector.<Card> = possibleStraight.slice().concat(new <Card>[possibleNextCard]);
            if (possibleNextStraight.length == straightLength)
                foundStraights.push(possibleNextStraight);
            else
                possibleStraights.push(possibleNextStraight);
        }
    }

    return foundStraights;
}

给定 [1♥,2♥,3♣,3♥,4♣] 你得到:[1♥,2♥,3♣], [1♥,2♥,3♥], [2♥,3♣,4♣], [2♥,3♥,4♣]

当你有很多重复项时,它会变得非常有趣,比如 [1♥,1♣,1♦,1♠,2♥,2♣,3♦,3♠,4♣,4♦,4♥]。这给你:

[1♥,2♥,3♦], [1♥,2♥,3♠], [1♥,2♣,3♦], [1♥,2♣,3♠], [1♣,2♥,3♦], [1♣,2♥,3♠], [1♣,2♣,3♦], [1♣,2♣,3♠], [1♦,2♥,3♦], [1♦,2♥,3♠], [1♦,2♣,3♦], [1♦,2♣,3♠], [1♠,2♥,3♦], [1♠,2♥,3♠], [1♠,2♣,3♦], [1♠,2♣,3♠], [2♥,3♦,4♣], [2♥,3♦,4♦], [2♥,3♦,4♥], [2♥,3♠,4♣], [2♥,3♠,4♦], [2♥,3♠,4♥], [2♣,3♦,4♣], [2♣,3♦,4♦], [2♣,3♦,4♥], [2♣,3♠,4♣], [2♣,3♠,4♦], [2♣,3♠,4♥]

我没有仔细检查过这个,但一眼看上去就对了。