private function sortCardsByValue(array $cards) { // 将A(1)单独处理,放到数组最后 $aCards = array_filter($cards, fn($cardNum) => $cardNum % 16 === 1); $otherCards = array_filter($cards, fn($cardNum) => $cardNum % 16 !== 1); $cards = array_merge($otherCards, $aCards);

// 将所有通配牌移到数组最后
$wildCards = array_filter($cards, fn($cardNum) => $cardNum % 13 === 0);
$otherCards = array_filter($cards, fn($cardNum) => $cardNum % 13 !== 0);
$cards = array_merge($otherCards, $wildCards);

// 将所有2移到数组最后
$twoCards = array_filter($cards, fn($cardNum) => $cardNum % 13 === 0 && $cardNum !== 64);
$otherCards = array_filter($cards, fn($cardNum) => $cardNum % 13 !== 0 || $cardNum === 64);
$cards = array_merge($otherCards, $twoCards);

// 将每个缺口和其对应的通配牌组成一个元素,放到一个数组中
$gaps = [];
for ($i = 0; $i < count($cards) - 1; $i++) {
    $gap = $cards[$i + 1] - $cards[$i] - 1;
    if ($gap > 0) {
        $gaps[] = [
            'start' => $cards[$i] + 1,
            'end' => $cards[$i + 1] - 1,
            'wild' => [],
        ];
    }
}

// 将所有通配牌按照花色分组
$wildCardsBySuit = [];
foreach ($wildCards as $wildCard) {
    $suit = intdiv($wildCard - 1, 16) + 1;
    $wildCardsBySuit[$suit][] = $wildCard;
}

// 将每个缺口和其对应的通配牌进行匹配
foreach ($gaps as &$gap) {
    $suit = intdiv($gap['start'] - 1, 16) + 1;
    $wildCardsInSuit = $wildCardsBySuit[$suit] ?? [];
    foreach ($wildCardsInSuit as $wildCard) {
        $value = $wildCard % 13 ?: 13;
        if ($value >= $gap['start'] % 13 && $value <= $gap['end'] % 13) {
            $gap['wild'][] = $wildCard;
        }
    }
}

// 将缺口按照长度从小到大排序
usort($gaps, fn($gap1, $gap2) => count($gap1['wild']) - count($gap2['wild']));

// 将通配牌插入缺口
foreach ($gaps as $gap) {
    $cardsInGap = array_filter($cards, fn($cardNum) => $cardNum >= $gap['start'] && $cardNum <= $gap['end']);
    $wildCardsInGap = array_splice($gap['wild'], 0, count($cardsInGap));
    $cardsInGap = array_map(function($cardNum) use ($wildCardsInGap) {
        if ($cardNum % 13 === 0) {
            return array_shift($wildCardsInGap) ?: $cardNum;
        } else {
            return $cardNum;
        }
    }, $cardsInGap);
    $cards = array_merge(array_diff($cards, array_diff($cardsInGap, $wildCardsInGap)), $cardsInGap);
}

return $cards;
php 题目说明及要求:请使用面向对象思维答题且不要依赖枚举禁止出现notice请自行修改phpini不要屏蔽错误输出扑克牌编码规则如下:使用从1开始的十进制整数为每张扑克牌进行编码花色顺序:黑桃红桃梅花方块每副牌占用64个数字如1-6465-128以此类推;每个花色占用16个数字但实际使用了13个如1-13是黑桃A到K17-29是红桃A到K以此类推;最后两个数字为大小王如6364通配牌:大王、小

原文地址: https://www.cveoy.top/t/topic/ckDC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录