撲克牌游戲,總是能用到很多的手牌排序,總結了幾種方式供參考,順便記錄一下方便以后使用。
我做的這個是由(1-13:黑桃A-K || 14 - 26:紅桃 || 27 - 39:梅花 || 39 - 52 : 方片 || 53.54:小王.大王)表示的一副撲克牌,這樣對數(shù)組除以13等于撲克花色(如:25/13 = 2 是紅桃),對數(shù)組值取模等于撲克點數(shù)(如:25%13 = 12 是Q),這樣25就表示了紅桃Q的撲克牌。
當處理特殊規(guī)則的時候單獨寫一個List,在組拼就可以了。
比如說:賴子斗地主的時候,當選出賴子牌之后,就需要對手牌再次排序,那么new List來存一下賴子牌,選定賴子牌之后,存到list中,再次調(diào)用排序,組拼就可以實現(xiàn),你想要的手牌排序的數(shù)組,那么在通過某種形式讓他顯示出來就可以了。
上代碼 :
//參數(shù):要排序的牌值數(shù)組 & 數(shù)組長度 public int[] PaiXu(int[] card, int number = 0) { //Debug.Log(" ... 對手牌 進行 牌值 花色 的排序 ... ... "); if (number == 0){ number = card.Length; } if (card.Length == 0){ return card; } // ========== 根據(jù)牌值進行排序 =============== int temp = 0; for (int i = 0; i < card.Length; i++) //冒泡排序... 從大到小 { for (int j = 0; j < card.Length - 1 - i; j++) { if (card[j] < card[j + 1]) { temp = card[j]; card[j] = card[j + 1]; card[j + 1] = temp; } } } List<int> hei = new List<int>(); List<int> hong = new List<int>(); List<int> mei = new List<int>(); List<int> fang = new List<int>(); List<int> wang = new List<int>(); for (int i = 0; i < card.Length; i++) { #region ======= 根據(jù)花色分組 ..大小王 單獨一組 ...后續(xù)對花色中的 A 單獨處理 ========= switch (sendFlower(card[i])) { case 3: //黑桃 hei.Add(card[i]); break; case 2: //紅桃 hong.Add(card[i]); break; case 1: //梅花 mei.Add(card[i]); break; case 0: //方片 fang.Add(card[i]); break; case 4: //小王 case 5: //大王 wang.Add(card[i]); break; } #endregion } QuA(hei); // 對A 的單獨處理 QuA(hong); QuA(mei); QuA(fang); #region ========== 合并 排序后的牌組======== List<int> cardlist = new List<int>(); for (int i = 0; i < wang.Count; i++) //王 { cardlist.Add(wang[i]); } // ==========合并 組拼 ============ List<int> cardtemp = new List<int>(); cardtemp = PaiXuZuPin(hei, hong, mei, fang); for (int i = 0; i < cardtemp.Count; i++) { cardlist.Add(cardtemp[i]); } int[] cards = new int[cardlist.Count]; for (int i = 0; i < cardlist.Count; i++) { cards[i] = cardlist[i]; } #endregion return cards; } /// <summary> /// 取A -- 把每個花色牌中的A,放到前面(A.K.Q.J...) /// </summary> /// <param name="hei">花色牌</param> void QuA(List<int> hei) { if (hei.Count == 0) return; List<int> cardlist = new List<int>(); for (int i = 0; i < hei.Count; i++) // 將牌添加到新列表 { cardlist.Add(hei[i]); } if (hei.Count > 2) { if (hei[hei.Count - 2] % 13 == 1) //如果有兩個A (對兩幅牌的處理) { cardlist.Insert(0, hei[hei.Count - 2]); cardlist.Insert(0, hei[hei.Count - 1]); for (int i = 0; i < hei.Count; i++) { hei[i] = cardlist[i]; } return; } } if (hei[hei.Count - 1] % 13 == 1) //如果有一個A { cardlist.Insert(0, hei[hei.Count - 1]); } for (int i = 0; i < hei.Count; i++) { hei[i] = cardlist[i]; } } /// <summary> /// 根據(jù)傳入牌組 的順序 進行組拼 /// </summary> public List<int> PaiXuZuPin(List<int> one, List<int> two, List<int> three, List<int> four) { List<int> cardlist = new List<int>(); for (int i = 0; i < one.Count; i++) { cardlist.Add(one[i]); } for (int i = 0; i < two.Count; i++) { cardlist.Add(two[i]); } for (int i = 0; i < three.Count; i++) { cardlist.Add(three[i]); } for (int i = 0; i < four.Count; i++) { cardlist.Add(four[i]); } return cardlist; } /// <summary> /// 根據(jù)牌值取花色 5:大王 | 4:小王 | 3:黑桃 | 2:紅桃 | 1:梅花 | 0:方片 /// </summary> /// <param name="card"></param> public int sendFlower(int card) { if (card >= 1 && card <= 13) { return 3; }else if (card >= 14 && card <= 26) { return 2; } else if (card >= 27 && card <= 39) { return 1; } else if (card >= 40 && card <= 52) { return 0; } else if (card == 53) { return 4; } return 5; }
PS:代碼僅供參考,優(yōu)化自行處理
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網(wǎng)的支持。
新聞熱點
疑難解答