实现三带一,三带二,四带二,顺子,王炸功能逻辑
代码:
php
class CardValidator {
// 逻辑
public function checkPokerType($cards) {
$counts = array_count_values($cards);
sort($cards);
$isStraight = true;
$isStraightFlush = true;
$isFourOfAKind = false;
$isFullHouse = false;
$isThreeOfAKind = false;
$isTwoPairs = false;
$isOnePair = false;
$isHighCard = true;
// 顺子判断
for ($i = 1; $i < count($cards); $i++) {
if ($cards[$i] != $cards[$i - 1] + 1) {
$isStraight = false;
break;
}
}
if(count($cards) == 2 && in_array('小王',$cards) && in_array('大王',$cards)){
return "王炸";
}
// 四带二和王炸判断
if (count($counts) == 2) {
$values = array_values($counts);
if (in_array(4, $values) && in_array(2, $values)) {
return "四带二";
}
}
// 三带一/三带二判断
if (count($counts) == 3) {
$values = array_values($counts);
if (in_array(3, $values)) {
if (in_array(1, $values)) {
return "三带一";
} elseif (in_array(2, $values)) {
return "三带二";
}
}
}
// 其他牌型判断
if (count($counts) == 4) {
$values = array_values($counts);
if (in_array(2, $values) && in_array(2, $values)) {
$isTwoPairs = true;
} elseif (in_array(2, $values)) {
$isOnePair = true;
}
}
if ($isStraight) {
return "顺子";
}
return "牌选择错误";
}
}
// 测试
$cards0 = ['大王', '小王']; // 王炸
$cards1 = [3, 3, 3, 4, 5]; // 三带一
$cards2 = [3, 3, 3, 4, 4]; // 三带二
$cards3 = [3, 3, 3, 3, 5, 5]; // 四带二
$cards4 = [3, 4, 5, 6, 7]; // 顺子
$card = new CardValidator();
echo card->checkPokerType($cards0) . "\n"; // 输出:王炸
echo card->checkPokerType($cards1) . "\n"; // 输出:三带一
echo card->checkPokerType($cards2) . "\n"; // 输出:三带二
echo card->checkPokerType($cards3) . "\n"; // 输出:四带二
echo card->checkPokerType($cards4) . "\n"; // 输出:顺子