using System; using System.Linq; namespace GameFix.Poker { /// /// 一张牌 /// public class Card { public int Id { get; } public byte CardType { get; set; } /// /// 逻辑值 /// public byte Value { get; private set; } /// /// 花色 /// public byte Suit { get; private set; } /// /// 排序数 /// public int SortNum { get;private set; } /// /// 原始逻辑值 /// public byte OriginValue { get; private set; } /// /// 用户数据 /// public object UserData { get; set; } public override string ToString() { var suitStr = string.Empty; switch (Suit) { case DataCardConst.SuitSpade: suitStr = "黑"; break; case DataCardConst.SuitHeart: suitStr = "红"; break; case DataCardConst.SuitClub: suitStr = "梅"; break; case DataCardConst.SuitDiamond: suitStr = "方"; break; case DataCardConst.SuitJoker: return (Value == DataCardConst.JokerValues[0] ? "小王" : "大王"); default: return $"CardErr[{Suit}_{Value}]"; } var vIndex = Array.IndexOf(DataCardConst.CardValues, Value); if (vIndex<0 || vIndex >= DataCardConst.CardValueText.Length) return $"CardErr[{Suit}_{Value}]"; var valueStr = DataCardConst.CardValueText[vIndex]; return suitStr + valueStr; } int? _hashCode = null; public override int GetHashCode() => _hashCode.HasValue ? _hashCode.Value : (_hashCode = Id << 16 | (byte)Suit << 8 | Value).Value; public Card() { } public Card(int id, byte suit, byte value) { this.Id = id; this.Suit = suit; this.Value = value; this.SortNum = Value * 10 + suit; } public void SetSortNum(int num) { this.SortNum = num; } public bool IsLz => CardType == DataCardConst.CardTypeLZ; public bool IsReplace => OriginValue != 0; /// /// 是否包含某个类型 /// public bool IsCardType(byte cardType) { return (CardType & cardType) == cardType; } /// /// 附加一个牌值类型 /// public void AddOrRmCardType(byte cardType, bool isAdd = true) { if (isAdd) { CardType |= cardType; } else { CardType &= (byte)~cardType; } } /// /// 癞子可以替换任何牌 /// public Card Replace(byte value) { if (CardType == DataCardConst.CardTypeLZ) { var newCard = this.Clone(); newCard.OriginValue = Value; newCard.Value = value; newCard.SortNum = Value * 10 + Suit; return newCard; } return this; } /// /// 浅拷贝 /// public Card Clone() => (Card)MemberwiseClone(); } public static class CardManager { /// /// 逻辑数 转 显示数 /// /// /// public static byte LogicValue2UINum(byte value) { switch (value) { case 14: return 1; case 16: return 2; case 18: return 14; case 19: return 15; default: return value; } } public static byte LogicValue2SoundNum(byte value) { switch (value) { case 14: return 14; case 16: return 15; case 18: return 16; case 19: return 17; default: return value; } } public static (byte, byte) GetSuitValueFromStr(string cardString) { var chars = cardString.Trim().ToCharArray(); var pos = 0; if (char.IsNumber(chars[0])) { pos++; } byte suit = DataCardConst.SuitJoker; switch (chars[pos]) { case '小': return (DataCardConst.SuitJoker, 18); case '大': return (DataCardConst.SuitJoker, 19); case '黑': suit = DataCardConst.SuitSpade; break; case '梅': suit = DataCardConst.SuitClub; break; case '红': suit = DataCardConst.SuitHeart; break; case '方': suit = DataCardConst.SuitDiamond; break; default: throw new NotSupportedException($"不支持的花色:{chars[0]}"); } pos++; var value = byte.MinValue; var str = new string(chars.Skip(pos).ToArray()).TrimStart('0').TrimEnd(' '); var index = Array.IndexOf(DataCardConst.CardValueText, str); if (index >= 0) { value = DataCardConst.CardValues[index]; } else { value = byte.Parse(str); } return (suit, value); } } }