unity中使用C#語言判斷鬥地主出牌牌型
阿新 • • 發佈:2018-11-30
首先定義一下要出的的牌的型別
/// <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; }