1. 程式人生 > >unity中使用C#語言判斷鬥地主出牌牌型

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