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);
}
}
}