using System.Collections.Generic; using System.Linq; using GameMessage; namespace GameFix.Poker { /// /// 手牌组 /// 有些逻辑需要校验手牌,用这个组 /// 目前不包含癞子逻辑得判断 /// public class CardHandGroup : CardBaseGroup { public CardBaseGroup CheckCardGroup { get; private set;} public CardHandGroup(IEnumerable cards, Deck deck) : base(cards, deck) { } /// /// 拆解部分牌组 /// public List DecomposePart(List styles) { List ret = new List(); 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; } /// /// 拆解牌组 /// public List Decompose() { List ret = new List(); 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 GetShunTip(CardStyleInfo targetStyle, byte[] tipHelpers) { List ret = new List(); 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 GetEatTip(int styleId) { List ret = new List(); 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; } /// /// 获取吃牌提示 /// public List GetEatTip(CardStyleInfo targetStyle) { List ret = new List(); 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(); 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; } /// /// 获取cards符合条件牌型 /// public CardStyleInfo GetCardStyleInfo(IEnumerable 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; } /// /// 获取cards符合条件牌型 /// public List GetCardStyleInfos(IEnumerable cards) { CheckCardGroup = mDeck.CreateCardGroup(cards); List cardStyleInfos = new List(); foreach (var helper in mCardStyleBaseHelpers) { if (helper.CheckStyleNormal(this, out var chekStyleInfo)) { cardStyleInfos.Add(chekStyleInfo); } } CheckCardGroup = null; return cardStyleInfos; } /// /// 检测cards牌型是否符合条件 /// public bool CheckCardStyleInfoValidate(IEnumerable 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; } } }