Skip to content

Instantly share code, notes, and snippets.

@xaviablaza-zz
Created October 6, 2012 12:39
Show Gist options
  • Select an option

  • Save xaviablaza-zz/3844825 to your computer and use it in GitHub Desktop.

Select an option

Save xaviablaza-zz/3844825 to your computer and use it in GitHub Desktop.
A simple Tic-Tac-Toe game.
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
*
* @author MeneXia (Xavi Ablaza)
*
*/
public class TicTacToe {
static Scanner in;
static String[] board;
static String turn;
public static void main(String[] args) {
in = new Scanner(System.in);
board = new String[9];
turn = "X";
String winner = null;
populateEmptyBoard();
System.out.println("Welcome to 2 Player Tic Tac Toe.");
System.out.println("--------------------------------");
printBoard();
System.out.println("X's will play first. Enter a slot number to place X in:");
while (winner == null) {
int numInput;
try {
numInput = in.nextInt();
if (!(numInput > 0 && numInput <= 9)) {
System.out.println("Invalid input; re-enter slot number:");
continue;
}
} catch (InputMismatchException e) {
System.out.println("Invalid input; re-enter slot number:");
continue;
}
if (board[numInput-1].equals(String.valueOf(numInput))) {
board[numInput-1] = turn;
if (turn.equals("X")) {
turn = "O";
} else {
turn = "X";
}
printBoard();
winner = checkWinner();
} else {
System.out.println("Slot already taken; re-enter slot number:");
continue;
}
}
if (winner.equalsIgnoreCase("draw")) {
System.out.println("It's a draw! Thanks for playing.");
} else {
System.out.println("Congratulations! " + winner + "'s have won! Thanks for playing.");
}
}
static String checkWinner() {
for (int a = 0; a < 8; a++) {
String line = null;
switch (a) {
case 0:
line = board[0] + board[1] + board[2];
break;
case 1:
line = board[3] + board[4] + board[5];
break;
case 2:
line = board[6] + board[7] + board[8];
break;
case 3:
line = board[0] + board[3] + board[6];
break;
case 4:
line = board[1] + board[4] + board[7];
break;
case 5:
line = board[2] + board[5] + board[8];
break;
case 6:
line = board[0] + board[4] + board[8];
break;
case 7:
line = board[2] + board[4] + board[6];
break;
}
if (line.equals("XXX")) {
return "X";
} else if (line.equals("OOO")) {
return "O";
}
}
for (int a = 0; a < 9; a++) {
if (Arrays.asList(board).contains(String.valueOf(a+1))) {
break;
}
else if (a == 8) return "draw";
}
System.out.println(turn + "'s turn; enter a slot number to place " + turn + " in:");
return null;
}
static void printBoard() {
System.out.println("/---|---|---\\");
System.out.println("| " + board[0] + " | " + board[1] + " | " + board[2] + " |");
System.out.println("|-----------|");
System.out.println("| " + board[3] + " | " + board[4] + " | " + board[5] + " |");
System.out.println("|-----------|");
System.out.println("| " + board[6] + " | " + board[7] + " | " + board[8] + " |");
System.out.println("/---|---|---\\");
}
static void populateEmptyBoard() {
for (int a = 0; a < 9; a++) {
board[a] = String.valueOf(a+1);
}
}
}
@its3rdlink
Copy link
Copy Markdown

Nice, this is a clean and easy-to-read implementation. Good use of basic Java concepts, especially for a beginner project.

One small thing I noticed, in the input handling, if someone enters something that is not a number, the scanner can get stuck since the invalid input is not cleared. Adding in.next(); inside the catch block should fix that.

Also, in checkWinner(), converting the board to a list every time is a bit unnecessary. Not a big deal here, but something to keep in mind.

The winner logic works, but the switch block is a bit long. You could simplify it later using an array of winning positions, which makes it easier to read and modify.

Other than that, maybe separating the game logic from printing will make it easier to extend if you ever want to add a GUI or a simple AI.

Overall, though, solid implementation and works well.

Cheers, Y2Down!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment