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

the game of Tic-tac-toe that we ( ON JAVA Programming ) generally call X/0 game.

ID: 3549003 • Letter: T

Question

the game of Tic-tac-toe that we (ON JAVA Programming )

generally call X/0 game. You may assume that the board is 3x3.  


Class TicTacToeGame

This class has the board (which is a private instance variable), and maintains the whole

game. It controls whose turn it is to play, when one would win, and when would the game

end.

Apart from the constructor that initializes the game, the class has the methods

hasWinner() and play(). When implementing the game, you have to observe all objectoriented

concepts. This might require you to create your own methods to maintain the

board and the game.


class TicTacToeGame {

private ??? [][] board;

private Player player1, player2;

public TicTacToe () {

// Initializes the game with 2 players, and a board of

dimension 3x3

}

private boolean hasWinner (){

// returns true if the board has a winner, and false

otherwise

public void play(){

// This is the engine of the game. It initiates and

maintains it until it ends

}



Class Player

Apart from the constructor that initializes the player, the class has the method

nextMove(). This method asks the player to enter the coordinates of his/her desired

move to be marked with their sign.

class Player{

public Player(){

//initialize the player

}

public ??? nextMove (){

// Player decides what the next move is, and communicates

the coordinates back to the Game.

}



Notes:

? You may need to change the header/signature of some of the methods described in the

afore mentioned design to suit your algorithm and coding techniques. This means you

might need to pass more or less parameters.

? You might need to add more methods in the classes depending on your algorithm.

? Your program should output a descriptive statement to describe how the program

ended:

o In case of a winner:

Explanation / Answer

import java.util.Scanner;

/** * Tic-Tac-Toe: Two-player console, non-graphics, non-OO version. *


. */

public class TicTacToe {

// Name-constants to represent the seeds and cell contents

public static final int EMPTY = 0;

public static final int CROSS = 1;

public static final int NOUGHT = 2;

// Name-constants to represent the various states of the game

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;

// The game board and the game status

public static final int ROWS = 3, COLS = 3; // number of rows and columns

public static int[][] board = new int[ROWS][COLS]; // game board in 2D array // containing (EMPTY, CROSS, NOUGHT)

public static int currentState; // the current state of the game

// (PLAYING, DRAW, CROSS_WON, NOUGHT_WON)

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

/** The entry main method (the program starts here) */

public static void main(String[] args) {

// Initialize the game-board and current status

initGame();

// 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

}

/** Initialize the game-board contents and the current states */

public static void initGame() {

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

}

/** Player with the "theSeed" makes one move, with input validation. Update global variables "currentRow" and "currentCol". */

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

}

/** Return true if the player with "theSeed" has won after placing at (currentRow, currentCol) */

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;

}

}

}