The Tic Tac Toe Game in Java Code


This is a small program that shows how to create a TicTacToe game in Java.
The purpose of the game is to get three in a row before your opponent does, either vertically, horizontally or diagonally.

The TicTacToe program is made up of two Java classes. One is called TicTacToe and that is the actual game class that contains much of the logic for the game.
The other class called Main is the class that starts the game, displays the rules and loops for as many times as there are moves by the users.

The Main class looks like this:


package com.javadb.tictactoe;

/**
 *
 * @author www.javadb.com
 */

public class Main {

    public void play() {

        TicTacToe game = new TicTacToe();

        System.out.println("Welcome! Tic Tac Toe is a two player game.");
        System.out.print("Enter player one's name: ");
        game.setPlayer1(game.getPrompt());
        System.out.print("Enter player two's name: ");
        game.setPlayer2(game.getPrompt());
        boolean markerOk = false;
        while (!markerOk) {
            System.out.print("Select any letter as " + game.getPlayer1() + "'s marker: ");
            String marker = game.getPrompt();
            if (marker.length() == 1 &&
                    Character.isLetter(marker.toCharArray()[0])) {
                markerOk = true;
                game.setMarker1(marker.toCharArray()[0]);
            } else {
                System.out.println("Invalid marker, try again");
            }
        }
        markerOk = false;
        while (!markerOk) {
            System.out.print("Select any letter as " + game.getPlayer2() + "'s marker: ");
            String marker = game.getPrompt();
            if (marker.length() == 1 &&
                    Character.isLetter(marker.toCharArray()[0])) {
                markerOk = true;
                game.setMarker2(marker.toCharArray()[0]);
            } else {
                System.out.println("Invalid marker, try again");
            }
        }

        boolean continuePlaying = true;

        while (continuePlaying) {

            game.init();
            System.out.println();
            System.out.println(game.getRules());
            System.out.println();
            System.out.println(game.drawBoard());
            System.out.println();

            String player = null;
            while (!game.winner() && game.getPlays() < 9) {
                player = game.getCurrentPlayer() == 1 ? game.getPlayer1() : game.getPlayer2();
                boolean validPick = false;
                while (!validPick) {
                    System.out.print("It is " + player + "'s turn. Pick a square: ");
                    String square = game.getPrompt();
                    if (square.length() == 1 && Character.isDigit(square.toCharArray()[0])) {
                        int pick = 0;
                        try {
                            pick = Integer.parseInt(square);
                        } catch (NumberFormatException e) {
                            //Do nothing here, it'll evaluate as an invalid pick on the next row.
                        }
                        validPick = game.placeMarker(pick);
                    }
                    if (!validPick) {
                        System.out.println("Square can not be selected. Retry");
                    }
                }
                game.switchPlayers();
                System.out.println();
                System.out.println(game.drawBoard());
                System.out.println();
            }
            if (game.winner()) {
                System.out.println("Game Over - " + player + " WINS!!!");
            } else {
                System.out.println("Game Over - Draw");
            }
            System.out.println();
            System.out.print("Play again? (Y/N): ");
            String choice = game.getPrompt();
            if (!choice.equalsIgnoreCase("Y")) {
                continuePlaying = false;
            }
        }
    }

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        Main main = new Main();
        main.play();
    }
}


Below is the code for the TicTacToe class:


package com.javadb.tictactoe;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 *
 * @author www.javadb.com
 */

public class TicTacToe {

    private char[][] board = new char[3][3];
    private String player1;
    private String player2;
    private int currentPlayer;
    private char marker1;
    private char marker2;
    private int plays;
    private BufferedReader reader =
            new BufferedReader(new InputStreamReader(System.in));

    protected void init() {
        int counter = 0;
        for (int i = 0; i < 3; i++) {
            for (int i1 = 0; i1 < 3; i1++) {
                board[i][i1] = Character.forDigit(++counter, 10);
            }
        }
        currentPlayer = 1;
        plays = 0;
    }

    protected void switchPlayers() {
        if (getCurrentPlayer() == 1) {
            setCurrentPlayer(2);
        } else {
            setCurrentPlayer(1);
        }
        setPlays(getPlays() + 1);
    }

    protected boolean placeMarker(int play) {
        for (int i = 0; i < 3; i++) {
            for (int i1 = 0; i1 < 3; i1++) {
                if (board[i][i1] == Character.forDigit(play, 10)) {
                    board[i][i1] = (getCurrentPlayer() == 1) ? getMarker1() : getMarker2();
                    return true;
                }
            }
        }
        return false;
    }

    protected boolean winner() {
        //Checking rows
        char current = ' ';
        for (int i = 0; i < 3; i++) {
            int i1 = 0;
            for (i1 = 0; i1 < 3; i1++) {
                if (!Character.isLetter(board[i][i1])) {
                    break;
                }
                if (i1 == 0) {
                    current = board[i][i1];
                } else if (current != board[i][i1]) {
                    break;
                }
                if (i1 == 2) {
                    //Found winner
                    return true;
                }
            }
        }
        //Checking columns
        for (int i = 0; i < 3; i++) {
            current = ' ';
            int i1 = 0;
            for (i1 = 0; i1 < 3; i1++) {
                if (!Character.isLetter(board[i1][i])) {
                    break;
                }
                if (i1 == 0) {
                    current = board[i1][i];
                } else if (current != board[i1][i]) {
                    break;
                }
                if (i1 == 2) {
                    //Found winner
                    return true;
                }
            }
        }
        //Checking diagonals
        current = board[0][0];
        if (Character.isLetter(current) && board[1][1] == current && board[2][2] == current) {
            return true;
        }
        current = board[2][0];
        if (Character.isLetter(current) && board[1][1] == current && board[0][2] == current) {
            return true;
        }
        return false;
    }

    protected String getRules() {
        StringBuilder builder = new StringBuilder();
        builder.append("Players take turns marking a square. Only squares \n");
        builder.append("not already marked can be picked. Once a player has \n");
        builder.append("marked three squares in a row, they win! If all squares \n");
        builder.append("are marked and no three squares are the same, a tied game is declared.\n");
        builder.append("Have Fun! \n\n");
        return builder.toString();
    }

    protected String getPrompt() {
        String prompt = "";
        try {
            prompt = reader.readLine();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return prompt;
    }

    protected String drawBoard() {
        StringBuilder builder = new StringBuilder("Game board: \n");
        for (int i = 0; i < 3; i++) {
            for (int i1 = 0; i1 < 3; i1++) {
                builder.append("[" + board[i][i1] + "]");
            }
            builder.append("\n");
        }
        return builder.toString();
    }

    public int getCurrentPlayer() {
        return currentPlayer;
    }

    public void setCurrentPlayer(int currentPlayer) {
        this.currentPlayer = currentPlayer;
    }

    public char getMarker1() {
        return marker1;
    }

    public void setMarker1(char marker1) {
        this.marker1 = marker1;
    }

    public char getMarker2() {
        return marker2;
    }

    public void setMarker2(char marker2) {
        this.marker2 = marker2;
    }

    public int getPlays() {
        return plays;
    }

    public void setPlays(int plays) {
        this.plays = plays;
    }

    public String getPlayer1() {
        return player1;
    }

    public void setPlayer1(String player1) {
        this.player1 = player1;
    }

    public String getPlayer2() {
        return player2;
    }

    public void setPlayer2(String player2) {
        this.player2 = player2;
    }
}
 

This is what a game could look like in the console when played:


Welcome! Tic Tac Toe is a two player game.
Enter player one's name: Foo
Enter player two's name: Bar
Select any letter as Foo's marker: X
Select any letter as Bar's marker: O

Players take turns marking a square. Only squares
not already marked can be picked. Once a player has
marked three squares in a row, they win! If all squares
are marked and no three squares are the same, a tied game is declared.
Have Fun!



Game board:
[1][2][3]
[4][5][6]
[7][8][9]


It is Foo's turn. Pick a square: 1

Game board:
[X][2][3]
[4][5][6]
[7][8][9]


It is Bar's turn. Pick a square: 5

Game board:
[X][2][3]
[4][O][6]
[7][8][9]


It is Foo's turn. Pick a square: 4

Game board:
[X][2][3]
[X][O][6]
[7][8][9]


It is Bar's turn. Pick a square: 7

Game board:
[X][2][3]
[X][O][6]
[O][8][9]


It is Foo's turn. Pick a square: 9

Game board:
[X][2][3]
[X][O][6]
[O][8][X]


It is Bar's turn. Pick a square: 3

Game board:
[X][2][O]
[X][O][6]
[O][8][X]


Game Over - Bar WINS!!!

Play again? (Y/N):
Do you know your Java?
Take a Ten-Question-Java-Quiz!

Bookmark and Share




Need help with your Java code? It's secure and confidential.
This is how it works:
Send a detailed description of what you need help with, the more details the better. Also provide a deadline for when it has to be finished. More time means better chance of putting your request into the schedule.

If the request is serious you will shortly receive an email with the price, to which you have to respond if you accept.

Once you have accepted, the work will begin on developing your code by an experienced Java developer. When the code is finished a link to a secure payment will be sent to you.

The source code is then sent to you once the payment is completed.

IMPORTANT! The request needs to be very detailed, else it may be ignored.


Write your detailed request here:

E-mail address: