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; }
/** * @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; }
/** * @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; }
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)++; } }
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; }
/** * @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; }
/** * @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; }