/* * dice.hpp * * Created on: Sep 23, 2010 * Modified November 7, 2016 * Author: Michael J. Fischer * for use in Yale course CPSC 427a, Fall 2010 */ #pragma once #include "random.hpp" using namespace std; //============================================================================== // Dice abstract base class //------------------------------------------------------------------- class Dice { protected: int numDice; // number of dice int numSides; // number of sides per die int* die; // array of dice. Face values in range [1, numSides] int sum; // sum of faces on die public: Dice(int numDice, int numSides); virtual ~Dice(); virtual void roll() =0; // pure virtual function -- must be defined in derived class virtual ostream& print(ostream& out) const; virtual ostream& printSummary(ostream& out) const =0; int getDie(int k) const { return die[k]; } int getSum() const { return sum; } }; //============================================================================== // Random dice -- use class Random as source of "random" numbers //------------------------------------------------------------------- class RandDice: public Dice { private: unsigned seed; Random rnd; // random number generator public: RandDice(int numDice, int numSides, unsigned seed); ~RandDice() { } void roll(); ostream& print(ostream& out) const; ostream& printSummary(ostream& out) const; }; //============================================================================== // File dice -- use file as source of "random" numbers //------------------------------------------------------------------- class FileDice: public Dice { private: const char* fileName; ifstream in; public: FileDice(int numDice, int numSides, const char* fileName); ~FileDice(); void roll(); ostream& print(ostream& out) const; ostream& printSummary(ostream& out) const; }; //------------------------------------------------------------------- inline ostream& operator<<(ostream& out, const Dice& dice) { return dice.print(out); }