// AsynchronousPlayer.java
 

/** 
 * @author  Sean Bridges
 * @version 1.0.1
 *
 * The asynchronous player blocks the getMove call until
 * its makeMove() method is called.  Can support multiple
 * threads waiting.  They are all woken up when makeMove is called.
 *
 * Currently you cannot tell when the asynchronous player
 * has a thread waiting for moves.  The class is designed mostly
 * to interact with UI's that produce a sequence of moves
 * in response to user inputs, such as a mouse click, and dont care
 * about the current state of the game.
 */

public class AsynchronousPlayer extends DefaultPlayer
{
  
//------------------------------------------
    //instance variables
    
    private Move lastMove = null;

  
    /** Creates new AsynchronousPlayer */
    public AsynchronousPlayer(String name, int number) 
    {
        super(name, number);
    }
    
    /*
     * Passed a copy of the board, asked what move it would like to make.
     * This call will block until makeMove(aMove) is called, at which time
     * aMove will be returned.
     *
    */
    public synchronized  Move getMove(Board b)
    {
        try
        {
            wait();
        }
        //if we are interrupted, then it means the game
        //is over, and we no one cares about what we return, 
        //so return null.
        catch(InterruptedException e)
        {
            return null;
        }
     
        return lastMove;
    }
  
  
    /** 
     * Make a move.
     * If there are any threads waiting in the getMove()
     * method, wakes them up, and passes them this move.
     * If no threads waiting, then does nothing
     */
    public synchronized void makeMove(Move aMove)
    {
        lastMove = aMove;
        notifyAll();
    }
 
}//end class AsynchronousPlayer