扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。
我做的这个是由(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;
}
}
}
List hei = 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(List hei)
{
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 List PaiXuZuPin(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;
}
PS:代码仅供参考,优化自行处理
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接