File indexing completed on 2025-02-23 05:14:54

0001 // bjgc_playertable.cpp                                               -*-C++-*-
0002 #include <bjgc_playertable.h>
0003 
0004 #include <iomanip>
0005 #include <ostream>
0006 
0007 // STATIC HELPER FUNCTIONS
0008 static void printPlayerColumnLines(std::ostream& stream)
0009 {
0010     stream << "____ "; // card column
0011 
0012     for (int i = 1; i <= bjgc::PlayerTable::k_NUM_CARD_VALUES; ++i) {
0013         stream << "______ ";
0014     }
0015 
0016     stream << '\n';
0017 }
0018 
0019 namespace bjgc {
0020 
0021 // -----------------
0022 // class PlayerTable
0023 // -----------------
0024 
0025 // MANIPULATORS
0026 void PlayerTable::clearRow(int hand)
0027 {
0028     assert(0 <= hand);
0029     assert(hand < bjgb::State::k_NUM_STATES);
0030 
0031     for (int i = 1; i <= k_NUM_CARD_VALUES; ++i) {
0032         exp(hand, i) = 0.0;
0033     }
0034 }
0035 
0036 void PlayerTable::reset()
0037 {
0038     for (int j = 0; j < bjgb::State::k_NUM_STATES; ++j) {
0039         for (int i = 1; i <= k_NUM_CARD_VALUES; ++i) {
0040             exp(j, i) = -9e97;
0041         }
0042     }
0043 }
0044 
0045 void PlayerTable::setRow(int hand, bjgb::Types::Double value)
0046 {
0047     assert(0 <= hand);
0048     assert(hand < bjgb::State::k_NUM_STATES);
0049 
0050     for (int i = 1; i <= k_NUM_CARD_VALUES; ++i) {
0051         exp(hand, i) = value;
0052     }
0053 }
0054 
0055 } // namespace bjgc
0056 
0057 // FREE OPERATORS
0058 std::ostream& bjgc::operator<<(std::ostream& stream, const PlayerTable& table)
0059 {
0060     const int k_COL_WID = 6; // change long underline to match
0061 
0062     const int oldPrecision = stream.precision();
0063 
0064     stream << std::setprecision(4);
0065 
0066     //         ======_
0067     stream << "CARD "
0068               "  ACE  "
0069               "   2   "
0070               "   3   "
0071               "   4   "
0072               "   5   "
0073               "   6   "
0074               "   7   "
0075               "   8   "
0076               "   9   "
0077               "  TEN  "
0078               "\n";
0079 
0080     printPlayerColumnLines(stream);
0081 
0082     for (int j = bjgb::State::k_NUM_STATES - 1; j >= 0; --j) {
0083         stream << ' ' << std::setw(2) << bjgb::State::stateId2String(j) << ": ";
0084 
0085         for (int i = 1; i <= PlayerTable::k_NUM_CARD_VALUES; ++i) {
0086             stream << std::setw(k_COL_WID) << 100 * table.exp(j, i) << ' ';
0087         }
0088 
0089         stream << '\n';
0090 
0091         if (bjgb::State::e_HZR == j || bjgb::State::hard(2) == j || bjgb::State::pair(1) == j) {
0092             printPlayerColumnLines(stream);
0093         }
0094     }
0095 
0096     printPlayerColumnLines(stream);
0097 
0098     stream.precision(oldPrecision);
0099 
0100     return stream;
0101 }