Files
hjha-server/GameFix/Common/Card/Card.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

218 lines
6.2 KiB
C#

using System;
using System.Linq;
namespace GameFix.Poker
{
/// <summary>
/// 一张牌
/// </summary>
public class Card
{
public int Id { get; }
public byte CardType { get; set; }
/// <summary>
/// 逻辑值
/// </summary>
public byte Value { get; private set; }
/// <summary>
/// 花色
/// </summary>
public byte Suit { get; private set; }
/// <summary>
/// 排序数
/// </summary>
public int SortNum { get;private set; }
/// <summary>
/// 原始逻辑值
/// </summary>
public byte OriginValue { get; private set; }
/// <summary>
/// 用户数据
/// </summary>
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;
/// <summary>
/// 是否包含某个类型
/// </summary>
public bool IsCardType(byte cardType)
{
return (CardType & cardType) == cardType;
}
/// <summary>
/// 附加一个牌值类型
/// </summary>
public void AddOrRmCardType(byte cardType, bool isAdd = true)
{
if (isAdd)
{
CardType |= cardType;
}
else
{
CardType &= (byte)~cardType;
}
}
/// <summary>
/// 癞子可以替换任何牌
/// </summary>
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;
}
/// <summary>
/// 浅拷贝
/// </summary>
public Card Clone() => (Card)MemberwiseClone();
}
public static class CardManager
{
/// <summary>
/// 逻辑数 转 显示数
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
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);
}
}
}