<?php namespace frontend\business; class NiuNiuGameHelper { /** * @param $card * @return int 結果 -1 每牛; 0 牛牛; 1 - 9 牛一 到 牛九 */ public static function JudgeCowCow($card) { if(!is_array($card) || count($card) !== 5) { return -1; } $cow = -1; //計算5張牌總值,cow計算牛幾。 $cardall = 0; $n=0;//存儲10、J、Q、K張數。 for($i=0;$i<4;$i++)//對5張牌從大到小排序。 { for($j=$i+1;$j<5;$j++) if($card[$i] < $card[$j]) { $a = $card[$i]; $card[$i] = $card[$j]; $card[$j]=$a; } } for($i=0;$i<5;$i++) { if($card[$i] >= 10) { $n++; $card[$i] = 10; } $cardall += $card[$i]; } //10 10 6 5 3 牛牛時5張牌總和肯定是10的倍數,五張牌總和是10的倍數未必是牛牛,下面代碼不成立 //if(cardall %10 == 0) //{ // print(0);//牛牛 // exit(0); //} switch ($n) { case 0: //5張牌中沒有一張10、J、Q、K。 { for($i=0;$i<4;$i++) { for($j=$i + 1;$j<5;$j++) if(($cardall - $card[$i]- $card[$j])%10==0) { $cow=($card[$i] + $card[$j])%10; return $cow; } } break; } case 1: //5張牌中有一張10、J、Q、K。 { //先判斷是否有牛牛,不能判斷剩余四張相加為10倍數為牛牛,如 Q 8 5 4 3 //只能先判斷兩張是否是10的倍數,如果是再判斷剩余是否是10的倍數;有限判斷出牛牛;再來判斷三張是否有10的倍數,有的話有牛,否則無牛 for($i =1; $i < 4; $i ++) { for($j = $i +1; $j < 5; $j++) { if(($card[$i] + $card[$j]) % 10 == 0) { $cow=($cardall - $card[0])%10; return $cow; } } } //判斷是否有牛 for($i=1; $i<5; $i++) //剩下四張牌有三張加起來等於10 { if(($cardall - $card[0] - $card[$i])%10==0) { $cow=($cardall-$card[0])%10; break; } } break; } case 2: //5張牌中有兩張10、J、Q、K。 三張是個牛就有問題,應該優先輸出 { if(($cardall - $card[0] - $card[1])%10 == 0)//優先牛牛輸出 如 J Q 2 3 5;這里先檢查剩余是否為牛牛,否則算法有漏洞 { $cow = 0; } else { //10 10 6 5 3 n=2 i=3 j=4 cardall = 34 for($i=$n;$i<4;$i++)//剩下三(四)張牌有兩張加起來等於10。 { for($j=$i+1;$j<5;$j++) { if(($card[$i]+$card[$j])==10) { $temp = $cardall; for($k=0;$k<$n;$k++)//總值減去10、J、Q、K的牌。 $temp -= $card[$k]; // 18 $cow = $temp%10; //8 } } /*print_r('cardall:'.$cardall); print_r("<br />"); print_r('cow'.$cow); print_r("<br />");*/ } } break; } case 3: //5張牌中有三張10、J、Q、K。 case 4: //5張牌中有四張10、J、Q、K。 case 5: //5張牌中五張都是10、J、Q、K。 { for($i=0;$i<$n;$i++)//總值減去10、J、Q、K的牌。 { $cardall -= $card[$i]; } $cow = $cardall%10; break; } } return $cow; } }