FoxTek
Guru

I need to make this program 'smarter' instead of it just making random moves. Any and all help would be appreciated.
Code:
package tictactoe;
import java.util.Random;
import java.util.Scanner;
public class TicTacToe {
private char[] cells = new char[9];
public static char CELL_EMPTY = ' ';
public static char CELL_CIRCLE = 'O';
public static char CELL_CROSS = 'X';
public TicTacToe() {
for (int i = 0; i < cells.length; i++) {
cells[i] = CELL_EMPTY;
}
}
private void drawBoard() {
System.out.println(cells[0] + " | " + cells[1] + " | " + cells[2]);
System.out.println("- - - - -");
System.out.println(cells[3] + " | " + cells[4] + " | " + cells[5]);
System.out.println("- - - - -");
System.out.println(cells[6] + " | " + cells[7] + " | " + cells[8]);
}
private boolean isWinner(char symbol) {
boolean answer = false;
if (checkRows(symbol) || checkColumns(symbol) || checkDiagnals(symbol)) {
answer = true;
} else {
answer = false;
}
return answer;
}
public void computerMove() {
System.out.println("======================================");
System.out.println("Thinking . . .");
try {
Thread.sleep(2000);
}
catch (InterruptedException ie) {
}
System.out.println("Making move . . .");
try {
Thread.sleep(2000);
}
catch (InterruptedException ie) {
}
int emptyCellCount = 0;
for (int i = 0; i < cells.length; i++) {
if (cells[i] == CELL_EMPTY) {
emptyCellCount++;
}
}
int[] emptyCellIndexes = new int[emptyCellCount];
emptyCellCount = 0;
for (int i = 0; i < cells.length; i++) {
if (cells[i] == CELL_EMPTY) {
emptyCellIndexes[emptyCellCount] = i;
emptyCellCount++;
}
}
Random r = new Random();
int randomNumber = r.nextInt(emptyCellCount);
cells[emptyCellIndexes[randomNumber]] = CELL_CIRCLE;
drawBoard();
if (isWinner(CELL_CROSS)) {
System.out.println("Congratulations! You won.");
} else if (isWinner(CELL_CIRCLE)) {
System.out.println("Sorry! You lost.");
} else if (isFull()) {
System.out.println("It's a tie!");
} else {
humanMove();
}
}
public void humanMove() {
System.out.println("======================================");
drawBoard();
Scanner input = new Scanner(System.in);
int rowNumber = 0, colNumber = 0, index = 0;
try {
Thread.sleep(1000);
}
catch (InterruptedException ie) {
}
System.out.println("You are 'X'. It's your turn. ");
System.out.println("Tell me which cell you would like to occupy.");
System.out.println("Which row [1 - 3]? ");
rowNumber = input.nextInt();
System.out.println("Which column [1 - 3]? ");
colNumber = input.nextInt();
index = (rowNumber - 1) * 3 + (colNumber - 1);
while (!isInputValid(index)) {
System.out.println("Invalid move! Tell me which cell you would like to occupy.");
System.out.println("Which row [1 - 3]? ");
rowNumber = input.nextInt();
System.out.println("Which column [1 - 3]? ");
colNumber = input.nextInt();
index = (rowNumber - 1) * 3 + (colNumber - 1);
}
cells[index] = CELL_CROSS;
drawBoard();
if (isWinner(CELL_CROSS)) {
System.out.println("Congratulations! You won.");
drawBoard();
} else if (isWinner(CELL_CIRCLE)) {
System.out.println("Sorry! You lost.");
drawBoard();
} else if (isFull()) {
System.out.println("It's a tie!");
drawBoard();
}
else {
computerMove();
}
}
private boolean isFull() {
boolean answer = true;
for (int i = 0; i < cells.length; i++) {
if (cells[i] == CELL_EMPTY) {
answer = false;
break;
}
}
return answer;
}
private boolean isInputValid(int index) {
boolean answer = false;
if (cells[index] == CELL_CIRCLE || cells[index] == CELL_CROSS) {
answer = false;
} else {
answer = true;
}
return answer;
}
private boolean checkRows(char symbol) {
boolean answer = false;
if (cells[0] == symbol && cells[1] == symbol && cells[2] == symbol){
answer = true;
} else if (cells[3] == symbol && cells[4] == symbol && cells[5] == symbol) {
answer = true;
} else if (cells[6] == symbol && cells[7] == symbol && cells[8] == symbol) {
answer = true;
} else {
answer = false;
}
return answer;
}
private boolean checkColumns(char symbol) {
boolean answer = false;
if (cells[0] == symbol && cells[3] == symbol && cells[6] == symbol){
answer = true;
} else if (cells[1] == symbol && cells[4] == symbol && cells[7] == symbol) {
answer = true;
} else if (cells[2] == symbol && cells[5] == symbol && cells[8] == symbol) {
answer = true;
} else {
answer = false;
}
return answer;
}
private boolean checkDiagnals(char symbol) {
boolean answer = false;
if (cells[0] == symbol && cells[4] == symbol && cells[8] == symbol) {
answer = true;
} else if (cells[2] == symbol && cells[4] == symbol && cells[6] == symbol) {
answer = true;
} else {
answer = false;
}
return answer;
}
}

