GameModel.java
Created with JBuilder
package model;

import GameIO.*;
import java.awt.Point;
import java.util.*;
import model.board.*;

/**
 * A concrete model of a game.  For descriptions of the methods, see the IModel,
 * IModelAdmin, and IModelCombo interface documentation.
 * Except for the setPlayers() and getPlayers() methods, see below.
 */
public final class GameModel implements IModelCombo {
    /**
    * An abstract factory to create APlayers.   Used privately by GameModel.
    */
    interface IMakePlayer {
        /**
         * Instantiates an APlayer object given the player's "player number".
         * Player number 0 plays first, player number 1 plays second.
         * @param playerNo The player number for the player to be instantiated.
         * @return An APlayer object
         */
        public APlayer create(int playerNo);
    }

    /**
     * For player management.
     */
    private TurnControl turnControl;

    /**
     * Adapter to talk to the view to display/clear a game piece ("token") or
     * a String message.
     */
    private ICommand iCommand;

    /**
     * Adapter to talk to the view to announce winner, draw, or reset.
     */
    private IViewAdmin viewAdmin;

    /**
     * Adapter to talk to the view to tell that the human player needs to try a
     * move.
     */
    private ITurnAdmin turnAdmin;

    /**
     * The invariant, encapsulated rules and behaviors of a game.
     */
    private IBoardModel boardModel;

    /**
    * The constructor for the game model.
    * @param nRows The number of rows in the board.
    * @param nCols The number of columns in the board.
    */
    public GameModel(int nRows, int nCols) {
        boardModel = new TicTacToeBoard(nRows,nCols, this);
        // boardModel = new OthelloBoard(nRows, nCols);
    }

    public GameModel(IBoardModel boardModel) {
        this.boardModel = boardModel;
    }

    /**
     * The facade that does "everything"!
     * Use anonymous inner class to have access to everything in the outer object.
     */
    private IRequestor requestor ; // = ???  FOR STUDENTS TO FILL OUT .

    /**
    * @param command
    */
    public void setCommand(ICommand command) {
        iCommand = command;
    }

    public void reset() {
        System.out.println("Resetting");
        boardModel.reset();
        boardModel.redrawAll(iCommand);
        if(turnControl != null) {
            turnControl.setHalt();
    }

    /**
    * Assumes that the players are IMakePlayer factory objects.
    * @param player0 an IMakePlayer factory
    * @param player1 an IMakePlayer factory
    */
    public void setPlayers(Object player0, Object player1) {
        // Last in/first play
        turnControl = new TurnControl(((IMakePlayer) player1).create(1));
        turnControl.addPlayer(((IMakePlayer) player0).create(0));
        turnControl.run();
    }

    public void setViewAdmin(IViewAdmin viewAdmin, ITurnAdmin turnAdmin) {
        this.viewAdmin = viewAdmin;
        this.turnAdmin = turnAdmin;
    }

    public IBoardModel getBoardModel() {
        return boardModel;
    }


    /**
    * Returns a Vector filled with IMakePlayer factory objects.
    * @return
    */
    public Vector getPlayers() {
        Vector v = new Vector();
        v.addElement(new IMakePlayer() {
            public APlayer create(int playerNo) {
                return new HumanPlayer(requestor, playerNo, turnAdmin);
            }
            public String toString() {
                return "Human player";
            }
        });

        // ADD COMPUTER PLAYER WITH RANDOM MOVE STRATEGY IN MILESTONE 1.
        // ADD COMPUTER PLAYER WITH OTHER NEXT MOVE STRATEGY IN MILESTONE 2.

        return v;
    }

    public void exit() {
        reset();
    }

/*
    public void skipNextPlayer(boolean isSkip) {
        turnControl.setSkipPlayer(isSkip);
    }
*/
}


GameModel.java
Created with JBuilder