棋牌类游戏利用字节表示卡牌(仅扑克牌)

  #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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值