斗地主 - 获取扑克牌类型

来源:互联网 发布:wkwebview js交互回调 编辑:程序博客网 时间:2024/03/29 18:02

在写游戏算法之前,要思考有什么功能要实现,功能于功能之间有没有关联。

带着这些问题来写代码会很有意思。

既然要获取扑克牌的类型, 我们可以在程序中用枚举来定义。

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

举一反三 。

0 0
原创粉丝点击