using System; using System.Collections.Generic; using System.Linq; namespace GameFix.Poker { /// /// 桌面牌组管理 /// public class Deck : List, ICardIdResolver { public static readonly Random Random = new Random(); public new Card this[int index] => (Card)base[index]; public IStyleComparer StyleComparer => mBaseLogic.GetStyleComparer(); public DeckSerializer Serializer {get; private set;} private DeckBaseLogic mBaseLogic; internal Deck(DeckBaseLogic baseLogic) : base(baseLogic.Create()) { mBaseLogic = baseLogic; Serializer = new DeckSerializer(this); } public T GetDeckLogic() { if (mBaseLogic is T logic) return logic; return default; } public IEnumerable GetCards(Func predicate) { return this.Where(predicate); } public List GetCards(IEnumerable ids) { List cards = new List(); var enumerable = ids.ToList(); for (int i = 0; i < enumerable.Count(); i++) { var card = GetById(enumerable.ElementAt(i)); if (card != null) cards.Add(card); } return cards; } public Card GetCard(byte suit, int value) { return GetCards(p=>p.Suit == suit && p.Value == value).FirstOrDefault(); } public Card GetCard(byte suit, int value, Func condition) { return GetCards(p=>p.Suit == suit && p.Value == value) .Where(condition).FirstOrDefault(); } public Card GetById(int id) { if (id < 0 || id >= Count) return null; return this[id]; } public void RevertAllCardType() { for (int i = 0; i < this.Count; i++) { this[i].CardType = DataCardConst.CardTypeNormal; } } /// /// 刷新牌类型 /// public void RefreshCardType(byte cardType, List cards) { RevertAllCardType(); for (int i = 0; i < cards.Count; i++) { int index = this.IndexOf(cards[i]); if (index >= 0) this[index].CardType = cardType; } } public void RefreshCardType(byte cardType, List ids) { RevertAllCardType(); for (int i = 0; i < ids.Count; i++) { var card = GetById(ids[i]); if (card != null) card.CardType = cardType; } } public void RefreshCardType(byte cardType, List values) { RevertAllCardType(); for (int i = 0; i < this.Count; i++) { if (values.Contains(this[i].Value)) this[i].CardType = cardType; } } /// /// 将牌列表封装成牌组,可用于牌型等判断 /// public CardGroup CreateCardGroup(IEnumerable cards) { var cardGroup = new CardGroup(cards, this); var styleHelpers = mBaseLogic.GetAllStyleHelper(cardGroup); var styleComparer = mBaseLogic.GetStyleComparer(); cardGroup.RegisterHelper(styleHelpers); cardGroup.RegisterStyleComparer(styleComparer); return cardGroup; } public CardHandGroup CreateCardHandGroup(IEnumerable cards) { var cardGroup = new CardHandGroup(cards, this); var styleHelpers = mBaseLogic.GetAllStyleHelper(cardGroup); var styleComparer = mBaseLogic.GetStyleComparer(); cardGroup.RegisterHelper(styleHelpers); cardGroup.RegisterStyleComparer(styleComparer); return cardGroup; } public static Deck Create(DeckBaseLogic baseLogic) { var deck = new Deck(baseLogic); baseLogic.SetDeck(deck); baseLogic.OnInit(); return deck; } } }