从扑克牌中随机抽取5张牌, 判断是不是一个顺子, 即这5张牌是不是连续的2-10位数字本身,
A为1, J为11, Q为12, K为13, 而大小王可以看成任意数字
1. 大小王可以看成任意数字, 所以将大小王记为0
2. 将5个数放入一个数组中
3. 数组去重去0, 判断剩余元素的个数+原先0的个数 > 最大差值
<?php
/**
* 判断顺子
*
* @param $num1
* @param $num2
* @param $num3
* @param $num4
* @param $num5
* @return bool
*/
function isStraight($num1, $num2, $num3, $num4, $num5)
{
$arr = [$num1, $num2, $num3, $num4, $num5];
// 0的个数
$zeroCount = 0;
// 检查参数
$countValues = array_count_values($arr);
foreach ($countValues as $num => $count) {
if ($num == 0) {
// 0的个数不能超过2
if ($count > 2) {
return false;
}
$zeroCount = $count;
}
// 考虑重复数字会影响顺子(例如34456这样的数字会当成非顺子), 如果不考虑重复数字则删掉该判断
/*
elseif ($count > 1) {
return false;
}
*/
// 最大值不能超过13
elseif ($num > 13) {
return false;
}
}
// 数组去重
$uniqueArr = array_unique($arr);
// 数组排序
sort($uniqueArr);
// 如果第一个元素是0则删除第一个元素
if ($uniqueArr[0] == 0) {
array_shift($uniqueArr);
}
// 最大值-最小值 < 数组元素个数+0的个数
return (max($uniqueArr) - min($uniqueArr)) < (count($uniqueArr) + $zeroCount);
}
// 测试
// bool(true)
var_dump(isStraight(6,6,9,0,0));