#include #include #include #include #include "diceroll.hpp" #include "swine.hpp" #include "swineplayer.hpp" #include "factory.hpp" using std::cout; using std::endl; using std::string; using std::shared_ptr; using std::make_shared; using cs427_527::SwineGame; using cs427_527::SwineScoresheet; using cs427_527::DiceRoll; using cs427_527::ISwinePlayer; using cs427_527::SwinePlayer; using cs427_527::CategoryStrategy; using cs427_527::GreedyCategoryStrategy; using cs427_527::GreedyProgressCategoryStrategy; using cs427_527::RollStrategy; using cs427_527::FixedLimitRollStrategy; using cs427_527::DynamicLimitRollStrategy; using cs427_527::PlayerFactory; using cs427_527::BasicPlayerFactory; using cs427_527::AdaptivePlayerFactory; int main(int argc, char **argv) { std::srand(std::time(0)); const int NUM_GAMES = 1000; SwineGame game{25}; shared_ptr f; if (argc > 1 && string{"-basic"} == argv[1]) { f = make_shared(); } else { f = make_shared(); } shared_ptr p; if (argc > 2 && string{"-conservative"} == argv[2]) { p = f->makeConservativePlayer(); } else if (argc > 2 && string{"-aggressive"} == argv[2]) { p = f->makeAggressivePlayer(); } else { p = f->makeNormalPlayer(); } int grandTotal = 0; for (int i = 0; i < NUM_GAMES; i++) { SwineScoresheet sheet = game.blankSheet(); int turns = 0; while (!sheet.isFinished()) { turns++; DiceRoll roll; cout << "ROLL: " << roll << endl; int cat = p->chooseCategory(game, roll, sheet); cout << "CHOOSING: " << cat << endl; int turnTotal = game.categoryScore(roll, cat); do { roll.reroll(); cout << "ROLL: " << roll << endl; int rollScore = game.categoryScore(roll, cat); if (rollScore == 0) { turnTotal = 0; } else { turnTotal += rollScore; } } while (turnTotal > 0 && p->rollAgain(game, roll, sheet, cat, turnTotal)); sheet.update(cat, turnTotal); cout << sheet << endl << endl; } grandTotal += turns; } std::cout << (double)grandTotal / NUM_GAMES << std::endl; return 0; }