Example #1
0
int IsFlush( PHAND pHand, PCARD pWild )
{
	HandIterator iter = pHand->Deck->_HandIterator;	
	int number = 0, val, match = 0;
	PCARD card, start = GetCardStackFromHand( pHand, WIDE("Cards") )->cards;
	for( start = iter( pHand, 0, ITERATE_START );
		  start && ( match < 5 );
		  start = iter( pHand, 0, ITERATE_NEXT ) )
	{
		match = 0;
		number = 0;
		for( card = iter( pHand, 1, ITERATE_AT(0) );
			 match < 5 && card;
			  card = iter( pHand, 1, ITERATE_NEXT ) )
			if( !IsWild( card, pWild ) ) // if it's wild we don't care.
			{
				if( !number )
				{
					number = CARD_SUIT( card->id ) + 1;
					match++;
				}
				// if this number is not the number we're matching, is not 5 kind
				else if( number == ( CARD_SUIT( card->id ) + 1 ) )
					match++;
			}
			else
				match++;
	}
	if( match == 5)
	{
		val = HighCard( pHand, pWild );
		return 0x500000 + val;
	}
	return 0;
}
Example #2
0
/**
 * @brief Check if the played card is ok.
 * @param card The played card.
 * @param seat The players seat.
 * @param cards The cards.
 * @return true if ok else false.
 */
bool CPlayHistory::cardOk(int card, Seat seat, int cards[])
{
    int i, j;
    int noPlayed, noRemaining;
    int cardsPlayed[13];
    int cardsRemaining[13];

    //Check card is allowed.
    for (i = 0; i < 13; i++)
        if (card == cards[i])
            break;
    if (i == 13)
        return false;

    noPlayed = getPlayed(seat, cardsPlayed);
    for (i = 0; i < noPlayed; i++)
        if (card == cardsPlayed[i])
            break;
    if (i < noPlayed)
        return false;

    //Leader can play whatever he wants.
    if (currentLeader == seat)
        return true;

    int leaderCard = play[currentLeader][noTrick];

    //Leader must be the first to play.
    if (leaderCard == -1)
        return false;

    Suit leaderSuit = CARD_SUIT(leaderCard);
    Suit playSuit = CARD_SUIT(card);
    if ( playSuit == leaderSuit)
        return true;

    for (i = 0, j = 0; i < 13; i++)
    {
        int card = cards[i];
        bool found = false;
        for (int m = 0; m < noPlayed; m++)
            found = found || (card == cardsPlayed[m]);
        if (!found)
            cardsRemaining[j++] = card;
    }
    noRemaining = 13 - noPlayed;

    //Check consistency.
    if (j != noRemaining)
        return false;

    //Player must follow suit.
    for (i = 0; i < noRemaining; i++)
        if (leaderSuit == CARD_SUIT(cardsRemaining[i]))
            return false;

    return true;
}
Example #3
0
/**
 * @brief Determine the next leader and update play stack.
 * @return The next leader.
 */
Seat CPlayHistory::getNextLeader()
{
    Seat nextLeader = NO_SEAT;
    int faceNextLeader = -1;

    if (trumpSuit != NOTRUMP)
    {
        for (int player = 0; player < 4; player++)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == trumpSuit) && (facePlayer > faceNextLeader))
            {
                nextLeader = (Seat)player;
                faceNextLeader = facePlayer;
            }
        }
    }
    if (faceNextLeader == -1)
    {
        Suit suitNextLeader = CARD_SUIT(play[currentLeader][noTrick]);

        for (int player = 0; player < 4; player++)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == suitNextLeader) && (facePlayer > faceNextLeader))
            {
                nextLeader = (Seat)player;
                faceNextLeader = facePlayer;
            }
        }
    }

    if ((nextLeader == WEST_SEAT) || (nextLeader == EAST_SEAT))
        ewTricks++;
    else if ((nextLeader == NORTH_SEAT) || (nextLeader == SOUTH_SEAT))
        nsTricks++;

    currentLeader = nextLeader;

    playStack[noTrick].ewTricks = ewTricks;
    playStack[noTrick].nsTricks = nsTricks;
    playStack[noTrick].nextLeader = nextLeader;
    noTrick++;

    return nextLeader;
}
Example #4
0
void CPlayHistory::getNoPlayed(Seat seat, Suit suit, int *noOwn, int *noOpp)
{
    *noOwn = *noOpp = 0;
    for (int i = 0; i < 13; i++)
    {
        if (CARD_SUIT(play[seat][i]) == suit)
            (*noOwn)++;
        if (CARD_SUIT(play[(seat + 1) & 3][i]) == suit)
            (*noOpp)++;
        if (CARD_SUIT(play[(seat + 2) & 3][i]) == suit)
            (*noOwn)++;
        if (CARD_SUIT(play[(seat + 3) & 3][i]) == suit)
            (*noOpp)++;
    }
}
Example #5
0
bool CPlayHistory::isFirstTimeSuitPlayed(Suit suit)
{
    for (int i = 0; i < noTrick; i++)
    for (int j = 0; j < 4; j++)
    if (CARD_SUIT(play[j][i]) == suit)
        return false;

    return true;
}
Example #6
0
/**
 * @brief Can the card given take the next trick?
 * @param card The card in question.
 * @return true if the card can take the trick, false otherwise.
 */
bool CPlayHistory::takeTrick(int card)
{
    int faceNextLeader = -1;

    Suit suitCard = CARD_SUIT(card);
    int faceCard = CARD_FACE(card);

    if (trumpSuit != NOTRUMP)
    {
        for (int player = 0; player < 4; player++)
        if (play[player][noTrick] != -1)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == trumpSuit) && (facePlayer > faceNextLeader))
                faceNextLeader = facePlayer;
        }
        if ((suitCard == trumpSuit) && (faceCard > faceNextLeader))
            return true;
    }
    if (faceNextLeader == -1)
    {
        if (play[currentLeader][noTrick] == -1)
            return true;

        Suit suitNextLeader = CARD_SUIT(play[currentLeader][noTrick]);

        for (int player = 0; player < 4; player++)
        if (play[player][noTrick] != -1)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == suitNextLeader) && (facePlayer > faceNextLeader))
                faceNextLeader = facePlayer;
        }
        if ((suitCard == suitNextLeader) && (faceCard > faceNextLeader))
            return true;
    }

    return false;
}
Example #7
0
/**
 * @brief Determine leader till now (not all card has been played).
 * @return The leader untill now.
 */
Seat CPlayHistory::getLeader()
{
    Seat leader = NO_SEAT;
    int faceLeader = -1;

    if (trumpSuit != NOTRUMP)
    {
        for (int player = 0; player < 4; player++)
        if (play[player][noTrick] != -1)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == trumpSuit) && (facePlayer > faceLeader))
            {
                leader = (Seat)player;
                faceLeader = facePlayer;
            }
        }
    }
    if (faceLeader == -1)
    {
        if (play[currentLeader][noTrick] == -1)
            return currentLeader;

        Suit suitLeader = CARD_SUIT(play[currentLeader][noTrick]);

        for (int player = 0; player < 4; player++)
        if (play[player][noTrick] != -1)
        {
            int cardPlayer = play[player][noTrick];
            Suit suitPlayer = CARD_SUIT(cardPlayer);
            int facePlayer = CARD_FACE(cardPlayer);
            if ((suitPlayer == suitLeader) && (facePlayer > faceLeader))
            {
                leader = (Seat)player;
                faceLeader = facePlayer;
            }
        }
    }
    return leader;
}