來自Asp.net精英論壇: bbs.1aspx.com
這是我自己定義的一個關于牌的資料結構.
public class Poker
{
public Int32 PokerIndex;//這張牌在整副牌中的索引.
public Int32 PokerValue;//這張牌的字面大小.
public Poker()
{ }
public Poker(Int32 PokerIndex, Int32 PokerValue)
{
this.PokerIndex = PokerIndex;
this.PokerValue = PokerValue;
}
} 然後将牌分成四部分.即三個玩家在未成為地主的時候,手上的17張牌.另外是三張地主牌.
protected Poker[] pk = new Poker[ 54 ]; // 所有的牌
protected Poker[] pk1 = new Poker[ 17 ]; // 發給第一個人的牌
protected Poker[] pk2 = new Poker[ 17 ]; // 發給第二個人的牌
protected Poker[] pk3 = new Poker[ 17 ]; // 發給第三個人的牌
protected Poker[] pkTemp = new Poker[ 3 ]; // 最後三張 然後産生整副牌
// 産生牌
public void InitPk()
{
for (Int32 index = 0; index < pk.Length; index++)
{
pk[index] = new Poker();
pk[index].PokerIndex = index;
pk[index].PokerValue = index;
}
}
進行洗牌.主要是對牌進行一種随機的交換
// 洗牌
public void Random_Sequence()
{
int m, n;
Random ram = new Random();
for (int i = 0; i < 1000; i++)
{
m = ram.Next(0, 54);
n = ram.Next(0, 54);
if (m != n)
{
this.Permute(m, n);
}
}
}
// 置換牌
public void Permute(Int32 a, Int32 b)
{
Poker temp;
temp = pk[a];
pk[a] = pk[b];
pk[b] = temp;
} 然後将牌分成四份.
// 發牌
public void Deal_cards()
{
for (int i = 0; i < 17; i++)
{
pk1[i] = pk[i * 3];
pk2[i] = pk[i * 3 + 1];
pk3[i] = pk[i * 3 + 2];
}
pkTemp[0] = pk[51];
pkTemp[1] = pk[52];
pkTemp[2] = pk[53];
} 對生成的牌進行排序.
// 發牌
public void Deal_cards()
{
for (int i = 0; i < 17; i++)
{
pk1[i] = pk[i * 3];
pk2[i] = pk[i * 3 + 1];
pk3[i] = pk[i * 3 + 2];
}
pkTemp[0] = pk[51];
pkTemp[1] = pk[52];
pkTemp[2] = pk[53];
}
// 對牌排序
public Poker[] Order_cards(Poker[] arr)
{
Int32 c;
for (Int32 index = 0; index < arr.Length; index++)
{
Math.DivRem(arr[index].PokerIndex, 13, out c);
if (arr[index].PokerIndex == 53)
{
arr[index].PokerValue = 16;
}
else if (arr[index].PokerIndex == 52)
{
arr[index].PokerValue = 15;
}
else
{
if (c == 0)
{
arr[index].PokerValue = 13;
}
else if (c == 1)
{
arr[index].PokerValue = 14;
}
else
{
arr[index].PokerValue = c;
}
}
}
Sort(arr, arr.Length);
return arr;
}
// 排序
public void Sort(Poker[] arr, Int32 n)
{
Int32 i, j, k;
Poker temp;
for (i = 0; i < n; ++i)
{
j = i;
for (k = i + 1; k < n; ++k)
{
if (arr[j].PokerValue < arr[k].PokerValue)//如果前個數比後個數大,則交換位置。
{
temp = arr[k];
arr[k] = arr[j];
arr[j] = temp;
}
}
}
}
public void AfterSort()
{
pk1 = Order_cards(pk1);
pk2 = Order_cards(pk2);
pk3 = Order_cards(pk3);
}
在寫的過程中,參考了這個貼子. http://www.cnblogs.com/blackzh/archive/2006/07/13/450036.html