我有此功能,如果手牌正好是5张牌,它可以检测到直牌,但是如果7张牌中的那只牌,则不确定如何找到一个。
public function straight($hand) {
sort($hand);
if ($hand == range($hand[0], $hand[count($hand)-1])) {
$this->hand_name = 'straight';
}
}
让我们假设该数组仅是一个数字字符串。因此,这些将是理想的结果。
2 3 5 7 12 7 4 - no straight
2 3 5 6 12 7 4 - straight
7 8 9 10 11 11 11 - straight
2 4 5 6 14 10 9 - no straight
让我们现在不必担心Ace是1或14的问题,我可以解决这个问题,但是该功能应该允许重复,因为这就是卡片的方式。
还请注意,我只需要确定是否有五张直牌即可。...我不需要参与其中的卡或将它们与另一张卡进行比较等等。
编辑:我还要指出一点,它当然应该在较少的纸牌(例如6张纸牌或5张纸)内直接检测到5张纸牌。
答案 0 :(得分:3)
您可以简单地修改现有功能,以对排序后的7张纸牌中的5张纸牌进行迭代(使用array_slice
创建)。
function straight($hand) {
sort($hand);
for ($i = 0; $i <= count($hand) - 5; $i++) {
$subhand = array_slice($hand, $i, 5);
if ($subhand == range($subhand[0], $subhand[count($subhand)-1])) {
echo implode(',' , $hand) . " => straight\n";
break;
}
}
}
straight(array(2, 3, 5, 7, 12, 7, 4));
straight(array(2, 3, 5, 6, 12, 7, 4));
straight(array(7, 8, 9, 10, 11, 11, 11));
straight(array(2, 4, 5, 6, 14, 10, 9));
straight(array(2, 3, 5, 7, 7, 4));
straight(array(3, 5, 6, 12, 7, 4));
straight(array(7, 8, 9, 10, 11));
straight(array(2, 4, 5, 6, 3));
输出:
2,3,4,5,6,7,12 => straight
7,8,9,10,11,11,11 => straight
3,4,5,6,7,12 => straight
7,8,9,10,11 => straight
2,3,4,5,6 => straight