php 题目说明及要求:请使用面向对象思维答题且不要依赖枚举禁止出现notice请自行修改phpini不要屏蔽错误输出扑克牌编码规则如下:使用从1开始的十进制整数为每张扑克牌进行编码花色顺序:黑桃红桃梅花方块每副牌占用64个数字如1-6465-128以此类推;每个花色占用16个数字但实际使用了13个如1-13是黑桃A到K17-29是红桃A到K以此类推;最后两个数字为大小王如6364通配牌:大王、小
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;
原文地址: https://www.cveoy.top/t/topic/ckDC 著作权归作者所有。请勿转载和采集!