1){ $compare = array_slice($compare,0,$sameNum); for($i=0;$i<$sameNum-1;$i++){//对5张牌从大到小排序。 for($j=$i+1;$j<$sameNum;$j++){ if($compare[$i] > $compare[$j]){ $a = $compare[$i]; $compare[$i] = $compare[$j]; $compare[$j]=$a; } } } $max = $compare['0']; } $cow = -1; //计算5张牌总值,cow计算牛几。 $cardAll = 0; $n= 0 ;//存储10、J、Q、K张数。 $king = 0;//存储J、Q、K张数。 $result = array(); //计算J、Q、K张数。 for($i=0;$i<5;$i++){ if($card[$i] >= 11){ $king++; } } $word = ''; if($king == 5){ $cow = 11; $word = '五公'; $result['word'] = $word; $result['cow'] = $cow; $result['max'] = $max; return $result; } 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]; } 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; } } } 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; } } } //判断是否有牛 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++){ $temp -= $card[$k]; // 18 $cow = $temp%10; //8 } } } } } 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; } switch ($cow){ case 0: $word = 'NN'; break; case 1: $word = 'N1'; break; case 2: $word = 'N2'; break; case 3: $word = 'N3'; break; case 4: $word = 'N4'; break; case 5: $word = 'N5'; break; case 6: $word = 'N6'; break; case 7: $word = 'N7'; break; case 8: $word = 'N8'; break; case 9: $word = 'N9'; break; case -1: $word = 'N0'; break; } if($cow == -1){ $cow = 0; }else if($cow == 0){ $cow = 10; } $result['word'] = $word; $result['cow'] = $cow; $result['max'] = $max; return $result; } /** * TODO NN比较两张牌大小 * @param int $card1 卡牌 * @param int $card2 卡牌 * @return int; */ public static function compareCard(int $card1, int $card2): int { $card1Num = CardPosition::interchangeCard($card1); $card2Num = CardPosition::interchangeCard($card2); $card1Color = CardPosition::interchangeColor($card1); $card2Color = CardPosition::interchangeColor($card2); if($card1Num > $card2Num){ return 1; }elseif($card1Num < $card2Num){ return 0; }else{ if($card1Color > $card2Color){ return 0; }else{ return 1; } } } /** * TODO NN识别固定位置 * @param int $position 位置 * @return string; */ public static function sbStaticCardPosition(int $position): string { $result = ''; switch($position) { case 1: $result = "player_1_card_1"; break; case 2: $result = "player_1_card_2"; break; case 3: $result = "player_1_card_3"; break; case 4: $result = "player_1_card_4"; break; case 5: $result = "player_1_card_5"; break; case 6: $result = "player_2_card_1"; break; case 7: $result = "player_2_card_2"; break; case 8: $result = "player_2_card_3"; break; case 9: $result = "player_2_card_4"; break; case 10: $result = "player_2_card_5"; break; case 11: $result = "player_3_card_1"; break; case 12: $result = "player_3_card_2"; break; case 13: $result = "player_3_card_3"; break; case 14: $result = "player_3_card_4"; break; case 15: $result = "player_3_card_5"; break; case 16: $result = "banker_card_1"; break; case 17: $result = "banker_card_2"; break; case 18: $result = "banker_card_3"; break; case 19: $result = "banker_card_4"; break; case 20: $result = "banker_card_5"; break; } return $result; } }