using System.Collections.Generic; using System.Linq; namespace GameFix.Poker { public abstract class CardBaseGroup { // key-牌值 value-牌组信息 (不含癞子) protected List mCardGroupList = new List(20); // 大王19 (按照牌值合并的牌组) // key-牌数量 value-这个数量对应的所有牌组 (不含癞子) protected Dictionary> mCardGroupDic; protected List mCards; // 原始的牌数据 protected List mLZCards; // 癞子牌 protected List mNoLZCards;// 除去癞子的牌列表 internal IStyleComparer mStyleComparer; internal Deck mDeck; protected List mCardStyleBaseHelpers = new List(); public List SelfCards => mCards; public List SelfCardGroupList => mCardGroupList; public Dictionary> SelfCardGroupDic => mCardGroupDic; public List Cards { get { // 如果是手牌对象 if (this is CardHandGroup cardHandGroup) { // 并且有需要检测得牌,就取CheckCardGroup得牌 if (cardHandGroup.CheckCardGroup?.mCards.Count > 0) return cardHandGroup.CheckCardGroup.mCards; } return mCards; } } public List LZCards { get { // 如果是手牌对象 if (this is CardHandGroup cardHandGroup) { // 并且有需要检测得牌,就取CheckCardGroup得牌 if (cardHandGroup.CheckCardGroup?.mLZCards.Count > 0) return cardHandGroup.CheckCardGroup.mLZCards; } return mLZCards; } } public List NoLZCards { get { // 如果是手牌对象 if (this is CardHandGroup cardHandGroup) { // 并且有需要检测得牌,就取CheckCardGroup得牌 if (cardHandGroup.CheckCardGroup?.mNoLZCards.Count > 0) return cardHandGroup.CheckCardGroup.mNoLZCards; } return mNoLZCards; } } public List CardGroupList { get { // 如果是手牌对象 if (this is CardHandGroup cardHandGroup) { // 并且有需要检测得牌,就取CheckCardGroup得牌 if (cardHandGroup.CheckCardGroup?.mCardGroupList.Count > 0) return cardHandGroup.CheckCardGroup.mCardGroupList; } return mCardGroupList; } } public Dictionary> CardGroupDic { get { // 如果是手牌对象 if (this is CardHandGroup cardHandGroup) { // 并且有需要检测得牌,就取CheckCardGroup得牌 if (cardHandGroup.CheckCardGroup?.mCardGroupDic.Count > 0) return cardHandGroup.CheckCardGroup.mCardGroupDic; } return mCardGroupDic; } } protected CardBaseGroup(IEnumerable cards, Deck deck) { mDeck = deck; mCards = new List(cards); mCards.Sort(new CardDefaultComparer(true)); mLZCards = new List(mCards.Count); mNoLZCards = new List(mCards.Count); InitPreData(); } void InitPreData() { mCardGroupList.Clear(); mLZCards.Clear(); mNoLZCards.Clear(); for (int i = 0; i < mCardGroupList.Capacity; i++) { mCardGroupList.Add(new CardGroupList()); } for (int i = 0; i < mCards.Count; i++) { if (mCards[i].CardType == DataCardConst.CardTypeLZ) { mLZCards.Add(mCards[i]); continue; } mCardGroupList[mCards[i].Value].Add(mCards[i]); mNoLZCards.Add(mCards[i]); } mCardGroupDic = mCardGroupList .GroupBy(g=>g.Count) .Where(g=>g.Key != 0) .ToDictionary(g=>g.Key, g=>g.ToList()); } internal CardBaseGroup RegisterHelper(List helpers) { mCardStyleBaseHelpers.AddRange(helpers); return this; } internal CardBaseGroup RegisterStyleComparer(IStyleComparer comparer) { mStyleComparer = comparer; return this; } public CardBaseGroup RemoveCards(IEnumerable cards) { mCards.RemoveAll(cards.Contains); InitPreData(); return this; } public CardBaseGroup RemoveCards(IEnumerable cardGroups) { var cards = cardGroups.SelectMany(x => x).ToList(); RemoveCards(cards); return this; } public CardBaseGroup AddHelper(CardStyleBaseHelper helper) { mCardStyleBaseHelpers.Add(helper); return this; } /// /// 获取一种牌型的数量 /// /// 数量 public int GetSingleCardStyleCount(int cardValue) { if (cardValue >= mCardGroupList.Capacity) return 0; return mCardGroupList[cardValue].Count; } public CardGroupList GetAllJoker() { CardGroupList list = new CardGroupList(); list.AddRange(mCardGroupList[DataCardConst.CardValueBigJoker]); list.AddRange(mCardGroupList[DataCardConst.CardValueSmallJoker]); return list; } public bool HaveJoker() { return mCards.Any(x => DataCardConst.JokerValues.Contains(x.Value)); } public int GetJokerCount() { return mCards.Count(x => DataCardConst.JokerValues.Contains(x.Value)); } public bool IsAllJoker() { return CardFunc.IsAllJoker(mCards); } public bool IsAllSuitSame() { return CardFunc.IsAllSuitSame(mCards); } public bool IsAllValueSame() { return CardFunc.IsAllValueSame(mCards); } protected CardStyleBaseHelper GetHelper(int cardStyle) { return mCardStyleBaseHelpers.Find(x => x.CardStyle == cardStyle); } } }