int CBot::FirstHandDiscard(CCard rgDiscarded[20]) { int iMaxValue = -999999, iSelectedHand = -1, i, iValue; int iNumTriplets = 0, iNumSingles = 0, iNumPairs = 0; AnalyzeHand(); for (i = 0; i < m_iNumHand; i++) { if (m_rgHand[i].type == DT_SINGLE && m_rgHand[i].cnt == 1) { iNumSingles++; } else if (m_rgHand[i].type == DT_DOUBLE && m_rgHand[i].cnt == 1) { iNumPairs++; } else if (m_rgHand[i].type == DT_TRIPLE) { iNumTriplets++; } } for (i = 0; i < m_iNumHand; i++) { iValue = 0; switch (m_rgHand[i].type) { case DT_SINGLE: if (m_rgHand[i].cnt > 1) { // sequence iValue = 6 * (19 - m_rgHand[i].headval) * (19 - m_rgHand[i].headval) - 80 * (iNumSingles + iNumPairs); } else { // single card iValue = 5 * (19 - m_rgHand[i].headval) * (19 - m_rgHand[i].headval) + 25 * iNumSingles; } break; case DT_DOUBLE: if (m_rgHand[i].cnt > 1) { // pair sequence iValue = 6 * (19 - m_rgHand[i].headval) * (19 - m_rgHand[i].headval) - 60 * (iNumSingles + iNumPairs); } else { // pair iValue = 5 * (19 - m_rgHand[i].headval) * (19 - m_rgHand[i].headval) + 25 * iNumPairs + 10; } break; case DT_TRIPLE: iValue = 2 * (19 - m_rgHand[i].headval) * (19 - m_rgHand[i].headval); if (iNumTriplets - iNumSingles - iNumPairs <= 2) { iValue += 850; // play triplets first if we don't have much leftovers } break; case DT_QUAD: iValue = (19 - m_rgHand[i].headval) / 2; break; case DT_DBLJOKER: default: if (m_iNumHand <= 2) { iValue = 999999; } else { iValue = 1; } break; } if (iValue > iMaxValue) { iMaxValue = iValue; iSelectedHand = i; } } assert(iSelectedHand != -1); int c = PlayHand(m_rgHand[iSelectedHand], rgDiscarded); // TODO: kicker cards return c; }
int main() { startGame(); PlayHand(); }