//--------------------------------------------------------------------- private static int CompareTwoHandsWithHighCard( ICollection <CardData> firstHand, ICollection <CardData> secondHand) { int first_hand_value = 0; foreach (var i in firstHand) { MaJiangSuit mj_suit = (MaJiangSuit)i.suit; if (mj_suit == MaJiangSuit.Tong) { first_hand_value += i.type; } } first_hand_value = first_hand_value % 10; int second_hand_value = 0; foreach (var i in secondHand) { MaJiangSuit mj_suit = (MaJiangSuit)i.suit; if (mj_suit == MaJiangSuit.Tong) { second_hand_value += i.type; } } second_hand_value = second_hand_value % 10; if (first_hand_value > second_hand_value) { return(1); } if (first_hand_value < second_hand_value) { return(-1); } var firstSorted = firstHand.OrderByDescending(x => x.type).ToList(); var secondSorted = secondHand.OrderByDescending(x => x.type).ToList(); var cardsToCompare = Math.Min(firstHand.Count, secondHand.Count); for (var i = 0; i < cardsToCompare; i++) { if (firstSorted[i].type > secondSorted[i].type) { return(1); } if (firstSorted[i].type < secondSorted[i].type) { return(-1); } } return(0); }
//--------------------------------------------------------------------- Card _getNextOrLastCardTypeCard(MaJiangType card_type, MaJiangSuit card_suit, bool is_same_suit, bool is_next) { Card card = null; MaJiangType need_cardtype = MaJiangType.Two; if (is_next) { int next_cardtype = ((int)card_type) + 1; if (next_cardtype == 15) { need_cardtype = MaJiangType.Two; } else { need_cardtype = (MaJiangType)next_cardtype; } } else { int last_cardtype = ((int)card_type) - 1; if (last_cardtype == 1) { need_cardtype = MaJiangType.Nine; } else { need_cardtype = (MaJiangType)last_cardtype; } } if (is_same_suit) { List <Card> list_same_suitcards = null; if (mapSameSuitCard.TryGetValue(card_suit, out list_same_suitcards)) { byte need_cardtype_bte = (byte)need_cardtype; var list_suit_card = list_same_suitcards.Where(x => x.Type == need_cardtype_bte); if (list_suit_card != null && list_suit_card.Count() > 0) { card = list_suit_card.First(); _removeCard(card); } } } else { card = _getSameTypeCard(need_cardtype); } return(card); }
//--------------------------------------------------------------------- Card _getSameSuitCard(MaJiangSuit card_suit) { Card card = null; List <Card> list_samesuitcard = null; mapSameSuitCard.TryGetValue(card_suit, out list_samesuitcard); if (list_samesuitcard != null && list_samesuitcard.Count > 0) { int index = RandomEx.Next(0, list_samesuitcard.Count); card = list_samesuitcard[index]; _removeCard(card); } return(card); }
//--------------------------------------------------------------------- public static string GetMaJiangCardResName(CardData card_data) { string card_res_name = ""; MaJiangSuit majiang_suit = (MaJiangSuit)card_data.suit; if (majiang_suit != MaJiangSuit.Wan && majiang_suit != MaJiangSuit.Tong && majiang_suit != MaJiangSuit.Tiao) { card_res_name = majiang_suit.ToString(); } else { MaJiangType majiang_type = (MaJiangType)card_data.type; card_res_name = majiang_type.ToString() + majiang_suit.ToString(); } return(card_res_name); }
//--------------------------------------------------------------------- // <summary> // Finds the best possible hand given a player's cards and all revealed comunity cards. // </summary> // <param name="cards">A player's cards + all revealed comunity cards (at lesat 5 in total)</param> // <returns>Returns an object of type BestHandZhongFB</returns> public BestHandZhongFB GetBestHand(IEnumerable <Card> cards) { var cardTypeMap = new Dictionary <MaJiangType, List <Card> >(); foreach (var card in cards) { List <Card> listTypeCard = null; cardTypeMap.TryGetValue((MaJiangType)card.Type, out listTypeCard); if (listTypeCard == null) { listTypeCard = new List <Card>(); } listTypeCard.Add(card); cardTypeMap[(MaJiangType)card.Type] = listTypeCard; } var pairTypes = this.GetTypesWithNCards(cardTypeMap, 2); // Pair if (pairTypes.Count == 2) { var bestCards = new List <CardData>(); bestCards.AddRange(pairTypes); CardData card_data_first = bestCards[0]; HandRankTypeZhongFB rank_type = HandRankTypeZhongFB.BaoZi; if (card_data_first.suit == (byte)MaJiangSuit.Bai) { rank_type = HandRankTypeZhongFB.BaoZiBai; } else if (card_data_first.suit == (byte)MaJiangSuit.Zhong) { rank_type = HandRankTypeZhongFB.BaoZiZhong; } else if (card_data_first.suit == (byte)MaJiangSuit.Fa) { rank_type = HandRankTypeZhongFB.BaoZiFa; } return(new BestHandZhongFB(rank_type, bestCards, pairTypes)); } else { // High card int cards_count = cards.Count(); int take_count = (cards_count >= ComparableCards) ? ComparableCards : cards_count; var bestCards = cards.Select(x => x.GetCardData()).OrderByDescending(x => x.type).Take(take_count).ToList(); bool exists_2_bing = bestCards.Exists(x => x.type == (byte)MaJiangType.Two && x.suit == (byte)MaJiangSuit.Tong); bool exists_8_bing = bestCards.Exists(x => x.type == (byte)MaJiangType.Eight && x.suit == (byte)MaJiangSuit.Tong); HandRankTypeZhongFB rank_type = HandRankTypeZhongFB.Dian0; if (exists_2_bing && exists_8_bing) { rank_type = HandRankTypeZhongFB.TianGang; } else { var hand_value = 0; foreach (var i in cards) { MaJiangSuit mj_suit = (MaJiangSuit)i.Suit; if (mj_suit == MaJiangSuit.Tong) { hand_value += i.Type; } } var dian = hand_value % 10; foreach (var i in Enum.GetValues(typeof(HandRankTypeZhongFB))) { HandRankTypeZhongFB t = (HandRankTypeZhongFB)i; if ((int)t == dian) { rank_type = t; break; } } } return(new BestHandZhongFB(rank_type, bestCards, bestCards)); } }