Files
hjha-server/GameFix/Common/Card/CardHandGroup.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

219 lines
7.7 KiB
C#

using System.Collections.Generic;
using System.Linq;
using GameMessage;
namespace GameFix.Poker
{
/// <summary>
/// 手牌组
/// 有些逻辑需要校验手牌,用这个组
/// 目前不包含癞子逻辑得判断
/// </summary>
public class CardHandGroup : CardBaseGroup
{
public CardBaseGroup CheckCardGroup { get; private set;}
public CardHandGroup(IEnumerable<Card> cards, Deck deck) : base(cards, deck)
{
}
/// <summary>
/// 拆解部分牌组
/// </summary>
public List<CardGroupList> DecomposePart(List<int> styles)
{
List<CardGroupList> ret = new List<CardGroupList>();
var cardGroup = mDeck.CreateCardGroup(mCards);
foreach (var helper in mCardStyleBaseHelpers)
{
if (!styles.Contains(helper.CardStyle)) continue;
var styleCards = helper.GetAllStyleCards(cardGroup, false);
foreach (var cardList in styleCards)
{
if (cardList.CardStyleInfo == null)
cardList.CardStyleInfo = GetCardStyleInfo(cardList);
}
ret.AddRange(styleCards);
cardGroup.RemoveCards(styleCards);
}
return ret;
}
/// <summary>
/// 拆解牌组
/// </summary>
public List<CardGroupList> Decompose()
{
List<CardGroupList> ret = new List<CardGroupList>();
var cardGroup = mDeck.CreateCardGroup(mCards);
foreach (var helper in mCardStyleBaseHelpers)
{
var styleCards = helper.GetAllStyleCards(cardGroup, false);
foreach (var cardList in styleCards)
{
if (cardList.CardStyleInfo == null)
cardList.CardStyleInfo = GetCardStyleInfo(cardList);
}
ret.AddRange(styleCards);
cardGroup.RemoveCards(styleCards);
}
if (cardGroup.Cards.Count > 0)
{ // 还有未知牌型没有拆解完? (理论不存在)
ret.Add(new CardGroupList(cardGroup.Cards));
}
return ret;
}
public List<CardGroupList> GetShunTip(CardStyleInfo targetStyle, byte[] tipHelpers)
{
List<CardGroupList> ret = new List<CardGroupList>();
for (int i = 0; i < tipHelpers.Length; i++)
{
var helper = GetHelper(tipHelpers[i]);
var tipCardList = helper?.GetAllEatTipGroup(this, targetStyle);
if (tipCardList != null && tipCardList.Count > 0)
{
ret.AddRange(tipCardList.OrderByDescending(x=>x.Count));
return ret;
}
}
return ret;
}
public List<CardGroupList> GetEatTip(int styleId)
{
List<CardGroupList> ret = new List<CardGroupList>();
var helper = GetHelper(styleId);
if (helper != null)
{
ret.AddRange(helper.GetAllEatTipGroup(this, null));
if (ret.Count == 0 && mLZCards.Count > 0)
{
ret.AddRange(helper.GetAllEatTipGroupWithLZ(this, null));
}
}
return ret;
}
/// <summary>
/// 获取吃牌提示
/// </summary>
public List<CardGroupList> GetEatTip(CardStyleInfo targetStyle)
{
List<CardGroupList> ret = new List<CardGroupList>();
if (targetStyle == null)
{
// 没有提供对方牌型,先判断自己手牌是否符合一种牌型可以一次性出完
var styleInfo = GetCardStyleInfo(mCards);
bool isCanOutImmediate = false;
if (styleInfo.CardStyle != DataCardConst.CardStyle0)
{
var cardGroupList = new CardGroupList(mCards);
cardGroupList.CardStyleInfo = styleInfo;
ret.Add(cardGroupList);
isCanOutImmediate = true;
}
if (!isCanOutImmediate)
{
foreach (var helper in mCardStyleBaseHelpers)
{
ret.AddRange(helper.GetAllEatTipGroup(this, null));
}
}
}
else
{
foreach (var helper in mCardStyleBaseHelpers)
{
if (mStyleComparer.Greater(helper.CardStyle, targetStyle.CardStyle))
{
ret.AddRange(helper.GetAllEatTipGroup(this, targetStyle));
}
}
}
// 牌类型赋值
var filterRet = new List<CardGroupList>();
foreach (var cardList in ret)
{
if (cardList.Count == 0) continue;
if (cardList.CardStyleInfo == null)
cardList.CardStyleInfo = GetCardStyleInfo(cardList);
if (mStyleComparer.Greater(cardList.CardStyleInfo, targetStyle))
{
filterRet.Add(cardList);
}
}
return filterRet;
}
/// <summary>
/// 获取cards符合条件牌型
/// </summary>
public CardStyleInfo GetCardStyleInfo(IEnumerable<Card> cards)
{
CheckCardGroup = mDeck.CreateCardGroup(cards);
foreach (var helper in mCardStyleBaseHelpers)
{
if (helper.CheckStyleNormal(this, out var chekStyleInfo))
{
return chekStyleInfo;
}
}
CheckCardGroup = null;
CardStyleInfo cardStyleInfo = new CardStyleInfo();
cardStyleInfo.CardStyle = DataCardConst.CardStyle0;
return cardStyleInfo;
}
/// <summary>
/// 获取cards符合条件牌型
/// </summary>
public List<CardStyleInfo> GetCardStyleInfos(IEnumerable<Card> cards)
{
CheckCardGroup = mDeck.CreateCardGroup(cards);
List<CardStyleInfo> cardStyleInfos = new List<CardStyleInfo>();
foreach (var helper in mCardStyleBaseHelpers)
{
if (helper.CheckStyleNormal(this, out var chekStyleInfo))
{
cardStyleInfos.Add(chekStyleInfo);
}
}
CheckCardGroup = null;
return cardStyleInfos;
}
/// <summary>
/// 检测cards牌型是否符合条件
/// </summary>
public bool CheckCardStyleInfoValidate(IEnumerable<Card> cards, CardStyleInfo cardStyleInfo, out CardStyleInfo chkStyleInfo)
{
chkStyleInfo = new CardStyleInfo();
CheckCardGroup = mDeck.CreateCardGroup(cards);
foreach (var helper in mCardStyleBaseHelpers)
{
if (helper.CardStyle == cardStyleInfo.CardStyle)
{
// 先检测是否符合普通牌型
if (helper.CheckStyleNormal(this, out chkStyleInfo))
{
return true;
}
}
}
return false;
}
}
}