I have created a logical AI for a Tic-Tac-Toe game. I want a review about how good or bad it is. Here the computer AI will defend all your attacks as well as try to attack whenever it gets a chance.
import java.util.Random;
import java.util.Scanner;
public class TicTac {
static {
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t ________________________ _______________________");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t |___ ___|___ ___| ____| |___ ___| _ | ____|");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t | | | | | | ____ | | | |_| | |");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t | | | | | | |____| | | | _ | |");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t | | __| |__| |___ | | | | | | |___");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t |__| |________|______| |__| |__| |__|______|");
System.out.println("\n\n");
}
private Scanner sc = new Scanner(System.in);
private char board[] = new char[9];
private char turn = 'X';
private Random random = new Random();
private int winX = 0;
private int winO = 0;
private String name;
private char myChoice = 'O';
public static void main(String[] args) {
TicTac t = new TicTac();
int numberOfGames = 1;
long start, end;
start = System.currentTimeMillis();
do {
t.play();
numberOfGames--;
System.out.println("\t\t\t\t\t\t\t\t\t\t\t----------------------------------------------------------------");
} while (numberOfGames > 0);
end = System.currentTimeMillis();
System.out.println("\n\t\t\t\t\t\t\t\t\t\t\tTime taken by the program to execute is : " + (end - start));
}
private void playersTurn() {
int r;
boolean check = false;
do {
System.out.println("\n\n\t\t\t\t\t\t\t\twhere do you wnt to play , select from 1 - 9 :");
try {
r = getChoice();
if (!(r > 0 && r < 10)) {
Thread.sleep(1000);
throw new NumberFormatException("Invalid Number");
}
r -= 1;
if (board[r] == ' ') {
board[r] = turn;
check = true;
} else if (board[r] == myChoice) {
System.out.println("you already played there");
} else {
System.out.println("computer played there");
}
} catch (Exception e) {
System.out.println("invalid choice. \t " + e);
}
} while (!check);
}
private int getChoice() {
String x = "1";
try {
x = sc.nextLine();
if (x.matches("^[1-9]$")) {
} else {
throw new NumberFormatException("Invalid Number");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return Integer.parseInt(x);
}
private void initializeBoard() {
for (int i = 0; i < 9; i++) {
board[i] = ' ';
}
}
private void switchPlayer() {
if (turn == 'X') {
turn = 'O';
} else if (turn == 'O') {
turn = 'X';
}
}
private boolean win() {
for (int i = 0; i < 9; i++) {
if (board[i] == ' ') {
board[i] = turn;
if (checkWin()) {
return true;
} else {
board[i] = ' ';
}
}
}
return false;
}
private void attack() {
boolean check = false;
do {
int r = random.nextInt(9);
if (r == 1 || r == 3 || r == 5 || r == 7 || r != 4) {
r = random.nextInt(9);
}
if (board[r] == ' ') {
board[r] = turn;
check = true;
}
} while (!check);
}
private boolean defence() {
switchPlayer();
for (int i = 0; i < 9; i++) {
if (board[i] == ' ') {
board[i] = turn;
if (checkWin()) {
switchPlayer();
board[i] = turn;
return true;
} else {
board[i] = ' ';
}
}
}
switchPlayer();
return false;
}
private boolean filled() {
for (int i = 0; i < 9; i++) {
if (board[i] == ' ') {
return false;
}
}
return true;
}
private void play() {
initializeBoard();
do {
if (win()) {
switchPlayer();
} else if (defence()) {
switchPlayer();
} else {
attack();
switchPlayer();
}
display();
if (turn == myChoice && !checkWin() && !filled()) {
playersTurn();
switchPlayer();
display();
}
/*try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println("\n");
} while (!filled() && !checkWin());
if (checkWin()) {
switchPlayer();
if (turn == 'O') {
winO++;
} else {
winX++;
}
System.out.println();
display();
System.out.println("\n");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t " + turn + " has won");
} else {
System.out.println();
display();
System.out.println("\n");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t game is draw... ");
}
}
private boolean checkWin() {
return (board[0] == board[1] && board[1] == board[2] && board[0] != ' ' || board[3] == board[4] && board[4] == board[5] && board[3] != ' ' || board[6] == board[7] && board[7] == board[8] && board[6] != ' ' || board[0] == board[4] && board[4] == board[8] && board[0] != ' ' || board[2] == board[4] && board[4] == board[6] && board[2] != ' ' || board[0] == board[3] && board[3] == board[6] && board[0] != ' ' || board[1] == board[4] && board[4] == board[7] && board[1] != ' ' || board[2] == board[5] && board[5] == board[8] && board[2] != ' ');
}
private void display() {
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t " + board[0] + " | " + board[1] + " | " + board[2] + " PLAYER 'O' | CPU 'X'");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t---|---|--- ---------|---------");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t " + board[3] + " | " + board[4] + " | " + board[5] + " |");
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t---|---|---" + "\t \t\t\t\t" + winO + "\t|\t" + winX);
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t " + board[6] + " | " + board[7] + " | " + board[8] + " |");
}
}