unity中使用C#语言判断斗地主出牌牌型

首先定义一下要出的的牌的类型

/// <summary>
/// 出牌的类型   过1,单张1,对子2,三张3,三带单4,三带对5,单顺6,双顺7,飞机8,飞机带单9,飞机带双10,四带两单11,四带对12,炸弹13,火箭14
/// </summary>
public enum SHOW_CARDS_TYPE
{
    /// <summary>
    /// 过,不出牌
    /// </summary>
    DDZ_PASS = 0,
    /// <summary>
    /// 单张
    /// </summary>
    SINGLE = 1,
    /// <summary>
    /// 对子
    /// </summary>
    TWIN = 2,
    /// <summary>
    /// 三张
    /// </summary>
    TRIPLE = 3,
    /// <summary>
    /// 三带单
    /// </summary>
    TRIPLE_WITH_SINGLE = 4,
    /// <summary>
    /// 三带对
    /// </summary>
    TRIPLE_WITH_TWIN = 5,
    /// <summary>
    /// 单顺
    /// </summary>
    STRAIGHT_SINGLE = 6,
    /// <summary>
    /// 双顺
    /// </summary>
    STRAIGHT_TWIN = 7,
    /// <summary>
    /// 飞机
    /// </summary>
    PLANE_PURE = 8,
    /// <summary>
    /// 飞机带单
    /// </summary>
    PLANE_WITH_SINGLE = 9,
    /// <summary>
    /// 飞机带双
    /// </summary>
    PLANE_WITH_TWIN = 10,
    /// <summary>
    /// 四带两单
    /// </summary>
    FOUR_WITH_SINGLE = 11,
    /// <summary>
    /// 四带对
    /// </summary>
    FOUR_WITH_TWIN = 12,
    /// <summary>
    /// 炸弹
    /// </summary>
    FOUR_BOMB = 13,
    /// <summary>
    /// 火箭
    /// </summary>
    KING_BOMB = 14,
}

然后写判断牌型的代码
这里的cardsList是要出的牌的链表

 public static SHOW_CARDS_TYPE  DcCardsTypeToList(List<CardData> cardsList )

通过链表进行判断,返回判断类型,不能出就返回 (过)得牌型

 public static SHOW_CARDS_TYPE  DcCardsTypeToList(List<CardData> cardsList )
    {
        //如果牌数为单
        if (cardsList.Count==1)
        {
            //返回单排类型
            return SHOW_CARDS_TYPE.SINGLE;
        }
        //如果排数为双
        if (cardsList.Count==2)
        {
            //如果是对子
            if (cardsList[0].size==cardsList[1].size)
            {
                //返回对子类型
                return SHOW_CARDS_TYPE.TWIN;
            }
            if (cardsList[0].cardsType==4 && cardsList[1].cardsType==5  || cardsList[0].cardsType == 5 && cardsList[1].cardsType == 4)
            {
                //返回王炸(火箭);
                return SHOW_CARDS_TYPE.KING_BOMB;
            }
        }
        //如果排数是三张
        if (cardsList.Count==3)
        {
            if (cardsList[0].size==cardsList[1].size && cardsList[1].size==cardsList[2].size)
            {
                return SHOW_CARDS_TYPE.TRIPLE;
            }
        }
        //如果牌数是四张
        if (cardsList.Count==4)
        {
            //创建数组,接收各个牌的值
            int[] cardsSize = new int[4];
            int num=0;//监听数组里数字的重复字数
            cardsSize[0] = cardsList[0].size;
            cardsSize[1] = cardsList[1].size;
            cardsSize[2] = cardsList[2].size;
            cardsSize[3] = cardsList[3].size;
            foreach (var s in cardsSize.GroupBy(c => c))
            {
                if (s.Count() != 1)
                {
                    num += s.Count();
                }

            }
            //首先判断是不是炸弹;
            if ((cardsSize[0]==cardsSize[1]) && (cardsSize[1]==cardsSize[2]) && (cardsSize[3] == cardsSize[0]))
            {
                return SHOW_CARDS_TYPE.FOUR_BOMB;
            }
            //有三个数字重复
            else if (num==3)
            {
                return SHOW_CARDS_TYPE.TRIPLE_WITH_SINGLE;
            }
        }
        //如果牌数是5张
        if (cardsList.Count==5)
        {
            int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值
            int num = 0;//监听重复的牌的次数
            for (int i = 0; i < cardsList.Count; i++)
            {
                //添加到数组中
                sizeArray[i] = cardsList[i].size;
            }

            //判断是不是三带对
            //找出数组中重复的元素次数
            foreach (var s in sizeArray.GroupBy(c=>c))
            {
                if (s.Count()!=1)
                {
                    num += s.Count();
                }
            } 
            if (num==5)
            {
                return SHOW_CARDS_TYPE.TRIPLE_WITH_TWIN; //三带对
            }
            //判断是不是顺子
            Array.Sort(sizeArray);//让数组里的数据从小到大排序
            for (int i = 0; i < sizeArray.Length-1; i++)
            {
                if (sizeArray[i]!=sizeArray[i+1]-1)
                {
                    return SHOW_CARDS_TYPE.DDZ_PASS;
                }
            }
            return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;
        }
        //如果牌数等于6张
        if (cardsList.Count==6)
        {
            int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值
            int num = 0;//监听三张一样的牌的次数
            int oneTime = 0;//监听单排出现次数
            int fourTime = 0;//监听是否有4张一样的数字
            int twoTime = 0;//监听出现过两个相同的数字的次数
            for (int i = 0; i < cardsList.Count; i++)
            {
                //添加到数组中
                sizeArray[i] = cardsList[i].size;
            }

            //判断是不是飞机
            //找出数组中重复有几个牌重复出现
            foreach (var s in sizeArray.GroupBy(c => c))
            {
                if (s.Count()==1)
                {
                    oneTime += 1;
                }
                if (s.Count()==2)
                {
                    twoTime += 1;
                }
                if (s.Count() ==3)
                {
                    num += 1;
                }
                if (s.Count()==4)
                {
                    fourTime += 1;
                }
            }
            Array.Sort(sizeArray);//给数组排序
            if (num == 2 && sizeArray[2] == sizeArray[3] - 1)
            {
                return SHOW_CARDS_TYPE.PLANE_PURE;
            }
            if (fourTime==1)
            {
                if (twoTime==1)
                {
                    return SHOW_CARDS_TYPE.FOUR_WITH_TWIN;
                }
                else
                {
                    return SHOW_CARDS_TYPE.FOUR_WITH_SINGLE;
                }
            
            }
            if (twoTime==3)
            {
                //判断是不是双顺
                for (int i = 0; i < sizeArray.Length-2; i++)
                {
                    if (sizeArray[i] != sizeArray[i + 2] - 1)
                    {
                        return SHOW_CARDS_TYPE.DDZ_PASS;
                    }
                }
                return SHOW_CARDS_TYPE.STRAIGHT_TWIN;
            }
            if (oneTime==cardsList.Count)
            {
                //判断是不是单顺
                for (int i = 0; i < sizeArray.Length-1; i++)
                {
                    if (sizeArray[i] != sizeArray[i + 1] - 1)
                    {
                        return SHOW_CARDS_TYPE.DDZ_PASS;
                    }
                }
                return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;
            }
            
        }
        //如果牌数大于6张
        if (cardsList.Count>6)
        {
            int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值
            int  threeTime = 0;//监三张一样的牌出现的次数
            int oneTime = 0;//监听单张出现次数
            int twoTime = 0;//监听出现过两个相同的牌的次数
            for (int i = 0; i < cardsList.Count; i++)
            {
                //添加到数组中
                sizeArray[i] = cardsList[i].size;
            }

            //判断是不是飞机
            //找出数组中重复有几个数重复三次出现
            foreach (var s in sizeArray.GroupBy(c => c))
            {
                if (s.Count()==1)
                {
                    oneTime += 1;
                }
                if (s.Count() == 2)
                {
                    twoTime += 1;
                }
                if (s.Count() == 3)
                {
                    threeTime += 1;
                }
            }
            Array.Sort(sizeArray);//从小到大排序
            if (oneTime == cardsList.Count)
            {
                //判断是不是单顺
                for (int i = 0; i < sizeArray.Length-1; i++)
                {
                    if (sizeArray[i] != sizeArray[i + 1] - 1)
                    {
                        return SHOW_CARDS_TYPE.DDZ_PASS;
                    }
                }
                return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;
            }
            if (cardsList.Count%2==0)//链表长度是偶数
            {
                if (twoTime >=3)
                {
                    //判断是不是双顺
                    for (int i = 0; i < sizeArray.Length-2; i++)
                    {
                        if (sizeArray[i] != sizeArray[i + 2] - 1)
                        {
                            return SHOW_CARDS_TYPE.DDZ_PASS;
                        }
                    }
                    return SHOW_CARDS_TYPE.STRAIGHT_TWIN;
                }
            }
            if (threeTime>1)//判断是不是飞机
            {
                if (threeTime==twoTime)//飞机带双
                {
                    return SHOW_CARDS_TYPE.PLANE_WITH_TWIN;
                }
                if (threeTime==oneTime)//飞机带单
                {
                    return SHOW_CARDS_TYPE.PLANE_WITH_SINGLE;
                }
            }
            
        }
        return SHOW_CARDS_TYPE.DDZ_PASS;  
    }

猜你喜欢

转载自blog.csdn.net/qq_42661974/article/details/84531618