I was assigned to create a simple Tic Tac Toe game in java for class, and here is what I got. I would like to know how the code could possibly be shortened without using really advanced topics since I haven't covered them yet. Here goes:
import java.util.*;
import javax.swing.JOptionPane;
public class TicTacToe {
enum Turn {PLAYER, COMPUTER};
public static void main(String[] args) {
char[][] gameBoard = {{'1','2','3'},
{'4','5','6'},
{'7','8','9'}};
ArrayList<Integer> choicesMade = new ArrayList<Integer>();
Turn turn = Turn.PLAYER;
while(!boardFull(gameBoard)) {
if(turn.equals(Turn.PLAYER)) {
int userChoice = getUserChoice(gameBoard);
if(!placeTaken(userChoice, choicesMade)) {
turn = Turn.COMPUTER;
choicesMade = addToArray(userChoice, choicesMade);
gameBoard = changeBoard(userChoice, gameBoard, 'X');
if(checkHorizontalWin(gameBoard, 'X')|| checkVerticalWin(gameBoard, 'X') || checkDiagonalWin(gameBoard, 'X')) {
JOptionPane.showMessageDialog(null, "You Win!");
break;
}
}
else {
JOptionPane.showMessageDialog(null, "That place is taken! Please try again!");
}
}
if(turn.equals(Turn.COMPUTER)) {
int computerChoice = 1 + (int)(Math.random() * 9);
if(!placeTaken(computerChoice, choicesMade)) {
turn = Turn.PLAYER;
choicesMade = addToArray(computerChoice, choicesMade);
gameBoard = changeBoard(computerChoice, gameBoard, 'O');
displayBoard(gameBoard);
if(checkHorizontalWin(gameBoard, 'O') || checkVerticalWin(gameBoard, 'O') || checkDiagonalWin(gameBoard, 'O')) {
JOptionPane.showMessageDialog(null, "Computer Wins!");
break;
}
}
}
}
}
public static void displayBoard(char[][] gameBoard) {
String output = "";
for(int i = 0; i < gameBoard.length; i++) {
output += Arrays.toString(gameBoard[i]) + "\n";
}
JOptionPane.showMessageDialog(null, output);
}
public static boolean boardFull (char[][] gameBoard) {
for(int i = 0; i < gameBoard.length; i++) {
for(int j = 0; j < gameBoard[i].length; j++) {
if(Character.isDigit(gameBoard[i][j])) {
return false;
}
}
}
return true;
}
public static int getUserChoice(char[][] gameBoard) {
String output = "";
for(int i = 0; i < gameBoard.length; i++) {
output += Arrays.toString(gameBoard[i]) + "\n";
}
String userInput = JOptionPane.showInputDialog(null, output);
int choice = Integer.parseInt(userInput);
return choice;
}
public static boolean placeTaken(int userChoice, ArrayList<Integer> choices) {
if(choices.contains(userChoice)) {
return true;
}
return false;
}
public static ArrayList<Integer> addToArray(int userChoice, ArrayList<Integer> choicesMade) {
choicesMade.add(userChoice);
return choicesMade;
}
public static char[][] changeBoard(int userChoice, char[][] gameBoard, char characterPlaceholder) {
switch(userChoice) {
case 1:
gameBoard = updateBoard(gameBoard, 0, 0, characterPlaceholder);
break;
case 2:
gameBoard = updateBoard(gameBoard, 0, 1, characterPlaceholder);
break;
case 3:
gameBoard = updateBoard(gameBoard, 0, 2, characterPlaceholder);
break;
case 4:
gameBoard = updateBoard(gameBoard, 1, 0, characterPlaceholder);
break;
case 5:
gameBoard = updateBoard(gameBoard, 1, 1, characterPlaceholder);
break;
case 6:
gameBoard = updateBoard(gameBoard, 1, 2, characterPlaceholder);
break;
case 7:
gameBoard = updateBoard(gameBoard, 2, 0, characterPlaceholder);
break;
case 8:
gameBoard = updateBoard(gameBoard, 2, 1, characterPlaceholder);
break;
case 9:
gameBoard = updateBoard(gameBoard, 2, 2, characterPlaceholder);
break;
}
return gameBoard;
}
public static char[][] updateBoard(char[][] gameBoard, int row, int column, char placeHolder) {
gameBoard[row][column] = placeHolder;
return gameBoard;
}
public static boolean checkHorizontalWin(char [][] gameBoard, char character) {
if(gameBoard[0][0] == character && gameBoard[0][1] == character && gameBoard[0][2] == character) {
return true;
}
else if(gameBoard[1][0] == character && gameBoard[1][1] == character && gameBoard[1][2] == character) {
return true;
}
else if(gameBoard[2][0] == character && gameBoard[2][1] == character && gameBoard[2][2] == character) {
return true;
}
return false;
}
public static boolean checkVerticalWin(char[][] gameBoard, char character) {
if(gameBoard[0][0] == character && gameBoard[1][0] == character && gameBoard[2][0] == character) {
return true;
}
else if(gameBoard[0][1] == character && gameBoard[1][1] == character && gameBoard[2][1] == character) {
return true;
}
else if(gameBoard[0][2] == character && gameBoard[1][2] == character && gameBoard[2][2] == character) {
return true;
}
return false;
}
public static boolean checkDiagonalWin(char[][] gameBoard, char character) {
if(gameBoard[0][0] == character && gameBoard[1][1] == character && gameBoard[2][2] == character) {
return true;
}
else if(gameBoard[0][2] == character && gameBoard[1][1] == character && gameBoard[2][0] == character) {
return true;
}
return false;
}
}