• PHP牛牛游戏算法


    <?php
    
    namespace frontendusiness;
    
    
    
    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;
        }
    } 
  • 相关阅读:
    C#的注释
    为知笔记发布到博客,css设置
    eclipse创建springboot项目的三种方法
    创建maven父项目以及子项目
    C# 快捷键(总结)
    idea 项目转 eclipse项目
    freemarker常见语法大全
    Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
    Spring mvc请求处理流程详解(一)之视图解析
    React+SpringBoot项目部署
  • 原文地址:https://www.cnblogs.com/diguaer/p/6007114.html
Copyright © 2020-2023  润新知