Unity开发案例:斗地主游戏中获取扑克牌类型

发表于2018-04-22
评论0 2.8k浏览
1.以这个斗地主游戏开发案例给大家讲解如何获取扑克牌类型,在写游戏算法之前,要思考有什么功能要实现,功能于功能之间有没有关联。带着这些问题来写代码会很有意思。

既然要获取扑克牌的类型, 我们可以在程序中用枚举来定义:
    public enum Rule
    {
        不出,一张,对子,三不带,炸弹,顺子,连对,
        飞机不带,三飞机不带,四飞机不带,五飞机不带,
        三带一,三带二,四带二,飞机带二,飞机带二对,
        三飞机带三,四飞机带四,三飞机带三对,四带二对,
        王炸,四飞机带四对,五飞机带五,六飞机不带
    }
    // unity3d5.3版本支持枚举是中文,不过不建议这样做,这里只是让大家看懂具体类型

定义完类型,就要去判读扑克牌属于什么类型
        // 从大到小排序
        public void Format(int [] args)
        {
            for (int i = 0; i < args.Length; i++)
            {
                for (int j = 0; j < args.Length; j++)
                {
                    if (args[i]<args[j])
                    {
                        int tmp = args[i];
                        args[i] = args[j];
                        args[j] = tmp;
                    }
                }
            }
        }
        public int mPokerType;
        //判断类型
        public bool Judge(int [] args)
        {
            Format(args);
            bool b = false;
            switch (args.Length)
            {
                case 1: b = true; mPokerType = (int)Rule.一张; break;
                case 2: b = ErZhang(args); break;
                case 3: b = SanZhang(args); break;
                case 4: b = SiZhang(args); break; 
                case 5: b = WuZhang(args);break ;
                case 6: b = LiuZhang(args);break ;
                case 7: b = QiZhang(args);break ;
                case 8: b = BaZhang(args);break ;
                case 9: b = JiuZhang(args);break ;
                case 10: b = ShiZhang(args);break ;
                case 11: b = ShiYiZhang(args);break ;
                case 12: b = ShiErZhang(args);break ;
                case 14: b = ShiSiZhang(args);break ;
                case 15: b = ShiWuZhang(args);break ;
                case 16: b = ShiLiuZhang(args);break ;
                case 18: b = ShiBaZhang(args);break ;
                case 20: b = ErZhang(args);break ;
                default:
                    break;
            }
            return b;
        }
        // 这里面的函数命名不规范,请谅解
上面的函数是判断所有扑克类型 在这里我找几个典型的类型写一下。

四张牌 :炸弹 或者 三带一
        public bool SiZhang(int[] args)
        {
            if (ZhaDan(args) || San_1(args))
            {
                return true;
            }
            return false;
        }
        public bool ZhaDan(int [] args)
        {
            if (args[0]== args[1] && args[1]== args[2] && args[2] == args[3])
            {
                mPokerType = (int)Rule.炸弹;
                return true;
            }
            return false;
        }
        public bool San_1(int [] args)
        {
            ArrayList mList = BreakUpArgs(args,3,false);
            foreach (int[] item in mList)
            {
                mPokerType = (int)Rule.三带一;
                return true;
            }
            return false ;
        }
        // 判断三张或四张带牌的方法
        public ArrayList BreakUpArgs(int [] args,int lenght,bool daiduizi)
        {
            ArrayList mList = new ArrayList();
            int [] a = new  int[lenght];
            int count = 0;
            if (daiduizi == false )
            {
                count = args.Length - lenght + 1;
                for (int i = 0; i < count; i++)
                {
                    int k = 0;
                    for (int j = 0; j < args.Length; j++)
                    {
                        a[k] = args[j];
                        k++;
                        if (k==a.Length)
                        {
                            break;
                        }
                    }
                    mList.Add(a.Clone());
                }
            }
            else
            {
                count = (args.Length - lenght) / 2 + 1;
                ArrayList mList1 = new ArrayList();
                ArrayList mList2 = new ArrayList();
                int [] b = new int[args.Length-lenght];
                for (int i = 0; i < count *2; i+=2)
                {
                    int ii = 0; int j = 0; int k = 0;
                    for (ii = 0; ii < i; ii++)
                    {
                        b[ii] = args[ii];
                    }
                    for ( j = i; j < args.Length; j++)
                    {
                        a[k] = args[j];
                        k++;
                        if (k==a.Length)
                        {
                            break;
                        }
                    }
                    for (int jj = j+1; jj < args.Length; jj++)
                    {
                        b[ii + k] = args[jj];
                        k++;
                    }
                    mList1.Add(a.Clone());
                    mList2.Add(b.Clone());
                }
                mList.Add(a.Clone());
                mList.Add(b.Clone());
            }
            return mList;
        }

九张牌: 顺子 或者 飞机
 public bool JiuZhang(int [] args)
        {
            if (ShunZi(args) || Fly9(args))
            {
                return true;
            }
             return false ;
        }
        // 飞机 九张牌
        public bool Fly9(int []  args)
        {
            if (Fly(args))
            {
                mPokerType = (int)Rule.三飞机不带;
                return true;
            }
            return false;
        }
        // 顺子
        public bool ShunZi(int [] args)
        {
            if (args[0]>14)
            {
                return false ;
            }
            for (int i = 0; i < args.Length-1; i++)
            {
            if (args[i] - 1 != args[i+1])
            {
                return false ;
            }
            }
            mPokerType = (int)Rule.顺子;
            return true;
        }
        // 飞机
         public bool Fly(int [] args)
        {
            if (args[0] >14) return false; 
            int [] a = new int[3];
            int k =0 ;
            for (int i = 0; i < args.Length/a.Length; i++)
            {
                for (int j = 0; j < a.Length; j++)
                {
                    a[j] = args[k];
                    k++;
                }
                if (SanZhang(a) == false ) return false ;
                if (k<args.Length)
                {
                    if (args[k-1]-1!=args[k])
                        return false ;
                }
            }
            return true ;
        }
        // 三张不带
        public bool SanZhang(int[] args) 
        {
            if (args[0] == args[1] && args[1]==args[2])
            {
                mPokerType = (int)Rule.三不带; 
                return true;
            }
            return false; 
        }
举一反三 。
来自:https://blog.csdn.net/microsoftmsdnnet/article/details/51013174

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引