Пример #1
0
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);
    }
}
Пример #2
0
	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;
	}