/* * dice.hpp * * Created on: Sep 23, 2010 * Author: Michael J. Fischer * for use in Yale course CPSC 427a, Fall 2010 */ #pragma once #include "random.hpp" using namespace std; // 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; } }; //------------------------------------------------------------------- class RandDice: public Dice { private: unsigned seed; Random rnd; // random number generator public: RandDice(int numDice, int numSides, unsigned seed); ~RandDice() { } inline void roll(); ostream& print(ostream& out) const; ostream& printSummary(ostream& out) const; }; inline void RandDice::roll() { sum = 0; for (int k = 0; k < numDice; k++) { die[k] = rnd.gen() + 1; sum += die[k]; } } //------------------------------------------------------------------- class FileDice: public Dice { private: const char* fileName; ifstream in; public: FileDice(int numDice, int numSides, const char* fileName); ~FileDice(); inline void roll(); ostream& print(ostream& out) const; ostream& printSummary(ostream& out) const; }; inline void FileDice::roll() { sum = 0; int k; for (k = 0; k < numDice; k++) { in >> die[k]; sum += die[k]; if (!in.good()) break; } if (k < numDice || in.fail() || in.bad()) fatal("No more dice rolls possible"); } //------------------------------------------------------------------- inline ostream& operator<<(ostream& out, const Dice& dice) { return dice.print(out); }