#region 成员变量和枚举
public enum CardType
{
None = 0,
WuShiK = 1,
Single = 2,
Double = 3,
Three = 4,
Boom = 5,
KingBoom = 6,
King = 7
}
public byte[] CardsTemplate = new byte[55]
{
0x00, // 占位符
//3 4 5 6 7 8 9 10 J Q K A 2
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, //黑桃
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, //红桃
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, //梅花
0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, //方块
0x51, 0x52 // 大小王
};
public void Init(){}
public readonly string[] CardsStr = new string[55]
{
"", // 占位符
"黑桃3", "黑桃4", "黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K", "黑桃A", "黑桃2", //黑桃
"红桃3", "红桃4", "红桃5", "红桃6", "红桃7", "红桃8", "红桃9", "红桃10", "红桃J", "红桃Q", "红桃K", "红桃A", "红桃2", //红桃
"梅花3", "梅花4", "梅花5", "梅花6", "梅花7", "梅花8", "梅花9", "梅花10", "梅花J", "梅花Q", "梅花K", "梅花A", "梅花2", //梅花
"方块3", "方块4", "方块5", "方块6", "方块7", "方块8", "方块9", "方块10", "方块J", "方块Q", "方块K", "方块A", "方块2", //方块
"小王", "大王" // 大小王
};
public readonly byte[] CardNumber = new byte[55]
{
0x00, // 占位符
0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x01,0x02,//黑桃
0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x01,0x02,//红桃
0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x01,0x02,//梅花
0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x01,0x02,//方块
0x11,0x12
};
public readonly byte[] CardsBy510K = new byte[12]
{
0x13, 0x18, 0x1B,
0x23, 0x28, 0x2B,
0x33, 0x38, 0x3B,
0x43, 0x48, 0x4B,
};
public readonly string[] CardsType = new string[6]
{
"none", "黑桃", "红桃", "梅花", "方块", "王"
};
#endregion
#region 获得牌的值和牌类型
public int CardTypeIndex(byte card)
{
return (card & 0xf0) >> 4;
}
public int CardIndex(byte card)
{
if (card >= 0x11 && card <= 0x1D)
{
return card - 0x10;
}
else if (card >= 0x21 && card <= 0x2D)
{
return card - 0x13;
}
else if (card >= 0x31 && card <= 0x3D)
{
return card - 0x16;
}
else if (card >= 0x41 && card <= 0x4D)
{
return card - 0x19;
}
else if (card == 0x51 || card == 0x52)
{
return card - 0x1c;
}
return 0;
}
public int CardValue(byte card)
{
return card & 0x0f;
}
#region 在牌库中随机抽取指定数量的牌
/// <summary>
/// 在牌库中随机抽取指定数量的牌(这里是两副牌)
/// </summary>
public Dictionary<int, List<byte>> RandomCards(int king = 0)
{
var playerCards = new Dictionary<int, List<byte>>();
#region 根据条件创建牌库
var cardLibrary = new Dictionary<Guid, byte>();
for (var i = 1; i <= 2; i++)
{
foreach (var b in CardsTemplate.Skip(1).Take(52))
{
cardLibrary.Add(Guid.NewGuid(),b);
}
}
for (var i = 0; i < king; i++)
{
cardLibrary.Add(Guid.NewGuid(), 0x51);
cardLibrary.Add(Guid.NewGuid(), 0x52);
}
for (var playerIndex = 1; playerIndex <= 4; playerIndex++)
playerCards.Add(playerIndex, new List<byte>());
var cardLibraryOrder = cardLibrary.OrderBy(d=>d.Key).Select(d=>d.Value).ToList();
#endregion
#region 玩家按顺序摸牌
while (true)
{
if (!cardLibraryOrder.Any()) break;
for (var i = 1; i <= playerCards.Count; i++)
{
playerCards[i].Add(cardLibraryOrder.ElementAt(0));
cardLibraryOrder.RemoveAt(0);
if (!cardLibraryOrder.Any()) break;
}
}
#endregion
return playerCards;
}
/// <summary>
/// 随机一张牌出来、并且不进行入库和出库
/// </summary>
/// <param name="cards"></param>
/// <returns></returns>
public byte RandomCard(byte[] cards)
{
byte card = 0x00;
while (true)
{
card = cards[new Random(RandomHelper.GetRandomSeed()).Next(1, cards.Length - 3)];
if (CardTypeIndex(card) != 5) break;
}
return card;
}
#endregion
public override void Dispose()
{
if (IsDisposed) return;
base.Dispose();
}
}
//随机数帮助类
public static class RandomHelper
{
private static readonly Random random = new Random();
public static UInt64 RandUInt64()
{
var bytes = new byte[8];
random.NextBytes(bytes);
return BitConverter.ToUInt64(bytes, 0);
}
public static Int64 RandInt64()
{
var bytes = new byte[8];
random.NextBytes(bytes);
return BitConverter.ToInt64(bytes, 0);
}
/// <summary>
/// 获取lower与Upper之间的随机数
/// </summary>
/// <param name="lower"></param>
/// <param name="upper"></param>
/// <returns></returns>
public static int RandomNumber(int lower, int upper)
{
int value = random.Next(lower, upper);
return value;
}
/// <summary>
/// 获取不重复的随机数
/// </summary>
/// <returns></returns>
public static int GetRandomSeed()
{
var bytes = new byte[4];
var rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
}
棋牌类游戏利用字节表示卡牌(仅扑克牌)
最新推荐文章于 2021-02-08 22:06:25 发布