virtual void turnCrank() {
     std::cout << "You turned..." << std::endl;
     int winner = rand() % 5;	// randomWinner->nextInt(10);
     if ((winner == 0) && (gumballMachine->getCount() > 1)) {
         gumballMachine->setState(gumballMachine->getWinnerState());
     } else {
         gumballMachine->setState(gumballMachine->getSoldState());
     }
 }
    void dispense() {
        std::cout << "YOU'RE A WINNER! You get two gumballs for your quarter" << std::endl;
        _gumballMachine->releaseBall();

        if (_gumballMachine->getCount() == 0) {
            _gumballMachine->setState(_gumballMachine->getSoldOutState());
        } else {
            _gumballMachine->releaseBall();

            if (_gumballMachine->getCount() > 0) {
                _gumballMachine->setState(_gumballMachine->getNoQuarterState());
            } else {
                std::cout << "Oops, out of gumballs!" << std::endl;
                _gumballMachine->setState(_gumballMachine->getSoldOutState());
            }
        }
    }
int main() {
  cout << "+++ WELCOME TO THE CIMS GUMBALL MACHINE SIMULATOR!! +++" << endl;
  cout << "------------------------------------------" << endl;

  string gb_names[NUM_GB_COLORS] = {
    "Red", "Blue", "White", "Green", "Black", "Purple", "Cyan", "Magenta", "Yellow"
  };
  GumballMachine *machine = GumballMachine::getInstance();

  cout << "You are starting with the following Gumballs:" << endl;

  for (int i = 0; i < NUM_GB_COLORS-1; i++) {
  GUMBALL gb_cast = (GUMBALL)i;
  int gb_count = machine->fill(gb_cast);
  cout << gb_count << " " << gb_names[gb_cast] << endl;
  } // end for loop

  machine->getGumballs()->push_back(YELLOW);
  cout << "...and 1 yellow" << endl;

  cout << "------------------------------------------" << endl;

  cout << "Here are your random purchases:" << endl;

  int index = (int)machine->getGumballs()->size() - 1;
  random_shuffle(machine->getGumballs()->begin(), machine->getGumballs()->end());
  GUMBALL chosen = RED; // pick an arbitrary color
  short unsigned int gb_dispensed = 0;
  vector<GUMBALL> dispensed_gumballs;
  do {
    chosen = machine->dispense(index--); // index-- since we pop one off the gumball vector each time
    dispensed_gumballs.push_back(chosen);
    cout << gb_names[chosen] << endl;
    machine->getGumballs()->pop_back();
    gb_dispensed++;
  } while (chosen != YELLOW); // end do/while
  
  cout << "------------------------------------------" << endl;
  cout << "You purchased " << gb_dispensed << " gumballs for a total of $";
  printf("%.2f\n", (float)gb_dispensed * 0.25); // printf() still gives better formatting options

  vector<GUMBALL> most_purchased = findMaxColors(dispensed_gumballs);
  cout << "Most purchased: ";
  for (int i = 0; i < (int)most_purchased.size(); i++)
    cout << gb_names[most_purchased[i]] << " ";
  cout << endl; 

  delete machine;
  return 0;
} // end main()
void main()
{
	GumballMachine *gumballMachine = new GumballMachine(5);

	cout << gumballMachine->toString() << endl;

	gumballMachine->insertQuarter();
	gumballMachine->turnCrank();

	cout << gumballMachine << endl;

	gumballMachine->insertQuarter();
	gumballMachine->turnCrank();
	gumballMachine->insertQuarter();
	gumballMachine->turnCrank();

	cout << gumballMachine->toString() << endl;

	delete gumballMachine;
}
	public: virtual void insertQuarter() {
		std::cout << "You inserted a quarter" << std::endl;
		gumballMachine->setState(gumballMachine->getHasQuarterState());
	}
 virtual void ejectQuarter() {
     std::cout << "Quarter returned" << std::endl;
     gumballMachine->setState(gumballMachine->getNoQuarterState());
 }
 void insertQuarter() const {
     std::cout << "You inserted a quarter" << std::endl;
     _gumballMachine->setState(_gumballMachine->getHasQuarterState());
 }