PHP Poker Texas Holdem-检查是否正确

PHP Poker Texas Holdem-检查是否正确,php,poker,Php,Poker,我真的认为这将更容易评估一个直,但唉,我在这里经过了几天的努力 我有一副牌,每个玩家得到两张牌,当涉及到评估时,我将玩家牌和社区牌结合起来,并将它们从高到低排序 这个数组看起来像['14d'、'13d'、'12d'、'1d'、'10d'、'9d'、'8d'如王牌钻石、国王钻石、女王钻石等 我尝试了多种方法,例如循环和手动评估每张卡,但需要使用最少5张卡(2张玩家卡+3张社区卡)评估,最多7张卡(2张玩家卡+5张社区卡) 以下是我的一个尝试: $hand = ['14d', '13d', '

我真的认为这将更容易评估一个直,但唉,我在这里经过了几天的努力

我有一副牌,每个玩家得到两张牌,当涉及到评估时,我将玩家牌和社区牌结合起来,并将它们从高到低排序

这个数组看起来像
['14d'、'13d'、'12d'、'1d'、'10d'、'9d'、'8d'如王牌钻石、国王钻石、女王钻石等

我尝试了多种方法,例如循环和手动评估每张卡,但需要使用最少5张卡(2张玩家卡+3张社区卡)评估,最多7张卡(2张玩家卡+5张社区卡)

以下是我的一个尝试:

  $hand =  ['14d', '13d', '12d', '11d', '10d', '9d', '8d']; //Debug hand variable
  $hand_len = count($hand);
  $l_card = (int)$hand[0];

  $set = array();
  rsort($hand, SORT_NUMERIC);
  for ($i=0; $i < $hand_len; $i++) {

    //Which values to compare
    if ( $i+1 != $hand_len && $i+2 != $hand_len) {
      $c1 = (int)$hand[$i]; //14
      $c2 = (int)$hand[$i+1]; //13

      if ( $c1 == $c2+1 ) { //if 14 == 13(+1)
        array_push($set, $hand[$i]);
      }

    } elseif ($i+1 == $hand_len && $i+2 == $hand_len) {
      $c1 = (int)$hand[$i]; //8
      $c2 = (int)$hand[$i-1];//9

      if ( $c1 == $c2-1 ) { //if 8 == 9(-1)
        array_push($set, $hand[$i]);
      }
    }

  }
//Still to add evaluation for 14 (Ace) being used for low straight (eg. 14d, 2d, 3d...).
$hand=['14d','13d','12d','11d','10d','9d','8d']//调试手变量
$hand\u len=计数($hand);
$l_card=(int)$hand[0];
$set=array();
rsort($hand,SORT\u NUMERIC);
对于($i=0;$i<$hand_len;$i++){
//要比较哪些值
如果($i+1!=$hand\u len&&$i+2!=$hand\u len){
$c1=(int)$hand[$i];//14
$c2=(int)$hand[$i+1];//13
如果($c1==c2+1){//如果14==13(+1)
数组_push($set,$hand[$i]);
}
}其他($i+1==$hand\u len&$i+2==$hand\u len){
$c1=(int)$hand[$i];//8
$c2=(int)$hand[$i-1];//9
如果($c1==c2-1){//If8==9(-1)
数组_push($set,$hand[$i]);
}
}
}
//仍需添加用于低直线(如14d、2d、3d…)的14(Ace)评估。
对于每一张卡,我必须转换成一个整数来去掉套装字符,然后进行计算。我可以获得一定程度的成功,直到它必须评估最后一张牌

比如说<代码>['14d','13d','12d','11d','10d','9d','8d']您使用“设置”的方法是好的,但在某些时候,您必须检查是否已达到5张卡。你还必须检查你是否在直道上碰到了一个缺口,你必须重新开始。您的代码不适用于重复卡,如
12d
12h

为了简单起见,我从输入中删除了套装,只处理数字。首先,删除所有重复项并像使用
array\u unique()
rsort()
一样对它们进行排序。然后你保留一张单子/一套卡片,这些卡片是直线的一部分。在合适的情况下为该链添加新卡。当最后一张卡的值只有
1
不同时,就会出现这种情况。当差值大于
1
时,您就知道它不再是直线了。在这一点上,你必须检查一个新的直从该位置与剩余的卡。请参阅以下示例源代码:

$cards = array(6, 9, 5, 12, 7, 8, 11);
echo "Input cards: ".implode(',', $cards)."\n";
$cards = array_unique($cards);
rsort($cards);

$set = array(array_shift($cards)); // start with the first card
foreach ($cards as $card) {
    $lastCard = $set[count($set)-1];
    if ($lastCard - 1 != $card) {
        // not a chain anymore, "restart" from here
        $set = array($card);
    } else {
        $set[] = $card;
    }
    if (count($set) == 5) {
        break;
    }
}
if (count($set) == 5) {
    echo "Found a straight with ".implode(',', $set)."\n";
} else {
    echo "No straight\n";
}
这将生成以下输出:

输入卡:6,9,5,12,7,8,11
找到一个9,8,7,6,5的直线
循环按如下方式在已排序的卡片上迭代
12、11、9、8、7、6、5

已排序卡片集内容
--------------------------------------

12,11,9,8,7,6,5[12]当你说
我的一次尝试
时,这是否意味着这是一次最有希望的尝试,也是我们应该研究缺陷/错误的尝试,还是仅此而已?