|
|
|
@@ -19,6 +19,9 @@ |
|
|
|
* along with Libre Blackjack. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
*------------------- ------------ ---- -------- -- - - - |
|
|
|
*/ |
|
|
|
#include <iostream> |
|
|
|
#include <fstream> |
|
|
|
#include <sstream> |
|
|
|
|
|
|
|
#include "conf.h" |
|
|
|
#include "blackjack.h" |
|
|
|
@@ -26,6 +29,83 @@ |
|
|
|
|
|
|
|
|
|
|
|
Internal::Internal(Configuration &conf) { |
|
|
|
|
|
|
|
hard.resize(21); // 4--20 |
|
|
|
soft.resize(21); // 12--20 |
|
|
|
pair.resize(12); // 2--11 |
|
|
|
|
|
|
|
for (int value = 0; value < 21; value++) { |
|
|
|
hard[value].resize(12); |
|
|
|
soft[value].resize(12); |
|
|
|
if (value < 12) { |
|
|
|
pair[value].resize(12); |
|
|
|
} |
|
|
|
for (int upcard = 0; upcard < 12; upcard++) { |
|
|
|
hard[value][upcard] = Libreblackjack::PlayerActionTaken::None; |
|
|
|
soft[value][upcard] = Libreblackjack::PlayerActionTaken::None; |
|
|
|
if (value < 12) { |
|
|
|
pair[value][upcard] = Libreblackjack::PlayerActionTaken::None; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// TODO: read a default basic strategy |
|
|
|
|
|
|
|
// std::ifstream is RAII, i.e. no need to call close |
|
|
|
std::ifstream fileStream("bs.txt"); |
|
|
|
std::string line; |
|
|
|
std::string token; |
|
|
|
|
|
|
|
if (fileStream.is_open()) { |
|
|
|
while (getline(fileStream, line)) { |
|
|
|
if (line[0] == '#' || line[0] == ';' || line.empty()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
auto stream = std::istringstream(line); |
|
|
|
// TODO: check error |
|
|
|
stream >> token; |
|
|
|
|
|
|
|
int value = 0; |
|
|
|
std::vector<std::vector<Libreblackjack::PlayerActionTaken>> *strategy = nullptr; |
|
|
|
switch (token[0]) { |
|
|
|
case 'h': |
|
|
|
strategy = &hard; |
|
|
|
break; |
|
|
|
case 's': |
|
|
|
strategy = &soft; |
|
|
|
break; |
|
|
|
case 'p': |
|
|
|
strategy = &pair; |
|
|
|
if (token[1] == 'A') { |
|
|
|
value = 11; |
|
|
|
} else if (token[1] == 'T') { |
|
|
|
value = 10; |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (value == 0) { |
|
|
|
value = std::stoi(token.substr(1)); |
|
|
|
} |
|
|
|
|
|
|
|
for (int upcard = 2; upcard < 12; upcard++) { |
|
|
|
// TODO: check error |
|
|
|
stream >> token; |
|
|
|
if (token == "h") { |
|
|
|
(*strategy)[value][upcard] = Libreblackjack::PlayerActionTaken::Hit; |
|
|
|
} else if (token == "s") { |
|
|
|
(*strategy)[value][upcard] = Libreblackjack::PlayerActionTaken::Stand; |
|
|
|
} else if (token == "d") { |
|
|
|
(*strategy)[value][upcard] = Libreblackjack::PlayerActionTaken::Double; |
|
|
|
} else if (token == "y") { |
|
|
|
(*strategy)[value][upcard] = Libreblackjack::PlayerActionTaken::Split; |
|
|
|
} else if (token == "n") { |
|
|
|
(*strategy)[value][upcard] = Libreblackjack::PlayerActionTaken::None; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -46,7 +126,24 @@ int Internal::play() { |
|
|
|
break; |
|
|
|
|
|
|
|
case Libreblackjack::PlayerActionRequired::Play: |
|
|
|
actionTaken = (playerValue < 12) ? Libreblackjack::PlayerActionTaken::Hit : Libreblackjack::PlayerActionTaken::Stand; |
|
|
|
|
|
|
|
std::cout << "player " << playerValue << " dealer " << dealerValue << std::endl; |
|
|
|
|
|
|
|
// TODO: split |
|
|
|
|
|
|
|
// soft |
|
|
|
{ |
|
|
|
std::size_t value = std::abs(playerValue); |
|
|
|
std::size_t upcard = std::abs(dealerValue); |
|
|
|
actionTaken = (playerValue < 0) ? soft[value][upcard] : hard[value][upcard]; |
|
|
|
|
|
|
|
// TODO: double |
|
|
|
if (actionTaken == Libreblackjack::PlayerActionTaken::Double) { |
|
|
|
actionTaken = Libreblackjack::PlayerActionTaken::Hit; |
|
|
|
} |
|
|
|
} |
|
|
|
std::cout << (int)(actionTaken) << std::endl; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case Libreblackjack::PlayerActionRequired::None: |