Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Modify the TicTacToeServer class to test for a win, loss or draw after each move

ID: 3717386 • Letter: M

Question

Modify the TicTacToeServer class to test for a win, loss or draw after each move. Send
a message to each client that indicates the result of the game when the game is over.

// Server side of client/server Tic-Tac-Toe program.
import java.awt.BorderLayout;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.util.Formatter;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TicTacToeServer extends JFrame
{
private String[] board = new String[ 9 ]; // tic-tac-toe board
private JTextArea outputArea; // for outputting moves
private Player[] players; // array of Players
private ServerSocket server; // server socket to connect with clients
private int currentPlayer; // keeps track of player with current move
private final static int PLAYER_X = 0; // constant for first player
private final static int PLAYER_O = 1; // constant for second player
private final static String[] MARKS = { "X", "O" }; // array of marks
private ExecutorService runGame; // will run players
private Lock gameLock; // to lock game for synchronization
private Condition otherPlayerConnected; // to wait for other player
private Condition otherPlayerTurn; // to wait for other player's turn

// set up tic-tac-toe server and GUI that displays messages
public TicTacToeServer()
{
super( "Tic-Tac-Toe Server" ); // set title of window

// create ExecutorService with a thread for each player
runGame = Executors.newFixedThreadPool( 2 );
gameLock = new ReentrantLock(); // create lock for game

// condition variable for both players being connected
otherPlayerConnected = gameLock.newCondition();

// condition variable for the other player's turn
otherPlayerTurn = gameLock.newCondition();   

for ( int i = 0; i < 9; i++ )
board[ i ] = new String( "" ); // create tic-tac-toe board
players = new Player[ 2 ]; // create array of players
currentPlayer = PLAYER_X; // set current player to first player

try
{
server = new ServerSocket( 12345, 2 ); // set up ServerSocket
} // end try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // end catch

outputArea = new JTextArea(); // create JTextArea for output
add( outputArea, BorderLayout.CENTER );
outputArea.setText( "Server awaiting connections " );

setSize( 300, 300 ); // set size of window
setVisible( true ); // show window
} // end TicTacToeServer constructor

// wait for two connections so game can be played
public void execute()
{
// wait for each client to connect
for ( int i = 0; i < players.length; i++ )
{
try // wait for connection, create Player, start runnable
{
players[ i ] = new Player( server.accept(), i );
runGame.execute( players[ i ] ); // execute player runnable
} // end try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // end catch
} // end for

gameLock.lock(); // lock game to signal player X's thread

try
{
players[ PLAYER_X ].setSuspended( false ); // resume player X
otherPlayerConnected.signal(); // wake up player X's thread
} // end try
finally
{
gameLock.unlock(); // unlock game after signalling player X
} // end finally
} // end method execute

// display message in outputArea
private void displayMessage( final String messageToDisplay )
{
// display message from event-dispatch thread of execution
SwingUtilities.invokeLater(
new Runnable()
{
public void run() // updates outputArea
{
outputArea.append( messageToDisplay ); // add message
} // end method run
} // end inner class
); // end call to SwingUtilities.invokeLater
} // end method displayMessage

// determine if move is valid
public boolean validateAndMove( int location, int player )
{
// while not current player, must wait for turn
while ( player != currentPlayer )
{
gameLock.lock(); // lock game to wait for other player to go

try
{
otherPlayerTurn.await(); // wait for player's turn
} // end try
catch ( InterruptedException exception )
{
exception.printStackTrace();
} // end catch
finally
{
gameLock.unlock(); // unlock game after waiting
} // end finally
} // end while

// if location not occupied, make move
if ( !isOccupied( location ) )
{
board[ location ] = MARKS[ currentPlayer ]; // set move on board
currentPlayer = ( currentPlayer + 1 ) % 2; // change player

// let new current player know that move occurred
players[ currentPlayer ].otherPlayerMoved( location );

gameLock.lock(); // lock game to signal other player to go

try
{
otherPlayerTurn.signal(); // signal other player to continue
} // end try
finally
{
gameLock.unlock(); // unlock game after signaling
} // end finally

return true; // notify player that move was valid
} // end if
else // move was not valid
return false; // notify player that move was invalid
} // end method validateAndMove

// determine whether location is occupied
public boolean isOccupied( int location )
{
if ( board[ location ].equals( MARKS[ PLAYER_X ] ) ||
board [ location ].equals( MARKS[ PLAYER_O ] ) )
return true; // location is occupied
else
return false; // location is not occupied
} // end method isOccupied

// place code in this method to determine whether game over
public boolean isGameOver()
{
return false; // this is left as an exercise
} // end method isGameOver

// private inner class Player manages each Player as a runnable
private class Player implements Runnable
{
private Socket connection; // connection to client
private Scanner input; // input from client
private Formatter output; // output to client
private int playerNumber; // tracks which player this is
private String mark; // mark for this player
private boolean suspended = true; // whether thread is suspended

// set up Player thread
public Player( Socket socket, int number )
{
playerNumber = number; // store this player's number
mark = MARKS[ playerNumber ]; // specify player's mark
connection = socket; // store socket for client

try // obtain streams from Socket
{
input = new Scanner( connection.getInputStream() );
output = new Formatter( connection.getOutputStream() );
} // end try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // end catch
} // end Player constructor

// send message that other player moved
public void otherPlayerMoved( int location )
{
output.format( "Opponent moved " );
output.format( "%d ", location ); // send location of move
output.flush(); // flush output
} // end method otherPlayerMoved

// control thread's execution
public void run()
{
// send client its mark (X or O), process messages from client
try
{
displayMessage( "Player " + mark + " connected " );
output.format( "%s ", mark ); // send player's mark
output.flush(); // flush output

// if player X, wait for another player to arrive
if ( playerNumber == PLAYER_X )
{
output.format( "%s %s", "Player X connected",
"Waiting for another player " );
output.flush(); // flush output

gameLock.lock(); // lock game to wait for second player

try
{
while( suspended )
{
otherPlayerConnected.await(); // wait for player O
} // end while
} // end try
catch ( InterruptedException exception )
{
exception.printStackTrace();
} // end catch
finally
{
gameLock.unlock(); // unlock game after second player
} // end finally

// send message that other player connected
output.format( "Other player connected. Your move. " );
output.flush(); // flush output
} // end if
else
{
output.format( "Player O connected, please wait " );
output.flush(); // flush output
} // end else

// while game not over
while ( !isGameOver() )
{
int location = 0; // initialize move location

if ( input.hasNext() )
location = input.nextInt(); // get move location

// check for valid move
if ( validateAndMove( location, playerNumber ) )
{
displayMessage( " location: " + location );
output.format( "Valid move. " ); // notify client
output.flush(); // flush output
} // end if
else // move was invalid
{
output.format( "Invalid move, try again " );
output.flush(); // flush output
} // end else
} // end while
} // end try
finally
{
try
{
connection.close(); // close connection to client
} // end try
catch ( IOException ioException )
{
ioException.printStackTrace();
System.exit( 1 );
} // end catch
} // end finally
} // end method run

// set whether or not thread is suspended
public void setSuspended( boolean status )
{
suspended = status; // set value of suspended
} // end method setSuspended
} // end class Player
} // end class TicTacToeServer

Explanation / Answer

Programming code :

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.*;

public class TicTacToe implements ActionListener {

final String VERSION = "1.0";

//Setting up ALL the variables

JFrame window = new JFrame("Tic-Tac-Toe " + VERSION);

JMenuBar mnuMain = new JMenuBar();

JMenuItem mnuNewGame = new JMenuItem("New Game"),

mnuInstruction = new JMenuItem("Instructions"),

mnuExit = new JMenuItem("Exit"),

mnuAbout = new JMenuItem("About");

JButton btn1v1 = new JButton("Player vs Player"),

btn1vCPU = new JButton("Player vs CPU"),

btnBack = new JButton("<--back");

JButton btnEmpty[] = new JButton[10];

JPanel pnlNewGame = new JPanel(),

pnlNorth = new JPanel(),

pnlSouth = new JPanel(),

pnlTop = new JPanel(),

pnlBottom = new JPanel(),

pnlPlayingField = new JPanel();

JLabel lblTitle = new JLabel("Tic-Tac-Toe");

JTextArea txtMessage = new JTextArea();

final int winCombo[][] = new int[][] {

{1, 2, 3}, {1, 4, 7}, {1, 5, 9},

{4, 5, 6}, {2, 5, 8}, {3, 5, 7},

{7, 8, 9}, {3, 6, 9}

/*Horizontal Wins*/ /*Vertical Wins*/ /*Diagonal Wins*/

};

final int X = 412, Y = 268, color = 190;

boolean inGame = false;

boolean win = false;

boolean btnEmptyClicked = false;

String message;

int turn = 1;

int wonNumber1 = 1, wonNumber2 = 1, wonNumber3 = 1;

public TicTacToe() { //Setting game properties and layout and sytle...

//Setting window properties:

window.setSize(X, Y);

window.setLocation(450, 260);

window.setResizable(false);

window.setLayout(new BorderLayout());

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Setting Panel layouts and properties

pnlNewGame.setLayout(new GridLayout(2, 1, 2, 10));

pnlNorth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlSouth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNorth.setBackground(new Color(color-20, color-20, color-20));

pnlSouth.setBackground(new Color(color, color, color));

pnlTop.setBackground(new Color(color, color, color));

pnlBottom.setBackground(new Color(color, color, color));

pnlTop.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlBottom.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNewGame.setBackground(Color.blue);

//Adding menu items to menu bar

mnuMain.add(mnuNewGame);

mnuMain.add(mnuInstruction);

mnuMain.add(mnuAbout);

mnuMain.add(mnuExit);//---->Menu Bar Complete

//Adding buttons to NewGame panel

pnlNewGame.add(btn1v1);

pnlNewGame.add(btn1vCPU);

//Adding Action Listener to all the Buttons and Menu Items

mnuNewGame.addActionListener(this);

mnuExit.addActionListener(this);

mnuInstruction.addActionListener(this);

mnuAbout.addActionListener(this);

btn1v1.addActionListener(this);

btn1vCPU.addActionListener(this);

btnBack.addActionListener(this);

//Setting up the playing field

pnlPlayingField.setLayout(new GridLayout(3, 3, 2, 2));

pnlPlayingField.setBackground(Color.black);

for(int i=1; i<=9; i++) {

btnEmpty[i] = new JButton();

btnEmpty[i].setBackground(new Color(220, 220, 220));

btnEmpty[i].addActionListener(this);

pnlPlayingField.add(btnEmpty[i]);

}

//Adding everything needed to pnlNorth and pnlSouth

pnlNorth.add(mnuMain);

pnlSouth.add(lblTitle);

//Adding to window and Showing window

window.add(pnlNorth, BorderLayout.NORTH);

window.add(pnlSouth, BorderLayout.CENTER);

window.setVisible(true);

}

//-------------------START OF ACTION PERFORMED CLASS-------------------------//

public void actionPerformed(ActionEvent click) {

Object source = click.getSource();

for(int i=1; i<=9; i++) {

if(source == btnEmpty[i] && turn < 10) {

btnEmptyClicked = true;

if(!(turn % 2 == 0))

btnEmpty[i].setText("X");

else

btnEmpty[i].setText("O");

btnEmpty[i].setEnabled(false);

pnlPlayingField.requestFocus();

turn++;

}

}

if(btnEmptyClicked) {

checkWin();

btnEmptyClicked = false;

}

if(source == mnuNewGame) {

clearPanelSouth();

pnlSouth.setLayout(new GridLayout(2, 1, 2, 5));

pnlTop.add(pnlNewGame);

pnlBottom.add(btnBack);

pnlSouth.add(pnlTop);

pnlSouth.add(pnlBottom);

}

else if(source == btn1v1) {

if(inGame) {

int option = JOptionPane.showConfirmDialog(null, "If you start a new game," +

"your current game will be lost..." + " " +

"Are you sure you want to continue?",

"Quit Game?" ,JOptionPane.YES_NO_OPTION);

if(option == JOptionPane.YES_OPTION) {

inGame = false;

}

}

if(!inGame) {

btnEmpty[wonNumber1].setBackground(new Color(220, 220, 220));

btnEmpty[wonNumber2].setBackground(new Color(220, 220, 220));

btnEmpty[wonNumber3].setBackground(new Color(220, 220, 220));

turn = 1;

for(int i=1; i<10; i++) {

btnEmpty[i].setText("");

btnEmpty[i].setEnabled(true);

}

win = false;

showGame();

}

}

else if(source == btn1vCPU) {

JOptionPane.showMessageDialog(null, "Coming Soon!!");

}

else if(source == mnuExit) {

int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit?",

"Exit Game" ,JOptionPane.YES_NO_OPTION);

if(option == JOptionPane.YES_OPTION)

System.exit(0);

}

else if(source == mnuInstruction || source == mnuAbout) {

clearPanelSouth();

String message = "";

txtMessage.setBackground(new Color(color, color, color));

if(source == mnuInstruction) {

message = "Instructions: " +

"Your goal is to be the first player to get 3 X's or O's in a " +

"row. (horizontally, diagonally, or vertically)";

} else {

message = "About: " +

"Title: Tic-Tac-Toe " +

"Author: Blmaster " +

"Version: " + VERSION + " ";

}

txtMessage.setEditable(false);

txtMessage.setText(message);

pnlSouth.setLayout(new GridLayout(2, 1, 2, 5));

pnlTop.add(txtMessage);

pnlBottom.add(btnBack);

pnlSouth.add(pnlTop);

pnlSouth.add(pnlBottom);

}

else if(source == btnBack) {

if(inGame)

showGame();

else {

clearPanelSouth();

pnlSouth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNorth.setVisible(true);

pnlSouth.add(lblTitle);

}

}

pnlSouth.setVisible(false);

pnlSouth.setVisible(true);

}

//-------------------END OF ACTION PERFORMED CLASS-------------------------//

/*

----------------------------------

Start of all the other methods. |

----------------------------------

*/

public void showGame() { // Shows the Playing Field

// *IMPORTANT*- Does not start out brand new (meaning just shows what it had before)

clearPanelSouth();

inGame = true;

pnlSouth.setLayout(new BorderLayout());

pnlSouth.add(pnlPlayingField, BorderLayout.CENTER);

pnlPlayingField.requestFocus();

}

public void checkWin() { // checks if there are 3 symbols in a row vertically, diagonally, or horizontally.

// then shows a message and disables buttons.

for(int i=0; i<7; i++) {

if(

!btnEmpty[winCombo[i][0]].getText().equals("") &&

btnEmpty[winCombo[i][0]].getText().equals(btnEmpty[winCombo[i][1]].getText()) &&

// if {1 == 2 && 2 == 3}

btnEmpty[winCombo[i][1]].getText().equals(btnEmpty[winCombo[i][2]].getText())

/*

The way this checks the if someone won is:

First: it checks if the btnEmpty[x] is not equal to an empty string- x being the array number

inside the multi-dementional array winCombo[checks inside each of the 7 sets][the first number]

Secong: it checks if btnEmpty[x] is equal to btnEmpty[y]- x being winCombo[each set][the first number]

y being winCombo[each set the same as x][the second number] (So basically checks if the first and

second number in each set is equal to each other)

Third: it checks if btnEmtpy[y] is eual to btnEmpty[z]- y being the same y as last time and z being

winCombo[each set as y][the third number]

Conclusion: So basically it checks if it is equal to the btnEmpty is equal to each set of numbers

*/

) {

win = true;

wonNumber1 = winCombo[i][0];

wonNumber2 = winCombo[i][1];

wonNumber3 = winCombo[i][2];

btnEmpty[wonNumber1].setBackground(Color.white);

btnEmpty[wonNumber2].setBackground(Color.white);

btnEmpty[wonNumber3].setBackground(Color.white);

break;

}

}

if(win || (!win && turn>9)) {

if(win) {

if(turn % 2 == 0)

message = "X has won!";

else

message = "O has won!";

win = false;

} else if(!win && turn>9) {

message = "Both players have tied! Better luck next time.";

}

JOptionPane.showMessageDialog(null, message);

for(int i=1; i<=9; i++) {

btnEmpty[i].setEnabled(false);

}

}

}

public void clearPanelSouth() { //Removes all the possible panels

//that pnlSouth, pnlTop, pnlBottom

//could have.

pnlSouth.remove(lblTitle);

pnlSouth.remove(pnlTop);

pnlSouth.remov Programming code :

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.*;

public class TicTacToe implements ActionListener {

final String VERSION = "1.0";

//Setting up ALL the variables

JFrame window = new JFrame("Tic-Tac-Toe " + VERSION);

JMenuBar mnuMain = new JMenuBar();

JMenuItem mnuNewGame = new JMenuItem("New Game"),

mnuInstruction = new JMenuItem("Instructions"),

mnuExit = new JMenuItem("Exit"),

mnuAbout = new JMenuItem("About");

JButton btn1v1 = new JButton("Player vs Player"),

btn1vCPU = new JButton("Player vs CPU"),

btnBack = new JButton("<--back");

JButton btnEmpty[] = new JButton[10];

JPanel pnlNewGame = new JPanel(),

pnlNorth = new JPanel(),

pnlSouth = new JPanel(),

pnlTop = new JPanel(),

pnlBottom = new JPanel(),

pnlPlayingField = new JPanel();

JLabel lblTitle = new JLabel("Tic-Tac-Toe");

JTextArea txtMessage = new JTextArea();

final int winCombo[][] = new int[][] {

{1, 2, 3}, {1, 4, 7}, {1, 5, 9},

{4, 5, 6}, {2, 5, 8}, {3, 5, 7},

{7, 8, 9}, {3, 6, 9}

/*Horizontal Wins*/ /*Vertical Wins*/ /*Diagonal Wins*/

};

final int X = 412, Y = 268, color = 190;

boolean inGame = false;

boolean win = false;

boolean btnEmptyClicked = false;

String message;

int turn = 1;

int wonNumber1 = 1, wonNumber2 = 1, wonNumber3 = 1;

public TicTacToe() { //Setting game properties and layout and sytle...

//Setting window properties:

window.setSize(X, Y);

window.setLocation(450, 260);

window.setResizable(false);

window.setLayout(new BorderLayout());

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Setting Panel layouts and properties

pnlNewGame.setLayout(new GridLayout(2, 1, 2, 10));

pnlNorth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlSouth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNorth.setBackground(new Color(color-20, color-20, color-20));

pnlSouth.setBackground(new Color(color, color, color));

pnlTop.setBackground(new Color(color, color, color));

pnlBottom.setBackground(new Color(color, color, color));

pnlTop.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlBottom.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNewGame.setBackground(Color.blue);

//Adding menu items to menu bar

mnuMain.add(mnuNewGame);

mnuMain.add(mnuInstruction);

mnuMain.add(mnuAbout);

mnuMain.add(mnuExit);//---->Menu Bar Complete

//Adding buttons to NewGame panel

pnlNewGame.add(btn1v1);

pnlNewGame.add(btn1vCPU);

//Adding Action Listener to all the Buttons and Menu Items

mnuNewGame.addActionListener(this);

mnuExit.addActionListener(this);

mnuInstruction.addActionListener(this);

mnuAbout.addActionListener(this);

btn1v1.addActionListener(this);

btn1vCPU.addActionListener(this);

btnBack.addActionListener(this);

//Setting up the playing field

pnlPlayingField.setLayout(new GridLayout(3, 3, 2, 2));

pnlPlayingField.setBackground(Color.black);

for(int i=1; i<=9; i++) {

btnEmpty[i] = new JButton();

btnEmpty[i].setBackground(new Color(220, 220, 220));

btnEmpty[i].addActionListener(this);

pnlPlayingField.add(btnEmpty[i]);

}

//Adding everything needed to pnlNorth and pnlSouth

pnlNorth.add(mnuMain);

pnlSouth.add(lblTitle);

//Adding to window and Showing window

window.add(pnlNorth, BorderLayout.NORTH);

window.add(pnlSouth, BorderLayout.CENTER);

window.setVisible(true);

}

//-------------------START OF ACTION PERFORMED CLASS-------------------------//

public void actionPerformed(ActionEvent click) {

Object source = click.getSource();

for(int i=1; i<=9; i++) {

if(source == btnEmpty[i] && turn < 10) {

btnEmptyClicked = true;

if(!(turn % 2 == 0))

btnEmpty[i].setText("X");

else

btnEmpty[i].setText("O");

btnEmpty[i].setEnabled(false);

pnlPlayingField.requestFocus();

turn++;

}

}

if(btnEmptyClicked) {

checkWin();

btnEmptyClicked = false;

}

if(source == mnuNewGame) {

clearPanelSouth();

pnlSouth.setLayout(new GridLayout(2, 1, 2, 5));

pnlTop.add(pnlNewGame);

pnlBottom.add(btnBack);

pnlSouth.add(pnlTop);

pnlSouth.add(pnlBottom);

}

else if(source == btn1v1) {

if(inGame) {

int option = JOptionPane.showConfirmDialog(null, "If you start a new game," +

"your current game will be lost..." + " " +

"Are you sure you want to continue?",

"Quit Game?" ,JOptionPane.YES_NO_OPTION);

if(option == JOptionPane.YES_OPTION) {

inGame = false;

}

}

if(!inGame) {

btnEmpty[wonNumber1].setBackground(new Color(220, 220, 220));

btnEmpty[wonNumber2].setBackground(new Color(220, 220, 220));

btnEmpty[wonNumber3].setBackground(new Color(220, 220, 220));

turn = 1;

for(int i=1; i<10; i++) {

btnEmpty[i].setText("");

btnEmpty[i].setEnabled(true);

}

win = false;

showGame();

}

}

else if(source == btn1vCPU) {

JOptionPane.showMessageDialog(null, "Coming Soon!!");

}

else if(source == mnuExit) {

int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit?",

"Exit Game" ,JOptionPane.YES_NO_OPTION);

if(option == JOptionPane.YES_OPTION)

System.exit(0);

}

else if(source == mnuInstruction || source == mnuAbout) {

clearPanelSouth();

String message = "";

txtMessage.setBackground(new Color(color, color, color));

if(source == mnuInstruction) {

message = "Instructions: " +

"Your goal is to be the first player to get 3 X's or O's in a " +

"row. (horizontally, diagonally, or vertically)";

} else {

message = "About: " +

"Title: Tic-Tac-Toe " +

"Author: Blmaster " +

"Version: " + VERSION + " ";

}

txtMessage.setEditable(false);

txtMessage.setText(message);

pnlSouth.setLayout(new GridLayout(2, 1, 2, 5));

pnlTop.add(txtMessage);

pnlBottom.add(btnBack);

pnlSouth.add(pnlTop);

pnlSouth.add(pnlBottom);

}

else if(source == btnBack) {

if(inGame)

showGame();

else {

clearPanelSouth();

pnlSouth.setLayout(new FlowLayout(FlowLayout.CENTER));

pnlNorth.setVisible(true);

pnlSouth.add(lblTitle);

}

}

pnlSouth.setVisible(false);

pnlSouth.setVisible(true);

}

//-------------------END OF ACTION PERFORMED CLASS-------------------------//

/*

----------------------------------

Start of all the other methods. |

----------------------------------

*/

public void showGame() { // Shows the Playing Field

// *IMPORTANT*- Does not start out brand new (meaning just shows what it had before)

clearPanelSouth();

inGame = true;

pnlSouth.setLayout(new BorderLayout());

pnlSouth.add(pnlPlayingField, BorderLayout.CENTER);

pnlPlayingField.requestFocus();

}

public void checkWin() { // checks if there are 3 symbols in a row vertically, diagonally, or horizontally.

// then shows a message and disables buttons.

for(int i=0; i<7; i++) {

if(

!btnEmpty[winCombo[i][0]].getText().equals("") &&

btnEmpty[winCombo[i][0]].getText().equals(btnEmpty[winCombo[i][1]].getText()) &&

// if {1 == 2 && 2 == 3}

btnEmpty[winCombo[i][1]].getText().equals(btnEmpty[winCombo[i][2]].getText())

/*

The way this checks the if someone won is:

First: it checks if the btnEmpty[x] is not equal to an empty string- x being the array number

inside the multi-dementional array winCombo[checks inside each of the 7 sets][the first number]

Secong: it checks if btnEmpty[x] is equal to btnEmpty[y]- x being winCombo[each set][the first number]

y being winCombo[each set the same as x][the second number] (So basically checks if the first and

second number in each set is equal to each other)

Third: it checks if btnEmtpy[y] is eual to btnEmpty[z]- y being the same y as last time and z being

winCombo[each set as y][the third number]

Conclusion: So basically it checks if it is equal to the btnEmpty is equal to each set of numbers

*/

) {

win = true;

wonNumber1 = winCombo[i][0];

wonNumber2 = winCombo[i][1];

wonNumber3 = winCombo[i][2];

btnEmpty[wonNumber1].setBackground(Color.white);

btnEmpty[wonNumber2].setBackground(Color.white);

btnEmpty[wonNumber3].setBackground(Color.white);

break;

}

}

if(win || (!win && turn>9)) {

if(win) {

if(turn % 2 == 0)

message = "X has won!";

else

message = "O has won!";

win = false;

} else if(!win && turn>9) {

message = "Both players have tied! Better luck next time.";

}

JOptionPane.showMessageDialog(null, message);

for(int i=1; i<=9; i++) {

btnEmpty[i].setEnabled(false);

}

}

}

public void clearPanelSouth() { //Removes all the possible panels

//that pnlSouth, pnlTop, pnlBottom

//could have.

pnlSouth.remove(lblTitle);

pnlSouth.remove(pnlTop);

pnlSouth.remove(pnlBottom);

pnlSouth.remove(pnlPlayingField);

pnlTop.remove(pnlNewGame);

pnlTop.remove(txtMessage);

pnlBottom.remove(btnBack);

}

public static void main(String[] args) {

new TicTacToe();// Calling the class construtor.

}

}

e(pnlBottom);

pnlSouth.remove(pnlPlayingField);

pnlTop.remove(pnlNewGame);

pnlTop.remove(txtMessage);

pnlBottom.remove(btnBack);

}

public static void main(String[] args) {

new TicTacToe();// Calling the class construtor.

}

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote