扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。
创新互联专业为企业提供察哈尔右翼中旗网站建设、察哈尔右翼中旗做网站、察哈尔右翼中旗网站设计、察哈尔右翼中旗网站制作等企业网站建设、网页设计与制作、察哈尔右翼中旗企业网站模板建站服务,十余年察哈尔右翼中旗做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。我做的这个是由(1-13:黑桃A-K || 14 - 26:红桃 || 27 - 39:梅花 || 39 - 52 : 方片 || 53.54:小王.大王)表示的一副扑克牌,这样对数组除以13等于扑克花色(如:25/13 = 2 是红桃),对数组值取模等于扑克点数(如:25%13 = 12 是Q),这样25就表示了红桃Q的扑克牌。
当处理特殊规则的时候单独写一个List,在组拼就可以了。
比如说:赖子斗地主的时候,当选出赖子牌之后,就需要对手牌再次排序,那么new List来存一下赖子牌,选定赖子牌之后,存到list中,再次调用排序,组拼就可以实现,你想要的手牌排序的数组,那么在通过某种形式让他显示出来就可以了。
上代码 :
//参数:要排序的牌值数组 & 数组长度 public int[] PaiXu(int[] card, int number = 0) { //Debug.Log(" ... 对手牌 进行 牌值 花色 的排序 ... ... "); if (number == 0){ number = card.Length; } if (card.Length == 0){ return card; } // ========== 根据牌值进行排序 =============== 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; } } } Listhei = new List (); List hong = new List (); List mei = new List (); List fang = new List (); List wang = new List (); for (int i = 0; i < card.Length; i++) { #region ======= 根据花色分组 ..大小王 单独一组 ...后续对花色中的 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 cardlist = new List (); for (int i = 0; i < wang.Count; i++) //王 { cardlist.Add(wang[i]); } // ==========合并 组拼 ============ List cardtemp = new List (); 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; } /// /// 取A -- 把每个花色牌中的A,放到前面(A.K.Q.J...) /// /// 花色牌 void QuA(Listhei) { if (hei.Count == 0) return; List cardlist = new List (); 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]; } } /// /// 根据传入牌组 的顺序 进行组拼 /// public ListPaiXuZuPin(List one, List two, List three, List four) { List cardlist = new List (); 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; } /// /// 根据牌值取花色 5:大王 | 4:小王 | 3:黑桃 | 2:红桃 | 1:梅花 | 0:方片 /// /// 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; }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。