protected void setup() {
    String gameType = applet.getSelectedGameType();
    Logic logic = applet.getGameLogic(gameType);
    if (logic == null) {
      applet.output("You must select a game type.");
      return;
    }

    controller = new GameController(logic);

    // Find out the X Player
    String xType = applet.getXPlayChoice();

    // Find out the O Player
    String oType = applet.getOPlayChoice();

    computerGoesFirst = false;
    computerPlaysSelf = true;

    boolean setOpponentO = false;
    boolean setOpponentX = false;

    Player p;
    if (oType.equals(TicTacToeApplet.Human)) {
      // Even though this is a human player, it will be involved in
      //
      p = new MousePlayer(Player.OMARK);
      p.score(new BoardEvaluation());

      computerPlaysSelf = false;
      humanPlayer = (MousePlayer) p;
    } else {
      p = PlayerFactory.createPlayer(oType, Player.OMARK);
      if (p == null) {
        int ply = 5; // default
        try {
          ply = Integer.valueOf(applet.getOPly().getText());
        } catch (Exception _e) {

        }
        p = PlayerFactory.createPlayerWithPly(oType, Player.OMARK, ply);
        setOpponentO = true;
      }
    }
    controller.setOPlayer(p);

    if (xType.equals(TicTacToeApplet.Human)) {
      p = new MousePlayer(Player.XMARK);
      p.score(new BoardEvaluation());

      computerPlaysSelf = false;
      humanPlayer = (MousePlayer) p;
    } else {
      computerGoesFirst = true;
      p = PlayerFactory.createPlayer(xType, Player.XMARK);
      if (p == null) {
        int ply = 5; // default
        try {
          ply = Integer.valueOf(applet.getXPly().getText());
        } catch (Exception _e) {

        }
        p = PlayerFactory.createPlayerWithPly(xType, Player.XMARK, ply);
        setOpponentX = true;
      }
    }
    controller.setXPlayer(p);

    // set logic.
    ((Player) controller.getXPlayer()).logic(logic);
    ((Player) controller.getOPlayer()).logic(logic);

    // set opponents.
    if (setOpponentX) {
      ((IntelligentAgent) controller.getXPlayer()).opponent(controller.getOPlayer());
    }
    if (setOpponentO) {
      ((IntelligentAgent) controller.getOPlayer()).opponent(controller.getXPlayer());
    }
  }