代码之家  ›  专栏  ›  技术社区  ›  Sherif

如何对扑克牌牌进行排序,以找到高牌和低牌的直牌?

  •  0
  • Sherif  · 技术社区  · 5 年前

    假设我有一副牌,由如下数组表示。

    $cards = [
        "AS"  => ["sort" => 14, "suite" => "S", "value" => 11],
        "AC"  => ["sort" => 14, "suite" => "C", "value" => 11],
        "AD"  => ["sort" => 14, "suite" => "D", "value" => 11],
        "AH"  => ["sort" => 14, "suite" => "H", "value" => 11],
    
        "KS"  => ["sort" => 13, "suite" => "S", "value" => 10],
        "KC"  => ["sort" => 13, "suite" => "C", "value" => 10],
        "KD"  => ["sort" => 13, "suite" => "D", "value" => 10],
        "KH"  => ["sort" => 13, "suite" => "H", "value" => 10],
    
        "QS"  => ["sort" => 12, "suite" => "S", "value" => 10],
        "QC"  => ["sort" => 12, "suite" => "C", "value" => 10],
        "QD"  => ["sort" => 12, "suite" => "D", "value" => 10],
        "QH"  => ["sort" => 12, "suite" => "H", "value" => 10],
    
        "JS"  => ["sort" => 11, "suite" => "S", "value" => 10],
        "JC"  => ["sort" => 11, "suite" => "C", "value" => 10],
        "JD"  => ["sort" => 11, "suite" => "D", "value" => 10],
        "JH"  => ["sort" => 11, "suite" => "H", "value" => 10],
    
        "10S" => ["sort" => 10, "suite" => "S", "value" => 10],
        "10C" => ["sort" => 10, "suite" => "C", "value" => 10],
        "10D" => ["sort" => 10, "suite" => "D", "value" => 10],
        "10H" => ["sort" => 10, "suite" => "H", "value" => 10],
    
        "9S"  => ["sort" => 9, "suite" => "S", "value" => 9],
        "9C"  => ["sort" => 9, "suite" => "C", "value" => 9],
        "9D"  => ["sort" => 9, "suite" => "D", "value" => 9],
        "9H"  => ["sort" => 9, "suite" => "H", "value" => 9],
    
        "8S"  => ["sort" => 8, "suite" => "S", "value" => 8],
        "8C"  => ["sort" => 8, "suite" => "C", "value" => 8],
        "8D"  => ["sort" => 8, "suite" => "D", "value" => 8],
        "8H"  => ["sort" => 8, "suite" => "H", "value" => 8],
    
        "7S"  => ["sort" => 7, "suite" => "S", "value" => 7],
        "7C"  => ["sort" => 7, "suite" => "C", "value" => 7],
        "7D"  => ["sort" => 7, "suite" => "D", "value" => 7],
        "7H"  => ["sort" => 7, "suite" => "H", "value" => 7],
    
        "6S"  => ["sort" => 6, "suite" => "S", "value" => 6],
        "6C"  => ["sort" => 6, "suite" => "C", "value" => 6],
        "6D"  => ["sort" => 6, "suite" => "D", "value" => 6],
        "6H"  => ["sort" => 6, "suite" => "H", "value" => 6],
    
        "5S"  => ["sort" => 5, "suite" => "S", "value" => 5],
        "5C"  => ["sort" => 5, "suite" => "C", "value" => 5],
        "5D"  => ["sort" => 5, "suite" => "D", "value" => 5],
        "5H"  => ["sort" => 5, "suite" => "H", "value" => 5],
    
        "4S"  => ["sort" => 4, "suite" => "S", "value" => 4],
        "4C"  => ["sort" => 4, "suite" => "C", "value" => 4],
        "4D"  => ["sort" => 4, "suite" => "D", "value" => 4],
        "4H"  => ["sort" => 4, "suite" => "H", "value" => 4],
    
        "3S"  => ["sort" => 3, "suite" => "S", "value" => 3],
        "3C"  => ["sort" => 3, "suite" => "C", "value" => 3],
        "3D"  => ["sort" => 3, "suite" => "D", "value" => 3],
        "3H"  => ["sort" => 3, "suite" => "H", "value" => 3],
    
        "2S"  => ["sort" => 2, "suite" => "S", "value" => 2],
        "2C"  => ["sort" => 2, "suite" => "C", "value" => 2],
        "2D"  => ["sort" => 2, "suite" => "D", "value" => 2],
        "2H"  => ["sort" => 2, "suite" => "H", "value" => 2],
    ];
    

    我希望能够对任意数量的牌进行排序,以便根据排序顺序直接找到获胜的牌。我试着使用这样的函数。

    function sortCardsBySortOrder(Array $cards, $reverse = false): Array {
        uasort($cards, function($a, $b) use($reverse) {
            $result = $a['sort'] <=> $b['sort'];
            if (!$reverse) {
                $result *= -1;
            }
            if ($result == 0) {
                $result = $a['suite'] <=> $b['suite'];
            }
    
            return $result;
        });
        return $cards;
    }
    

    从那里,我可以很容易地发现,如果卡是连续的,从而构成一个直在扑克。

    然而,问题在于Ace,因为它可以是高的也可以是低的。我怎样才能在不改变方向的情况下检测到直线 sort 数组中的字段?或者,如果我需要完全改变它,我将如何做,而不影响这样一个事实,即当我重新排列整个牌组时,牌仍然需要被排序为Ace high?

    A, 2, 3, 4, 5 王牌 可以是1或11,具体取决于最适合的位置。所以在手上 A, K, Q, J, 10 王牌很高。这些都是直道,但会影响Ace的排序字段。处理这类问题的最佳方法是什么?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Sherif    5 年前

    我解决了这个问题,基本上将检查直接分解为两个函数: isStraight() isLowStraight() . 如果 isStraight() 失败,它将根据升序顺序检查直线,并将Ace计数为高,然后返回 它按升序检查直线,并将Ace计数为低。基本上 isLowStraight() 函数查找Ace,如果找到Ace,则将其从排序列表的底部移动到顶部,即。 array_unshift($cards, array_pop($cards)) ,因此,它现在被视为最低可能的卡,而不是最高可能的卡。