#ifndef __SWINEPLAYER_HPP__ #define __SWINEPLAYER_HPP__ #include #include "swine.hpp" #include "diceroll.hpp" namespace cs427_527 { class CategoryStrategy { public: virtual ~CategoryStrategy(); virtual int chooseCategory(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s) = 0; }; class RollStrategy { public: virtual ~RollStrategy(); virtual bool rollAgain(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s, int cat, int sub) = 0; }; class ISwinePlayer { public: virtual ~ISwinePlayer(); virtual int chooseCategory(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s) = 0; virtual bool rollAgain(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s, int cat, int sub) = 0; }; class SwinePlayer : public ISwinePlayer { public: SwinePlayer(std::shared_ptr c, std::shared_ptr r); int chooseCategory(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s); bool rollAgain(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s, int cat, int sub); private: std::shared_ptr catStrat; std::shared_ptr rollStrat; }; class GreedyCategoryStrategy : public CategoryStrategy { public: virtual int chooseCategory(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s) override; }; class GreedyProgressCategoryStrategy : public CategoryStrategy { public: virtual int chooseCategory(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s) override; }; class DynamicLimitRollStrategy : public RollStrategy { public: DynamicLimitRollStrategy(int l, int d); virtual bool rollAgain(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s, int cat, int sub) override; private: int limit; int denom; }; class FixedLimitRollStrategy : public RollStrategy { public: FixedLimitRollStrategy(int l); virtual bool rollAgain(const SwineGame& g, const DiceRoll& r, const SwineScoresheet& s, int cat, int sub) override; private: int limit; }; } #endif