Как отсортировать покерную комбинацию, чтобы найти стрит как высокий, так и низкий? - PullRequest
0 голосов
/ 19 марта 2020

Допустим, у меня есть колода карт, представленная в виде массива, подобного следующему:

$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;
}

Оттуда я могу легко определить, являются ли карты последовательными и, таким образом, составляют стрит в покере.

Однако проблема заключается в Туз как бы может быть как высоким, так и низким. Как я смогу обнаружить прямую без изменения поля sort в массиве? Или если бы мне нужно было полностью изменить его, как бы я сделал это, не влияя на тот факт, что карты все еще должны быть отсортированы как высокие Ace, когда я переупорядочиваю всю колоду?

Например, в покерной руке A, 2, 3, 4, 5 это считается прямой, поскольку Ace может быть как 1, так и 11 в зависимости от того, где он лучше всего подходит. Итак, в руке A, K, Q, J, 10 туз высок. Они оба прямые, но влияют на поле сортировки для туза. Как лучше всего решить проблему такого типа?

1 Ответ

0 голосов
/ 22 марта 2020

Я решил эту проблему, в основном разбив чек на прямую на две функции: isStraight() и isLowStraight(). Если произойдет сбой isStraight(), который проверяет стрит на основе возрастающего порядка сортировки и считает Ace высоким, то он возвращает isLowStraight(), который проверяет стрит в порядке возрастания и считает Ace низким. По сути, функция isLowStraight() ищет туза, и если он найден, он перемещает его из нижней части отсортированного списка в верхнюю часть, то есть array_unshift($cards, array_pop($cards)), так что теперь он считается самой низкой возможной картой вместо самой высокой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...