//
// A GAME class.  ANy specific game should specialize this class
//  really this is just an interface definition
//
// The idea is that, to play a game, you simply instantiate a game object
// and it does it.

#ifndef GAME
#define GAME
#include <string>
#include <list>
#include "gametree"

class game {
   
 public:
  class state {
  public:
    static const int infinity = 99999;  // moved from private to public by request
    // to access this, use game::state::infinity

    // this needs to be commented out because the C++ compiler can't handle
    // specialization on return types for functions.  Your game class must still
    // implement this function.
    //virtual list<state*> nextMoves()=0; // returns a set of states representing the possible next moves
    virtual bool end()=0; // returns TRUE if this state is an end of game state
    virtual int heuristic()=0; // returns a heuristic value for the state
    virtual int whoseMove()=0; // returns the number of the player whose move is next from this state
    //      - the computer always plays as player 0.
    virtual string moveName()=0; // returns a string that describes the transition to this state from 
    // the parent state in textual form (for
    // prompting users for their move).
    state(int player) {}; // constructor creating an opening state in
    //  which player makes the first move.
    state() {};
    // also needs to be commented out, you must implement an output op.
    // friend ostream& operator<<(ostream&,state&);

  };
  
  game(){}

};

#endif

