#include #include #include #include using namespace std; class Score_Type { public: virtual int score(vector const &) const = 0; virtual string name() const = 0; virtual ~Score_Type() = default; protected: Score_Type() = default; private: Score_Type(Score_Type const &) = delete; Score_Type & operator=(Score_Type const &) = delete; }; class Digit: public Score_Type { public: int score(vector const & dice) const override { int score {}; for ( auto die : dice ) { if ( die == value ) score += die; } return score; } protected: Digit(int lookfor): value{lookfor} {} private: int value; }; class Fives : public Digit { public: Fives(): Digit{5} {} string name() const override { return "Ones"; } }; class Sixes : public Digit { public: Sixes(): Digit{6} {} string name() const override { return "Twos"; } }; class Three_Of_A_Kind : public Score_Type { public: int score(vector const & dice) const override { for (int i{6}; i >= 1; --i) { if ( count( dice.cbegin(), dice.cend(), i ) >= 3 ) return i*3; } return 0; } string name() const override { return "Three_Of_A_Kind"; } }; int main() { cout << "Enter 5 integers: "; vector dice(5); for ( int& i : dice ) cin >> i; vector possible { new Fives{}, new Sixes{}, new Three_Of_A_Kind{} }; for ( auto score : possible ) { auto points = score->score(dice); cout << points << "p " << score->name() << endl; } for ( auto score : possible ) { delete score; } return 0; }