十三水共發13張牌,要求組成3道牌,首道3張,中道5張,尾道5張.
牌型:首道:單張<一對(有2張一樣)<三條(3張大小一樣),中道和尾道:高牌<一對<兩對<三張<順子<同花<葫蘆<炸彈<同花順(9)<五同(10)
出牌需把牌理爲3道,必須尾道>=中道>=首道
自動擺牌方案:首先提取尾道,(剩下的牌)提取中道,(剩下的牌)首道.
提取尾道方案:先從五同開始從大到小找,找N階(找出最大的牌型的個數)
提取中道方案:從跟首道一樣大的牌型開始從大到小找,找2階(爲什麼只找2階?因爲可能存在牌型一樣大的解,如果牌型一樣大的找不到,找牌型小一點的解,再小沒必要了)
僞代碼實現:
public class CardModel { public List<TypeCard> TypeCardList; public CardModel() { TypeCardList = new List<TypeCard>(); } } public class TypeCard { public long Weight { internal set; get; }//牌型權重比較值 public List<int> CardList { internal set; get; }//手牌 public bool IsFalse { internal set; get; } } public static List<CardModel> GetAllResult(List<int> cardList) { List<CardModel> models = new List<CardModel>(); var cardTypeList = GetAllCardType(cardList, 10, 2); foreach (var item in cardTypeList) { List<int> newCardlist = new List<int>(cardList); DeleteListElement(newCardlist, item.CardList); var cardTypeList2 = GetAllCardType(newCardlist, (int)(item.Weight / Math.Pow(10, 10)), 2); foreach (var item2 in cardTypeList2) { if (item.Weight >= item2.Weight) { List<int> lastCardlist = new List<int>(newCardlist); DeleteListElement(lastCardlist, item2.CardList); var weight = GetCardWeight(lastCardlist); if (item2.Weight >= weight) { var model = new CardModel(); model.TypeCardList.Add(item); model.TypeCardList.Add(item2); model.TypeCardList.Add(new TypeCard() { CardList = lastCardlist, Weight = weight }); models.Add(model); } } } } return models; } public static List<TypeCard> GetAllCardType(List<int> cardList, int level, int depth) { List<TypeCard> typeCardList = new List<TypeCard>(); //從大到小排序 SortCard(cardList); int kingCount = cardList.Count(c => c == SmallKing || c == BigKing); Action<int, Func<List<TypeCard>>> func = (cur, method) => { if (level == cur) { if (depth > 0) { var list = method(); if (list.Count > 0) { typeCardList.AddRange(list); depth--; } } level--; } }; #region 五炸 func(10, () => GetFiveBomb(,,,, kingCount)); #endregion #region 順子(包含同花順) func(9, () => GetStraightFlush(,,,, )); #endregion #region 炸彈 func(8, () => GetBomb( ,,,, l3)); #endregion #region 葫蘆 func(7, () => GetGourd(,,,,, OneNum)); #endregion #region 同花 func(6, () => GetFlush(,,,,)); #endregion func(5, () => GetStraight(,,,, ,)); #region 三張 func(4, () => GetThree(,,,,)); #endregion #region 兩對 func(3, () => GetTwoPair( ,,,,)); #endregion #region 對子 func(2, () => GetPair( ,,,,)); #endregion func(1, () => GetSingle(,,,,)); return typeCardList; }