I built this two-player Tic-Tac-Toe game as a way to practise Java fundamentals: arrays, loops, methods, conditionals and reading input from the console. The Java version runs in the terminal. A small browser preview is included below so the game can be tried without compiling the Java program. The browser preview is a separate HTML/CSS/JavaScript implementation; it is not a Java GUI.
Java implementation
The board is a 3 × 3 character array. Players choose X or O, select a square from 1 to 9, and alternate turns. Invalid input and occupied squares do not consume a turn.
importjava.util.Scanner;publicclassTicTacToe{privatestaticfinalScannerINPUT=newScanner(System.in);publicstaticvoidmain(String[]args){charplayerOne=readSymbol("Player 1, choose X or O: ");charplayerTwo=playerOne=='X'?'O':'X';charfirstTurn=readSymbol("Which symbol goes first (X/O)? ");play(playerOne,playerTwo,firstTurn);}privatestaticcharreadSymbol(Stringprompt){while(true){System.out.print(prompt);Stringinput=INPUT.next().trim().toUpperCase();if(input.length()==1&&(input.charAt(0)=='X'||input.charAt(0)=='O')){returninput.charAt(0);}System.out.println("Enter X or O.");}}privatestaticvoidplay(charplayerOne,charplayerTwo,charcurrentPlayer){char[][]board={{'1','2','3'},{'4','5','6'},{'7','8','9'}};intmoves=0;while(moves<9){displayBoard(board);intsquare=readSquare(board,currentPlayer);introw=(square-1)/3;intcol=(square-1)%3;board[row][col]=currentPlayer;moves++;if(hasWinner(board,currentPlayer)){displayBoard(board);System.out.println("Player "+(currentPlayer==playerOne?"1":"2")+" ("+currentPlayer+") wins!");return;}currentPlayer=currentPlayer==playerOne?playerTwo:playerOne;}displayBoard(board);System.out.println("It's a draw!");}privatestaticintreadSquare(char[][]board,charplayer){while(true){System.out.print("Player "+player+", choose a free square (1-9): ");if(!INPUT.hasNextInt()){Stringinvalid=INPUT.next();System.out.println("'"+invalid+"' is not a number. Try again.");continue;}intsquare=INPUT.nextInt();if(square<1||square>9){System.out.println("Choose a number between 1 and 9.");continue;}introw=(square-1)/3;intcol=(square-1)%3;if(board[row][col]=='X'||board[row][col]=='O'){System.out.println("That square is already taken.");continue;}returnsquare;}}privatestaticbooleanhasWinner(char[][]board,charplayer){for(inti=0;i<3;i++){if(board[i][0]==player&&board[i][1]==player&&board[i][2]==player)returntrue;if(board[0][i]==player&&board[1][i]==player&&board[2][i]==player)returntrue;}return(board[0][0]==player&&board[1][1]==player&&board[2][2]==player)||(board[0][2]==player&&board[1][1]==player&&board[2][0]==player);}privatestaticvoiddisplayBoard(char[][]board){System.out.println();for(introw=0;row<3;row++){System.out.printf(" %c | %c | %c %n",board[row][0],board[row][1],board[row][2]);if(row<2)System.out.println("---+---+---");}System.out.println();}}
Run it locally
Save the code as TicTacToe.java, then compile and run it with a JDK:
1
2
javac TicTacToe.java
java TicTacToe
What this project taught me
A two-dimensional array is a straightforward way to model a fixed-size board.
Input validation belongs at the boundary where user input enters the program.
Separating input, display, move validation and winner detection makes the code easier to reason about.
A game loop should stop immediately after a win and report a draw only after all nine valid moves.