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]当你说我的一次尝试
时,这是否意味着这是一次最有希望的尝试,也是我们应该研究缺陷/错误的尝试,还是仅此而已?