void Checker::parse(ManagerBase* m, std::vector<Card>& src, CardContainer& res) { std::sort(src.begin(), src.end(), CardSortCmp(m)); res.clear(); CardUnit single; single.mask.set(CardMask::Single); std::vector<CardUnit> pairUnit; Card pre; for (auto& i : src) { if (pre == i) { pairUnit.push_back({CardMask::Pair|CardMask(m, i),{i, i}}); pre.set(Card::Null); } else { if (pre.value() != Card::Null) { single.mask.merge(CardMask(m, pre)); single.cards.push_back(pre); } pre = i; } } if (pre.value() != Card::Null) { single.mask.merge(CardMask(m, pre)); single.cards.push_back(pre); } if (!pairUnit.empty()) { size_t i = 0; for (size_t j = 1; j < pairUnit.size(); ++j) { if (canConcat(m, pairUnit[i].cards.back(), pairUnit[j].cards[0])) { pairUnit[i].cards.insert(pairUnit[i].cards.end(), pairUnit[j].cards.begin(), pairUnit[j].cards.end()); } else { res.put(pairUnit[i]); i = j; } } res.put(pairUnit[i]); if (res.size() > 1 && pairUnit.size() > 2) { res.sort([](const CardUnit& u1, const CardUnit& u2) { return u1.cards.size() > u2.cards.size(); }); } } if (!single.cards.empty()) { res.put(single); } }
bool TrickUtility::checkCardVaild( Card const cards[] , int numCard , int index[] , int num , TrickInfo& info ) { if ( num > numCard ) return false; for( int i = 0 ; i < num ; ++i ) { if ( index[i] >= numCard ) return false; for( int j = i + 1 ; j < num ; ++j ) { if ( index[i] == index[j] ) return false; } } switch( num ) { case 1: { Card const& c = cards[ index[0] ]; info.group = CG_SINGLE; info.card[0] = cards[ index[0] ]; return true; } break; case 2: { Card const& c0 = cards[ index[0] ]; Card const& c1 = cards[ index[1] ]; if ( c0.getFaceRank() != c1.getFaceRank() ) return false; info.group = CG_ONE_PAIR; for ( int i = 0 ; i < 2 ; ++i ) info.card[i] = cards[ index[i] ]; std::sort( info.card , info.card + 2 , CardSortCmp() ); return true; } break; case 3: if ( SupportThreeOfKind ) { Card const& c0 = cards[ index[0] ]; Card const& c1 = cards[ index[1] ]; Card const& c2 = cards[ index[2] ]; if ( c0.getFaceRank() != c1.getFaceRank() || c0.getFaceRank() != c2.getFaceRank() ) return false; for ( int i = 0 ; i < 3 ; ++i ) info.card[i] = cards[ index[i] ]; std::sort( info.card , info.card + 3 , CardSortCmp() ); return true; } break; case 5: { for( int i = 0 ; i < 5 ; ++i ) info.card[i] = cards[ index[i] ]; std::sort( info.card , info.card + 5 , CardSortCmp() ); if( checkCardVaild5( info ) ) return true; } break; } return false; }