PHP牛牛游戲算法


<?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;
    }
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM