public static int[] Cards =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,//万
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,//万
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,//万
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,//万
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,//条
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,//条
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,//条
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,//条
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,//筒
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,//筒
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,//筒
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,//筒
}
private const int MASK_COLOR = 0xF0;
//花色掩码
private const int MASK_VALUE = 0x0F;
//数值掩码
继上个章节之后,洗完牌后将牌堆做了一个新的排序,每次接牌的时候只需要按照牌堆的顺序依次接收即可,牌堆中的索引与牌值并没有相互对应:例如索引0代表的时一万,索引9代表的也是一万,
因此我们需要做一个将牌堆中的值转化为手牌中索引的方法,和索引转化为牌值的方法:
//(索引->牌值) 的核心代码:
//
//
public static int IndexSwitchToCard(int index) //(索引->牌值)
{
int value = 0;
value = ((index / 9) << 4) | (index % 9 + 1);
return value;
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//(牌型->索引) 的核心代码:
//
//
public static int SwitchToCardIndex(int _cardValue) //(牌型->索引)
{
CardsOfIndex = ((_cardValue & MASK_COLOR) >> 4) * 9 + (_cardValue & MASK_VALUE) - 1;
return CardsOfIndex;
}
对牌值转化为索引进行验证:
(一)假设传进的牌值为:0x11;(他对应手牌的索引为9)
(二)_cardValue & MASK_COLOR得到0x10再降其向右移动四位得到结果为0001,再乘9得到结果为:1001;
(三)_cardValue & MASK_VALUE得到0x01:0001再减去1得到0,和(二)相加后得到9。得以验证;
下面进行发牌的方法,打过麻将的都知道在第一次接牌的时候每个人手中的牌数为13张附上代码:
public static int[] Dealcard(int[] cbCardIndex) //这个是第一次发牌的方法,一人接13张牌cbCardIndex返回一个手牌的索引
{
for (int i = 0; i < 13; i++)
{
int value = Cards[IndexIncard];
int index = SwitchToCardIndex(value);
cbCardIndex[index]++;
IndexIncard++;
}
return cbCardIndex;
}
只有庄家手中的会多接一张牌,再附上单个接牌的方法,这里返回的时接收到的那张牌索引
public static int GetCard(int[] cbCardIndex) //这个是接牌的方法
{
int value = Cards[IndexIncard];
int index = SwitchToCardIndex(value);
cbCardIndex[index]++;
IndexIncard++;
return index;
}