PHP在7张卡片中连续检测5张卡片

时间:2019-03-22 11:46:37

标签: php function

我有此功能,如果手牌正好是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张纸牌。

1 个答案:

答案 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

Demo on 3v4l.org