TicTacMain.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// Modified from the original Weiss version by S. Wong on 11/2/05 to
// be a JFrame instead of a Frame and to be compatible with being run
// from an applet.
//public class TicTacMain extends Frame implements WindowListener, ActionListener
public class TicTacMain extends JFrame implements ActionListener
{
// Initialize the board; wait for buttons to be clicked
public void init( )
{
setLayout( new GridLayout( 3, 3 ) );
for( int i = 0; i < 3; i++ )
for( int j = 0; j < 3; j++ )
{
squares[ i ][ j ] = new Button( );
add( squares[ i ][ j ] );
squares[ i ][ j ].addActionListener( this );
}
//addWindowListener( this );
resetBoard( );
}
// Trivial constructor
// closeOp parameter added by S. Wong
public TicTacMain(int closeOp )
{
init();
setDefaultCloseOperation(closeOp); // added by S. Wong
pack(); // moved from main() by S. Wong
setVisible(true); // moved from main() by S. Wong
}
// Clear the internal board by constructing a new instance
// of TicTacToe. Then clear the buttons' labels.
public void resetBoard( )
{
t = new TicTacToe( );
for( int i = 0; i < 3; i++ )
for( int j = 0; j < 3; j++ )
{
squares[ i ][ j ].setLabel( "" );
squares[ i ][ j ].setEnabled( true );
}
}
private int gameNum = 0;
// Select a move for the computer.
// If computer moves first, thinkAboutIt will be false,
// and computer's move is picked by viewing gameNum.
// This allows testing of the program.
public void doCompMove( boolean thinkAboutIt )
{
Best compMove;
if( thinkAboutIt )
compMove = t.chooseMove( TicTacToe.COMPUTER );
else
{
compMove = new Best( 0, gameNum % 3, gameNum / 3 );
gameNum = ( gameNum + 1 ) % 9;
}
System.out.println( " ROW = " + compMove.row +
" COL = " + compMove.column );
squares[ compMove.row ][ compMove.column ].setLabel( computerSide );
squares[ compMove.row ][ compMove.column ].setEnabled( false );
t.playMove( TicTacToe.COMPUTER, compMove.row, compMove.column );
}
// If game is over, restart a new game, changing sides.
public boolean resetIfDone( boolean condition, String message, boolean compMoves )
{
if( condition )
{
System.out.println( message );
System.out.println( "Restarting..." );
resetBoard( );
if( compMoves )
{
System.out.println( "I go first..." );
computerSide = "X";
humanSide = "O";
doCompMove( false );
}
else
{
humanSide = "X";
computerSide = "O";
System.out.println( "You go first..." );
}
}
return condition;
}
// Implement the WindowListener interface.
// public void windowClosing( WindowEvent event )
// {
// System.exit( 0 );
// }
//
// public void windowClosed( WindowEvent event )
// { }
//
// public void windowDeiconified( WindowEvent event )
// { }
//
// public void windowIconified( WindowEvent event )
// { }
//
// public void windowActivated( WindowEvent event )
// { }
//
// public void windowDeactivated( WindowEvent event )
// { }
//
// public void windowOpened( WindowEvent event )
// { }
// Handle the button click.
// Note that the move must be legal, since illegal
// moves have had their button's clicking disabled.
public void actionPerformed( ActionEvent evt )
{
if( evt.getSource( ) instanceof Button )
{
( (Button)evt.getSource( ) ).setLabel( humanSide );
( (Button)evt.getSource( ) ).setEnabled( false );
for( int i = 0; i < 3; i++ )
for( int j = 0; j < 3; j++ )
if( evt.getSource( ) == squares[ i ][ j ] )
t.playMove( TicTacToe.HUMAN, i, j );
if( resetIfDone( t.boardIsFull( ), "DRAW", true ) )
return;
doCompMove( true );
resetIfDone( t.isAWin( TicTacToe.COMPUTER ), "I WIN!!", true );
resetIfDone( t.boardIsFull( ), "DRAW", false );
return;
}
}
// Simple main; setup a board and go
public static void main( String [ ] args )
{
Frame f = new TicTacMain( JFrame.EXIT_ON_CLOSE);
}
private Button [ ][ ] squares = new Button[ 3 ][ 3 ];
private TicTacToe t;
private String computerSide = "O";
private String humanSide = "X";
}