Created
October 6, 2012 12:39
-
-
Save xaviablaza-zz/3844825 to your computer and use it in GitHub Desktop.
A simple Tic-Tac-Toe game.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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!