using UnityEngine;
using System.Collections;
using System.Collections.Generic;

//枚举出牌规则
#region 枚举类型,所有符合规则的牌型
public enum Guize
{
    不出,一张,对子,三不带,炸弹,顺子,连对,飞机不带,三飞机不带,四飞机不带,五飞机不带,三带一,三带二,四带二,飞机带二,飞机带二对,三飞机带三,四飞机带四,三飞机带三对,四带二对,天炸,四飞机带四对,五飞机带五,六飞机不带
}
#endregion

public class Chuipai : MonoBehaviour
{
    #region 出牌的类型,如单张,对子等(属性)
    private int paiType = 0;
    public int PaiType
    {
        get { return paiType; }
        set { paiType = value; }
    }

#endregion

#region 外部调用方法,判断出牌是否符合规则
    public bool isRight(ArrayList list)
    {
        int[] args = new int[list.Count];
        for (int i = 0; i < args.Length; i++)
        {
            args[i] = (int)list[i];
        }
        return judge(args);
    }
    #endregion

public bool isRight(int[] args)
    {
        return judge(args);
    }
    #region 开始判断

private bool judge(int[] args)
    {
        format(args);
        bool bl = false;
        switch (args.Length)
        {
             case 1: bl = true; paiType = (int)Guize.一张; break;
                case 2: bl = erzhang(args); break;
                case 3: bl = sanzhang(args); break;
                case 4: bl = sizhang(args); break;
                case 5: bl = wuzhang(args); break;
                case 6: bl = liuzhang(args); break;
                case 7: bl = qizhang(args); break;
                case 8: bl = bazhang(args); break;
                case 9: bl = jiuzhang(args); break;
                case 10: bl = shizhang(args); break;
                case 11: bl = shiyizhang(args); break;
                case 12: bl = shierzhang(args); break;
                case 14: bl = shisizhang(args); break;
                case 15: bl = shiwuzhang(args); break;
                case 16: bl = shiliuzhang(args); break;
                case 18: bl = shibazhang(args); break;
                case 20: bl = ershizhang(args); break;
        }
        return bl;
    }
    #endregion

#region 辅助方法(也为主要算法)
    #region 排序(从小到大)
    public void format(int[] args)
    {
        for (int i = 0; i < args.Length; i++)
        {
            for (int j = i; j < args.Length; j++)
            {
                if (args[i] < args[j])
                {
                    int temp = args[i];
                    args[i] = args[j];
                    args[j] = temp;
                }
            }
        }
    }
    #endregion
    #region 排序(从小到大)
    public void minToBig(int[] args)
    {
        for(int i =0;i<args.Length;i++)
            for(int j = i;j<args.Length;j++)
                if (args[i] > args[j])
                {
                    int temp = args[i];
                    args[i] = args[j];
                    args[j] = temp;
                }
    }
    #endregion
    #region 判断偶数数组里是否全为对子
    private bool isAllDuiZi(int[] args)
    {
        for (int i = 0; i < args.Length; i += 2)
        {
            if(args[i]!=args[i+1])return false;
        }
        return true;
    }
    #endregion
    #region 飞机不带的通用算法(判断所有的飞机不带)
    private 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;
    }
    #endregion
    #region 三飞机以上带牌,如果中间包含炸弹,则移动其中一张到数组的最后面
    private void changeArgs(int[] args)
    {
        ArrayList list = breakUpArgs(args, 4, false);
        List<int> list1 = new List<int>();
        foreach (int[] a in list)
        {
            if (zhadan(a))
            {
                for (int i = 0; i < args.Length; i++)
                {
                    if (args[i] == a[0])
                    {
                        list1.Add(i); i += 4;
                    }
                }
            }
        }
        for (int i = 0; i < list1.Count; i++)
        {
            for (int j = list1[i]; j < args.Length - 1; j++)
            {
                args[j] = args[j + 1];
            }
            args[args.Length - 1] = args[list1[i]];
        }

}
    #endregion
    #region 判断三张或四张带牌的一部分通用算法(将牌分解成多个需要的数组)
        private ArrayList breakUpArgs(int[] args, int len, bool daiDui)
        {
            ArrayList list = new ArrayList();
            int[] a = new int[len];
            int count = 0;
            if (daiDui == false)
            {
                count = args.Length - len + 1;
                for (int i = 0; i < count; i++)
                {
                    int k = 0;
                    for (int j = i; j < args.Length; j++)
                    {
                        a[k] = args[j]; k++;
                        if (k == a.Length) break;
                    }
                    list.Add(a.Clone());
                }
            }
            else
            {
                count = (args.Length - len) / 2 + 1;
                ArrayList list1 = new ArrayList();
                ArrayList list2 = new ArrayList();
                int[] b = new int[args.Length - len];
                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;
                    }
                    k = 0;
                    for (int jj = j + 1; jj < args.Length; jj++)
                    {
                        b[ii + k] = args[jj]; k++;
                    }
                    list1.Add(a.Clone());
                    list2.Add(b.Clone());
                }
                list.Add(list1);
                list.Add(list2);
            }
            return list;
        }
        #endregion
        #endregion

#region 所有的出牌数量
        #region 两张牌
        private bool erzhang(int[] args)
        {
            if (duizi(args) || tianzha(args)) return true;
            return false;
        }
        #endregion
        #region 四张牌
        private bool sizhang(int[] args)
        {
            if (zhadan(args) || san_1(args)) return true;
            return false;
        }
        #endregion
        #region 五张牌
        private bool wuzhang(int[] args)
        {
            if (san_2(args) || shunzi(args)) return true;
            return false;
        }
        #endregion
        #region 六张牌
        private bool liuzhang(int[] args)
        {
            if (shunzi(args) || liandui(args) || fly6(args) || si_2(args)) return true;
            return false;
        }
        #endregion
        #region 七张牌
        private bool qizhang(int[] args)
        {
            if (shunzi(args)) return true;
            return false;
        }
        #endregion
        #region 八张牌
        private bool bazhang(int[] args)
        {
            if (fly6_2(args) || shunzi(args) || liandui(args) || si_4(args)) return true;
            return false;
        }
        #endregion
        #region 九张牌
        private bool jiuzhang(int[] args)
        {
            if (shunzi(args) || fly9(args)) return true;
            return false;
        }
        #endregion
        #region 十张牌
        private bool shizhang(int[] args)
        {
            if (fly6_4(args) || shunzi(args) || liandui(args)) return true;
            return false;
        }
        #endregion
        #region 十一张牌
        private bool shiyizhang(int[] args)
        {
            if (shunzi(args)) return true;
            return false;
        }
        #endregion
        #region 十二张牌
        private bool shierzhang(int[] args)
        {
            if (shunzi(args) || liandui(args) || fly12(args) || fly9_3(args)) return true;
            return false;
        }
        #endregion
        #region 十四张牌
        private bool shisizhang(int[] args)
        {
            if (liandui(args)) return true;
            return false;
        }
        #endregion
        #region 十五张牌
        private bool shiwuzhang(int[] args)
        {
            if (fly9_6(args) || fly15(args)) return true;
            return false;
        }
        #endregion
        #region 十六张牌
        private bool shiliuzhang(int[] args)
        {
            if (fly12_4(args) || liandui(args)) return true;
            return false;
        }
        #endregion
        #region 十八张牌
        private bool shibazhang(int[] args)
        {
            if (liandui(args) || fly18(args)) return true;
            return false;
        }
        #endregion
        #region 二十张牌
        private bool ershizhang(int[] args)
        {
            if (fly15_5(args) || fly12_8(args) || liandui(args)) return true;
            return false;
        }
        #endregion
        #endregion

#region 所有符合规则的出牌
        #region 对子(2张)
        private bool duizi(int[] args)
        {
            if (args[0] == args[1])
            {
                paiType = (int)Guize.对子;return true;
            }
            return false;
        }
        #endregion
        #region 天炸(2)
        private bool tianzha(int[] args)
        {
            if (args[0] == 17 && args[1] == 16)
            {
                paiType = (int)Guize.天炸;return true;
            }
            return false;
        }
        #endregion
        #region 三张(3)
        private bool sanzhang(int[] args)
        {
            if (args[0] == args[1] && args[1] == args[2])
            {
                paiType = (int)Guize.三不带;return true;
            }
            return false;
        }
        #endregion
        #region 三带一(4)
        private bool san_1(int[] args)
        {
            ArrayList list = breakUpArgs(args, 3, false);
            foreach (int[] a in list)
            {
                if (sanzhang(a))
                {
                    paiType = (int)Guize.三带一;return true;
                }
            }
            return false;
        }
        #endregion
        #region 三带二(5)
        private bool san_2(int[] args)
        {
            ArrayList list = breakUpArgs(args, 3, true);
            for(int i=0;i<((ArrayList)list[0]).Count;i++)
            {
                int[] a=(int[])((ArrayList)list[0])[i];
                int[] b=(int[])((ArrayList)list[1])[i];
                if (sanzhang(a) && isAllDuiZi(b))
                {
                    paiType = (int)Guize.三带二;return true;
                }
            }
            return false;
        }
        #endregion
        #region 炸弹(4)
        private bool zhadan(int[] args)
        {
            if (args[0] == args[1] && args[1] == args[2] && args[2] == args[3])
            {
                paiType = (int)Guize.炸弹;return true;
            }
            return false;
        }
        #endregion
        #region 四带二(6)
        private bool si_2(int[] args)
        {
            ArrayList list = breakUpArgs(args, 4, false);
            foreach (int[] a in list)
            {
                if (zhadan(a))
                {
                    paiType = (int)Guize.四带二;return true;
                }
            }
            return false;
        }
        #endregion
        #region 四带两对(8)
        private bool si_4(int[] args)
        {
            ArrayList list = breakUpArgs(args, 4, true);
            for (int i = 0; i < ((ArrayList)list[0]).Count; i++)
            {
                int[] a = (int[])((ArrayList)list[0])[i];
                int[] b = (int[])((ArrayList)list[1])[i];
                if (zhadan(a) && isAllDuiZi(b))
                {
                    paiType = (int)Guize.四带二对;return true;
                }
            }
            return false;
        }
        #endregion
        #region 顺子(5--12)
        private 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;
            }
            paiType = (int)Guize.顺子;
            return true;
        }
        #endregion
        #region 连对(6--20)
        private bool liandui(int[] args)
        {
            if (args[0] > 14) return false;
            if (isAllDuiZi(args) == false) return false;
            for (int i = 1; i < args.Length-1; i+=2)
            {
                if (args[i] - 1 != args[i + 1]) return false;
            }
            paiType = (int)Guize.连对;
            return true;
        }
        #endregion
        #region 飞机不带(6)
        private bool fly6(int[] args)
        {
            if(fly(args))
            {
                paiType = (int)Guize.飞机不带; return true;
            }
            return false;
        }
        #endregion
        #region 飞机带2(8)
        private bool fly6_2(int[] args)
        {
            ArrayList list = breakUpArgs(args, 6, false);
            foreach (int[] a in list)
            {
                if (fly6(a))
                {
                    paiType = (int)Guize.飞机带二; return true;
                }
            }
            return false;
        }
        #endregion
        #region 飞机带2对(10)
        private bool fly6_4(int[] args)
        {
            ArrayList list = breakUpArgs(args, 6, true);
            for (int i = 0; i < ((ArrayList)list[0]).Count; i++)
            {
                int[] a = (int[])((ArrayList)list[0])[i];
                int[] b = (int[])((ArrayList)list[1])[i];
                if (fly6(a) && isAllDuiZi(b))
                {
                    paiType = (int)Guize.飞机带二对; return true;
                }
            }
            return false;
        }
        #endregion
        #region 3飞机不带(9)
        private bool fly9(int[] args)
        {
            if (fly(args))
            {
                paiType = (int)Guize.三飞机不带; return true;
            }
            return false;
        }
        #endregion
        #region 3飞机带3(12)
        private bool fly9_3(int[] args)
        {
            changeArgs(args);
            ArrayList list = breakUpArgs(args, 9, false);
            foreach (int[] a in list)
            {
                if (fly9(a))
                {
                    paiType = (int)Guize.三飞机带三; return true;
                }
            }
            return false;
        }
        #endregion
        #region 3飞机带3对(15)
        private bool fly9_6(int[] args)
        {
            ArrayList list = breakUpArgs(args, 9, true);
            for (int i = 0; i < ((ArrayList)list[0]).Count; i++)
            {
                int[] a = (int[])((ArrayList)list[0])[i];
                int[] b = (int[])((ArrayList)list[1])[i];
                if (fly9(a) && isAllDuiZi(b))
                {
                    paiType = (int)Guize.三飞机带三对; return true;
                }
            }
            return false;
        }
        #endregion
        #region 4飞机不带(12)
        private bool fly12(int[] args)
        {
            if (fly(args))
            {
                paiType = (int)Guize.四飞机不带; return true;
            }
            return false;
        }
        #endregion
        #region 4飞机带4(16)
        private bool fly12_4(int[] args)
        {
            changeArgs(args);
            ArrayList list = breakUpArgs(args, 12, false);
            foreach (int[] a in list)
            {
                if (fly12(a))
                {
                    paiType = (int)Guize.四飞机带四; return true;
                }
            }
            return false;
        }
        #endregion
        #region 4飞机带4对(20)
        private bool fly12_8(int[] args)
        {
            ArrayList list = breakUpArgs(args, 12, true);
            for (int i = 0; i < ((ArrayList)list[0]).Count; i++)
            {
                int[] a = (int[])((ArrayList)list[0])[i];
                int[] b = (int[])((ArrayList)list[1])[i];
                if (fly12(a) && isAllDuiZi(b))
                {
                    paiType = (int)Guize.四飞机带四对; return true;
                }
            }
            return false;
        }
        #endregion
        #region 5飞机不带(15)
        private bool fly15(int[] args)
        {
            if (fly(args))
            {
                paiType = (int)Guize.五飞机不带; return true;
            }
            return false;
        }
        #endregion
        #region 5飞机带5(20)
        private bool fly15_5(int[] args)
        {
            changeArgs(args);
            ArrayList list = breakUpArgs(args, 15, false);
            foreach (int[] a in list)
            {
                if (fly15(a))
                {
                    paiType = (int)Guize.五飞机带五; return true;
                }
            }
            return false;
        }
        #endregion
        #region 6飞机不带(18)
        private bool fly18(int[] args)
        {
            if (fly(args))
            {
                paiType = (int)Guize.六飞机不带; return true;
            }
            return false;
        }
        #endregion
        #endregion
    }

Unity3d+C#斗地主学习探究1相关推荐

  1. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  2. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  3. Unity3D for VR 学习(5): VR Gaze Input

    在VR中,最"贴切"的输入方式是眼神,即 VR Gaze Input,如盯着某UGUI UI.某GameObject,2s后触发事件–  显示ToolTip或者切换场景等. 因为这 ...

  4. Unity3D for VR 学习(7): 360°全景照片

    在VR应用中,有一个相对简单的虚拟现实体验,那就是360°全景照片浏览器, 他可以使得手机拍照的"全景"照片,  得以"恢复"当时拍照的场景全貌,  这个创意的 ...

  5. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

  6. 关于Unity3D的初步学习研究周记

    关于Unity3D的初步学习研究周记(1) 学习总结: 本次学习Unity3D其实算是对基本的复习,因为在以前自己玩过一段时间,我也有一点C#的基础,所以我是直接开始做的一些小测试,因为事件原因,两个 ...

  7. Unity3D for VR 学习(6): 再次温故知新-3D数学

    一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...

  8. ET篇:斗地主学习笔记(一)运行Demo

    一个Demo,首先要运行起来,才能让人打起学习钻研他的兴趣,So 环境准备: 下载斗地主Demo https://github.com/Viagi/LandlordsCore.git 准备2017.4 ...

  9. Unity3d之Quaternion 学习与应用

    转载:http://www.unitymanual.com/thread-42234-1-1.html 今天准备学习和研究下unity3d的四元数 Quaternion 四元数在电脑图形学中用于表示物 ...

  10. 15. R的bnlearn包中的per.node.score函数的学习探究

    目录 0. 写在前面 1.per.node.score()与score.R 1.5 per_node_score()与score.h 2. c_per_node_score与per.node.scor ...

最新文章

  1. 【蓝桥java】进制与整除之最大公约数 最小公倍数
  2. AOI光学自动检测技术 | 基本原理与设备构成
  3. poj 3468 线段树
  4. 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
  5. SpringBoot(七)整合themeleaf+bootstrap
  6. 【爬虫笔记】爬虫基础
  7. 并联系统的失效率公式推导_电容的串并联计算方法
  8. poj-2336 Ferry Loading II(dp)
  9. 15怎么自己画元件_【技术】3.1(1) 先了解清楚了,才能画一个元件-成都单片机开发...
  10. lucene索引搜索_Lucene –快速添加索引和搜索功能
  11. Deep learning 学习开篇
  12. IPS不用添加service帐号进入linux使得管理主机能访问的方法
  13. LeetCode之同构字符串
  14. 变形监测与数据处理复习总结
  15. 从0到1搭建大数据平台之数据采集篇
  16. 写一篇本科/硕士毕业论文究竟需要看多少篇文献?
  17. BIOS修改mbr为gpt的步骤
  18. 北京最新城市总体规划草案
  19. Java小白必学——冒泡排序
  20. Python实现将一张图片放到另一张图片指定的位置上并合成一张图

热门文章

  1. MD5 JS实现加密
  2. 桌面计算机地址栏在哪,我的电脑地址栏不见了怎么办 地址栏不见了如何解决...
  3. umail for linux,umail for linux邮件服务器备份与还原
  4. 上门洗车App 竟然是块大肥肉!
  5. Origin怎么画圆形而非椭圆形?
  6. 大型网站技术架构+核心原理与案例分析+李智慧
  7. win7系统备份还原软件_比ghost快200%!备份还原系统真正首选的神器
  8. 前端食堂技术周刊第 40 期:HTTP/3、WebContainers 登陆 Firefox、Remix Conf 2022、VueConf US 2022
  9. java zhs16gbk_oracle 修改字符集 为ZHS16GBK
  10. HTML5中定位网页元素重点总结