C#代碼實(shí)現(xiàn)撲克牌排序的幾種方式
撲克牌游戲,總是能用到很多的手牌排序,總結(jié)了幾種方式供參考,順便記錄一下方便以后使用。
我做的這個(gè)是由(1-13:黑桃A-K || 14 - 26:紅桃 || 27 - 39:梅花 || 39 - 52 : 方片 || 53.54:小王.大王)表示的一副撲克牌,這樣對(duì)數(shù)組除以13等于撲克花色(如:25/13 = 2 是紅桃),對(duì)數(shù)組值取模等于撲克點(diǎn)數(shù)(如:25%13 = 12 是Q),這樣25就表示了紅桃Q的撲克牌。
當(dāng)處理特殊規(guī)則的時(shí)候單獨(dú)寫(xiě)一個(gè)List,在組拼就可以了。
比如說(shuō):賴(lài)子斗地主的時(shí)候,當(dāng)選出賴(lài)子牌之后,就需要對(duì)手牌再次排序,那么new List來(lái)存一下賴(lài)子牌,選定賴(lài)子牌之后,存到list中,再次調(diào)用排序,組拼就可以實(shí)現(xiàn),你想要的手牌排序的數(shù)組,那么在通過(guò)某種形式讓他顯示出來(lái)就可以了。
上代碼 :
//參數(shù):要排序的牌值數(shù)組 & 數(shù)組長(zhǎng)度
public int[] PaiXu(int[] card, int number = 0)
{
//Debug.Log(" ... 對(duì)手牌 進(jìn)行 牌值 花色 的排序 ... ... ");
if (number == 0){ number = card.Length; }
if (card.Length == 0){ return card; }
// ========== 根據(jù)牌值進(jìn)行排序 ===============
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ù)花色分組 ..大小王 單獨(dú)一組 ...后續(xù)對(duì)花色中的 A 單獨(dú)處理 =========
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); // 對(duì)A 的單獨(dú)處理
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 -- 把每個(gè)花色牌中的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) //如果有兩個(gè)A (對(duì)兩幅牌的處理)
{
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) //如果有一個(gè)A
{
cardlist.Insert(0, hei[hei.Count - 1]);
}
for (int i = 0; i < hei.Count; i++)
{
hei[i] = cardlist[i];
}
}
/// <summary>
/// 根據(jù)傳入牌組 的順序 進(jìn)行組拼
/// </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)化自行處理
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
c#中DataTable轉(zhuǎn)List的2種方法示例
這篇文章主要給大家介紹了關(guān)于c#中DataTable轉(zhuǎn)List的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了C#字符數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)字符數(shù)組的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
C# Socket通信的實(shí)現(xiàn)(同時(shí)監(jiān)聽(tīng)多客戶端)
這篇文章主要介紹了C# Socket通信的實(shí)現(xiàn)(同時(shí)監(jiān)聽(tīng)多客戶端),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#/VB.NET實(shí)現(xiàn)從PPT中提取圖片的示例代碼
PPT是用于制作幻燈片(演示文稿)的應(yīng)用軟件,每張幻燈片中都可以包含文字、圖形、圖形、表格、聲音和影像等多種信息。本文主要介紹了如何實(shí)現(xiàn)從PPT中提取圖片的功能,需要的可以參考一下2023-03-03
C#使用DirectX.DirectSound播放語(yǔ)音
這篇文章主要為大家詳細(xì)介紹了C#使用DirectX.DirectSound播放語(yǔ)音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C#針對(duì)xml文件的創(chuàng)建、驗(yàn)證相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
C#字符串左不足位數(shù)時(shí)補(bǔ)充0的幾種方式
想讓一個(gè)整數(shù)或字符串轉(zhuǎn)換為字符串后,如果其長(zhǎng)度不足5位,則在左邊補(bǔ)充0直到達(dá)到5位,本文給大家介紹了C#字符串左不足位數(shù)時(shí)補(bǔ)充0的幾種方式,感興趣的朋友可以參考下2024-04-04
C#中比較常用的DateTime結(jié)構(gòu)的使用方法
這篇文章主要介紹了C#中比較常用的DateTime結(jié)構(gòu)的使用方法,需要的朋友可以參考下2015-11-11

