Create a Java program of a Tic Tac Toe game. Note: This is a one-player game, pr
ID: 3766152 • Letter: C
Question
Create a Java program of a Tic Tac Toe game. Note: This is a one-player game, program should make the next move. (Otherwise the program is incorrect)
Complete the following 4 tasks:
1) Ask the user to pick between "X" and "O", every time a user makes a move, program should make the next move. After each move the game should be printed so the player knows what the game board looks like after each play. Let the program create a file named game_log.txt. After each move the game board should be written to a file named “game_log.txt”, which records all game activity.The program should handle potential exceptions that may be thrown by using try/catch.
2) Ask the user to play again until user answers “NO”. The game board does not have to print the Tic TAC Toe table. The program should print an empty board, with numbers representing each playable position.The user should provide the number representative of the position where the user would like to place their letter of choice. Handle scenarios where the user chooses a position that is not available.
1 2 3
4 5 6
7 8 9
4) After the game ends, the program should ask the user to play again. If “yes” then a new game begins. If “no” then print: The number of games played. The number of wins, losses and draws.The player’s winning percentage. [Winning percentage= (#of games won/# of games played)*100] Print “thanks for playing!
Explanation / Answer
// filename: TicTacToe.java
//
// This program plays the game of Tic-Tac-Toe with the user.
import java.util.Scanner;
public class TicTacToe
{
public static Scanner sc = new Scanner(System.in);
public static void main(String[] args)
{
char more='y';
int countw=0;
int countl=0;
int count=0;
float per=0;
while(more!='n'||more!='N'){
if(more=='n'||more=='N')
{
break;
}
count++;
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!! **");
countw++;}
else if (winner == 1){
System.out.println(" ** YOU LOST.. Maybe next time :) **");
countl++;}
else
System.out.println(" ** DRAW... **");
System.out.println("want to play more");
more=sc.next().charAt(0);
}
System.out.println("Total Play "+count);
System.out.println("Total Won "+countw);
System.out.println("Total Lose "+countl);
System.out.println("Winning percentage "+(countw/count)*100);
}
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;
}
}