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

In Java using Eclipse, I\'m suppose to write a class that encapsulates a tic tac

ID: 3794609 • Letter: I

Question

In Java using Eclipse, I'm suppose to write a class that encapsulates a tic tac toe board using two dimensional arrays. It should only involve the human player vs. the computer, and should randomly select who should use 'X' or 'O' and whether the human player or the computer should go first. Verify that all moves by the human player are to a valid space on the tic-tac-toe board, and an incorrect choice should not halt or terminate the game. Below is my Java program that is currently a work in progress. Can you help me remodify it? Thanks.

  

import java.util.Scanner;

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;
}
}

Explanation / Answer

Please see below program, I made this few years back . Please follow this and comment if you have any doubts.

import java.util.Scanner;

public class LeavinesTicTacToeNew {
   public static final int EMPTY = 0;
   public static final int CROSS = 1;
   public static final int NOUGHT = 2;

  
   public static final int PLAYING = 0;
   public static final int DRAW = 1;
   public static final int CROSS_WON = 2;
   public static final int NOUGHT_WON = 3;

  
   public static final int ROWS = 3, COLS = 3; // number of rows and columns
   public static int[][] board = new int[ROWS][COLS];
   public static int currentState; // the current state of the game
                                  
   public static int currentPlayer; // the current player (CROSS or NOUGHT)
   public static int currntRow, currentCol; // current seed's row and column

   public static Scanner in = new Scanner(System.in); // the input Scanner

  
   public static void main(String[] args) {
       // Initialize the game-board and current status
       resetBoard();
       // Play the game once
       do {
           playerMove(currentPlayer); // update currentRow and currentCol
           updateGame(currentPlayer, currntRow, currentCol); // update
                                                               // currentState
           printBoard();
           // Print message if game-over
           if (currentState == CROSS_WON) {
               System.out.println("'X' won! Bye!");
           } else if (currentState == NOUGHT_WON) {
               System.out.println("'O' won! Bye!");
           } else if (currentState == DRAW) {
               System.out.println("It's a Draw! Bye!");
           }
           // Switch player
           currentPlayer = (currentPlayer == CROSS) ? NOUGHT : CROSS;
       } while (currentState == PLAYING); // repeat if not game-over
   }

  
   public static void resetBoard() {
       for (int row = 0; row < ROWS; ++row) {
           for (int col = 0; col < COLS; ++col) {
               board[row][col] = EMPTY; // all cells empty
           }
       }
       currentState = PLAYING; // ready to play
       currentPlayer = CROSS; // cross plays first
   }

  
   public static void playerMove(int theSeed) {
       boolean validInput = false; // for input validation
       do {
           if (theSeed == CROSS) {
               System.out
                       .print("Player 'X', enter your move (row[1-3] column[1-3]): ");
           } else {
               System.out
                       .print("Player 'O', enter your move (row[1-3] column[1-3]): ");
           }
           int row = in.nextInt() - 1; // array index starts at 0 instead of 1
           int col = in.nextInt() - 1;
           if (row >= 0 && row < ROWS && col >= 0 && col < COLS
                   && board[row][col] == EMPTY) {
               currntRow = row;
               currentCol = col;
               board[currntRow][currentCol] = theSeed; // update game-board
                                                       // content
               validInput = true; // input okay, exit loop
           } else {
               System.out.println("This move at (" + (row + 1) + ","
                       + (col + 1) + ") is not valid. Try again...");
           }
       } while (!validInput); // repeat until input is valid
   }

   /**
   * Update the "currentState" after the player with "theSeed" has placed on
   * (currentRow, currentCol).
   */
   public static void updateGame(int theSeed, int currentRow, int currentCol) {
       if (hasWon(theSeed, currentRow, currentCol)) { // check if winning move
           currentState = (theSeed == CROSS) ? CROSS_WON : NOUGHT_WON;
       } else if (isDraw()) { // check for draw
           currentState = DRAW;
       }
       // Otherwise, no change to currentState (still PLAYING).
   }

   /** Return true if it is a draw (no more empty cell) */
   // TODO: Shall declare draw if no player can "possibly" win
   public static boolean isDraw() {
       for (int row = 0; row < ROWS; ++row) {
           for (int col = 0; col < COLS; ++col) {
               if (board[row][col] == EMPTY) {
                   return false; // an empty cell found, not draw, exit
               }
           }
       }
       return true; // no empty cell, it's a draw
   }

   public static boolean hasWon(int theSeed, int currentRow, int currentCol) {
       return (board[currentRow][0] == theSeed // 3-in-the-row
               && board[currentRow][1] == theSeed
               && board[currentRow][2] == theSeed
               || board[0][currentCol] == theSeed // 3-in-the-column
               && board[1][currentCol] == theSeed
               && board[2][currentCol] == theSeed
               || currentRow == currentCol // 3-in-the-diagonal
               && board[0][0] == theSeed
               && board[1][1] == theSeed
               && board[2][2] == theSeed || currentRow + currentCol == 2 // 3-in-the-opposite-diagonal
               && board[0][2] == theSeed
               && board[1][1] == theSeed
               && board[2][0] == theSeed);
   }

   /** Print the game board */
   public static void printBoard() {
       for (int row = 0; row < ROWS; ++row) {
           for (int col = 0; col < COLS; ++col) {
               printCell(board[row][col]); // print each of the cells
               if (col != COLS - 1) {
                   System.out.print("|"); // print vertical partition
               }
           }
           System.out.println();
           if (row != ROWS - 1) {
               System.out.println("-----------"); // print horizontal partition
           }
       }
       System.out.println();
   }

   /** Print a cell with the specified "content" */
   public static void printCell(int content) {
       switch (content) {
       case EMPTY:
           System.out.print(" ");
           break;
       case NOUGHT:
           System.out.print(" O ");
           break;
       case CROSS:
           System.out.print(" X ");
           break;
       }
   }
}

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