//Board.java

/** 
 *
 * @author  Sean Bridges
 * @version  1.0
 * 
 *  The board interface represents the theater in which moves are made 
 *  and evaluated.  You can make and unmake moves on a board, you can
 *  ask for the list of moves that are currently allowed, and you can 
 *  ask if the game has been won.
 *  You can ask a board for its statistics object to evaluate the score
 *  and how each player is doing.
 * 
 *  A board must be cloneable because a clone of a board is given to players
 *  when we ask them to move, rather than the board itself.  
 *  
 *  Threading issue.  Note that the board's .move(..) method will be called 
 *  in a seperate thread.  It is possible that the GameMaster() may call
 *  .startGame() .stopGame() or .restartGame() from another thread while the
 *  the game loop is in .move() or vice versa.  
 *  If you synchronize all these methods you should be fine.  
 *
 */

import java.io.*;

public interface Board extends Cloneable {

	/** 
 	 * Return an object which can be interrogated to discover the current
	 * state of the game
	 */
	public BoardStats getBoardStats();
  
 	/** 
     * Try and make a move.
	 * Returns wether or not the move attempt was successful.
	 */
	public boolean move(Move m);
  
  
	/**
	 * Undo the last move made.
	 */
	public void undoLastMove();
  
  
	/** 
	 * Get the list of moves that are possible for the given 
	 * player
	 */
	public Move[] getPossibleMoves(Player aPlayer);

	/**
	 * Whether or not the game is over.
	 */
	public boolean isGameOver();


	/**
	 * Called by the game master when the game is started.
	 */
	public void gameStarted();

	/**
	 * Called by the game master when the game is restarted.
	 */
	public void gameRestarted();

	/**
	 * Called by the game master when the game is stopped.
	 */
	public void gameStoped();

	/**
	 * A board must be cloneable since a copy of it is sent
	 * to players when we ask them for their move.
	 */
	public Object clone();
  
}
