Question: Write a class (and a client class to test it) that encapsulates a tic-tac-toe board. A tic-tac-toe board looks like a table of three rows

Write a class (and a client class to test it) that encapsulates a tic-tac-toe board. A tic-tac-toe board looks like a table of three rows and three columns partially or completely filled with the characters X and O. At any point, a cell of that table could be empty or could contain an X or an O. You should have one instance variable, a two-dimensional array of values representing the tic-tac-toe board.

This game should involve one human player vs. the computer. At the start of each game, randomly select if the computer will play X or O and who (i.e. human or computer) will make the first move.

Your default constructor should instantiate the array so that it represents an empty board.

You should include the following methods:

a method that generates a valid play by the computer and displays the board after each play.

a method that requests a valid play from the human and displays the board after each play.

a method to display the tic-tac-toe board.

a method checking if a player has won based on the contents of the board; this method takes no parameter. It returns X if the "X player" has won, O if the "O player" has won, T if the game was a tie. A player wins if he or she has placed an X (or an O) in all cells in a row, all cells in a column, or all cells in one of the diagonals.

NOTE: Be sure to display the board after each move. You must provide clear prompts for the human player to select a space on the tic-tac-toe board.

Input Validation: Verify that all moves by the human player are to a valid space on the tic-tac-toe board. An incorrect choice should not halt or terminate the game.

//Below is the Java project I have so far that needs changes based on the instructions above.

import java.util.Scanner; import java.util.Random;

public class LeavinesTicTacToe { public static Scanner sc = new Scanner(System.in);

public static void main(String[] args) { final int SIZE = 3; char[][] board = new char[SIZE][SIZE]; // game board

resetBoard(board); // initialize the board (with ' ' for all cells)

// First, welcome message and display the board. System.out.println("===== WELCOME TO THE TIC-TAC-TOE GAME!! ===== "); showBoard(board);

// Then ask the user which symbol (x or o) he/she wants to play. System.out.print(" Which symbol do you want to play, \"x\" or \"o\"? "); char userSymbol = sc.next().toLowerCase().charAt(0); char compSymbol = (userSymbol == 'x') ? 'o' : 'x';

// Also ask whether or not the user wants to go first. System.out.println(); System.out.print(" Do you want to go first (y/n);? "); char ans = sc.next().toLowerCase().charAt(0); int turn; // 0 -- the user, 1 -- the computer int remainCount = SIZE * SIZE; // empty cell count

// THE VERY FIRST MOVE. if (ans == 'y') { turn = 0; userPlay(board, userSymbol); // user puts his/her first tic } else { turn = 1; compPlay(board, compSymbol); // computer puts its first tic } // Show the board, and decrement the count of remaining cells. showBoard(board); remainCount--;

// Play the game until either one wins. boolean done = false; int winner = -1; // 0 -- the user, 1 -- the computer, -1 -- draw

while (!done && remainCount > 0) { // If there is a winner at this time, set the winner and the done flag to true. done = isGameWon(board, turn, userSymbol, compSymbol); // Did the turn won?

if (done) winner = turn; // the one who made the last move won the game else { // No winner yet. Find the next turn and play. turn = (turn + 1 ) % 2;

if (turn == 0) userPlay(board, userSymbol); else compPlay(board, compSymbol);

// Show the board after one tic, and decrement the rem count. showBoard(board); remainCount--; } }

// Winner is found. Declare the winner. if (winner == 0) System.out.println(" ** YOU WON. CONGRATULATIONS!! **"); else if (winner == 1) System.out.println(" ** YOU LOST.. Maybe next time :) **"); else System.out.println(" ** DRAW... **");

}

public static void resetBoard(char[][] brd) { for (int i = 0; i < brd.length; i++) for (int j = 0; j < brd[0].length; j++) brd[i][j] = ' '; }

public static void showBoard(char[][] brd) { int numRow = brd.length; int numCol = brd[0].length;

System.out.println();

// First write the column header System.out.print(" "); for (int i = 0; i < numCol; i++) System.out.print(i + " "); System.out.print(' ');

System.out.println(); // blank line after the header

// The write the table for (int i = 0; i < numRow; i++) { System.out.print(i + " "); for (int j = 0; j < numCol; j++) { if (j != 0) System.out.print("|"); System.out.print(" " + brd[i][j] + " "); }

System.out.println();

if (i != (numRow - 1)) { // separator line System.out.print(" "); for (int j = 0; j < numCol; j++) { if (j != 0) System.out.print("+"); System.out.print("---"); } System.out.println(); } } System.out.println(); }

public static void userPlay(char[][] brd, char usym) { System.out.print(" Enter the row and column indices: "); int rowIndex = sc.nextInt(); int colIndex = sc.nextInt();

while (brd[rowIndex][colIndex] != ' ') { System.out.print(" !! The cell is already taken. Enter the row and column indices: "); rowIndex = sc.nextInt(); colIndex = sc.nextInt(); }

brd[rowIndex][colIndex] = usym; }

public static void compPlay(char[][] brd, char csym) { // Find the first empty cell and put a tic there. for (int i = 0; i < brd.length; i++) { for (int j = 0; j < brd[0].length; j++) { if (brd[i][j] == ' ') { // empty cell brd[i][j] = csym; return; } } } }

public static boolean isGameWon(char[][] brd, int turn, char usym, char csym) { char sym; if (turn == 0) sym = usym; else sym = csym;

int i, j; boolean win = false;

// Check win by a row for (i = 0; i < brd.length && !win; i++) { for (j = 0; j < brd[0].length; j++) { if (brd[i][j] != sym) break; } if (j == brd[0].length) win = true; }

// Check win by a column for (j = 0; j < brd[0].length && !win; j++) { for (i = 0; i < brd.length; i++) { if (brd[i][j] != sym) break; } if (i == brd.length) win = true; }

// Check win by a diagonal (1) if (!win) { for (i = 0; i < brd.length; i++) { if (brd[i][i] != sym) break; } if (i == brd.length) win = true; }

// Check win by a diagonal (2) if (!win) { for (i = 0; i < brd.length; i++) { if (brd[i][brd.length - 1 - i] != sym) break; } if (i == brd.length) win = true; }

// Finally return win return win; } }

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!