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;
}
}
}