Tic Tac Toe In C++

Tic-tac-toe is a straightforward two-player game that, if both players play their best, will always end in a tie. The game is also known as Xs and Os or zeros and crosses.

A computer or other device can be used to play the game of tic tac toe, which is typically played by drawing on paper. This timeless game provides the foundation for other ones, like Connect 4.

History of Tic-Tac-Toe

Around the first century B.C., a primitive version of the game was played in the Roman Empire. Three pebbles at a time is what the name "terni lapilli" denotes. Roman ruins have been discovered to be covered with chalk grid patterns from the game. Ruins in ancient Egypt have also yielded evidence of the game.

The game's British moniker, "noughts and crosses," saw its first print appearance in 1864. The term "tick-tack-toe" first appeared in literature in 1884, although it referred to a children's game played on a slate.

Rules of the Game

  • The game must be played by two players (in this program between HUMAN and COMPUTER).
  • Both players mark their cells with the letters "O" and "X".
  • The game ends when one of the players fills an entire row, column or diagonal with either the character ('O' or 'X') of that player.
  • If no one wins, the match is considered a draw.
  • Program Break Down

    Example
    
    # define COMPUTER 1
    # define HUMAN 2
    # define SIDE 3 
    # define COMPUTERMOVE 'O'
    # define HUMANMOVE 'X'
    

Here, we predefined some of our moves which we going to perform in the game. We have taken the length of the board to be 3, computer move will be denoted by 'O' and 'X' by the human or the user.

Example

void showBoard ( char board [ ] [ SIDE ] )
{
	printf ( " \ n \ n " ) ;
	printf ( " \ t \ t \ t % c | % c | % c \ n " , board [ 0 ] [ 0 ] , board [ 0 ] [ 1 ] , board [ 0 ] [ 2 ] ) ;
	printf ( " \ t \ t \ t -------------- \ n " ) ;
	printf ( " \ t \ t \ t % c | % c | % c \ n " , board [ 1 ] [ 0 ] , board [ 1 ] [ 1 ] , board [ 1 ] [ 2 ] ) ;
	printf ( " \ t \ t \ t -------------- \ n " ) ;
	printf ( " \ t \ t \ t % c | % c | % c \ n \ n " , board [ 2 ] [ 0 ] , board [ 2 ] [ 1 ] , board [ 2 ] [ 2 ] ) ; 
	return ;
}

Above mentioned function i.e. void showBoard will demonstrate the current status of our board of size 3X3., and we have initialized it with 1 to 9 to indicate.

Example

void showInstructions ( )
{
	printf ( " \ t \ t \ t Tic-Tac-Toe \ n \ n " ) ;
	printf ( " Choose a cell numbered from 1 to 9 as below and play \ n \ n " ) ;
	printf ( " \ t \ t \ t 1 | 2 | 3 \ n " ) ;
	printf ( " \ t \ t \ t -------------- \ n " ) ;
	printf ( " \ t \ t \ t 4 | 5 | 6 \ n " ) ;
	printf ( " \ t \ t \ t -------------- \ n " ) ;
	printf ( " \ t \ t \ t 7 | 8 | 9 \ n \ n " ) ; 
	printf ( " - \ t - \ t - \ t - \ t - \ t- \ t - \ t - \ t - \ t - \ n \ n " ) ;
	return ;
}

Above mentioned function i.e. void showInstruction will demonstrate the instructions like choose a cell numbered from 1 to 9 as below and play.

Example

void initialize ( char board [ ] [ SIDE ] , int moves [ ] )
{
	// Initiate the random number generator so that
	// the same configuration doesn't arises
	srand ( time ( NULL ) ) ;
	// Initially the board is empty
	for ( int i = 0 ; i < SIDE ; i + + )
	{
		for (int j = 0 ; j < SIDE ; j + + )
			board [ i ] [ j ] =  ' ' ;
	}
	// Fill the moves with numbers
	for ( int i = 0 ; i < SIDE * SIDE ;  i +  + )
		moves [ i ] = I ; 
	// randomise the moves
	random_shuffle ( moves , moves + SIDE * SIDE ) ; 
	return ;
}

Above mentioned function i.e. void initialize which initialize the random number so that the same configuration doesn't arises, and initially the board is empty.

Example

void declareWinner ( int whoseTurn )
{
	if ( whoseTurn == COMPUTER )
		printf ( " COMPUTER has won \ n " ) ;
	else
		printf ( " HUMAN has won \ n " ) ;
	return ;
}

This function i.e. void declareWinner will declare the winner of the game whether computer won or human won the game.

Example

bool rowCrossed ( char board [ ] [ SIDE ] )
{
	for ( int i=0 ; i < SIDE ; i + + )
	{
		if (board [ i ] [ 0 ] == board [ i ] [ 1 ] &&
			board [ i ] [ 1 ] == board [ i ] [ 2 ] &&
			board [ i ] [ 0 ] != ' ' )
			return ( true ) ;
	}
	return ( false ) ;
}

Above function i.e. bool rowCrossed will return true or false if any of the row is crossed with the player's move.

Example

bool columnCrossed ( char board [ ] [ SIDE ] )
{
	for (int i = 0 ; i < SIDE ; i + + )
	{
		if (board [ 0 ] [ i ] == board [ 1 ] [ i ] &&
			board [ 1 ] [ i ] == board [ 2 ] [ i ] &&
			board [ 0 ] [ i ] != ' ' )
			return ( true ) ;
	}
	return ( false ) ;
}

Above function i.e. bool columnCrossed will return true or false if any of the column is crossed with the player's move.

Example

bool diagonalCrossed(char board[][SIDE])
{
	if (board[0][0] == board[1][1] &&
		board[1][1] == board[2][2] &&
		board[0][0] != ' ')
		return(true); 
	if (board[0][2] == board[1][1] &&
		board[1][1] == board[2][0] &&
		board[0][2] != ' ')
		return(true); 
	return(false);
}

Above function i.e. bool diagonalCrossed will return true or false if any of the diagonals are crossed with the player's move.

Example

bool gameOver ( char board [ ] [ SIDE ] )
{
	return ( rowCrossed ( board ) || columnCrossed ( board ) || diagonalCrossed ( board ) ) ;
}

Above function i.e. bool gameOver will return true or false if the game is over.

Example

void playTicTacToe ( int whoseTurn )
{
	// A 3 * 3 Tic-Tac-Toe board for playing
	char board [ SIDE ] [ SIDE ] ;
	int moves [ SIDE * SIDE ] ;
	// Initialise the game
	initialise ( board , moves ) ;
	// Show the instructions before playing
	showInstructions ( ) ;
	int moveIndex = 0 , x , y ;
	// Keep playing till the game is over or it is a draw
	while ( gameOver ( board ) == false &&
			moveIndex != SIDE * SIDE )
	{
		if ( whoseTurn == COMPUTER )
		{
			x = moves [ moveIndex ] / SIDE ;
			y = moves [ moveIndex ] % SIDE ;
			board [ x ] [ y ] = COMPUTERMOVE ;
			printf ( " COMPUTER has put a % c in cell % d \ n " , COMPUTERMOVE , moves [ moveIndex ] + 1 ) ;
			showBoard ( board ) ;
			moveIndex + + ;
			whoseTurn = HUMAN ;
		}
		else if ( whoseTurn == HUMAN )
		{
			x = moves [ moveIndex ] / SIDE ;
			y = moves [ moveIndex ] % SIDE ;
			board [ x ] [ y ] = HUMANMOVE ;
			printf ( " HUMAN has put a % c in cell % d \ n " , HUMANMOVE , moves [ moveIndex] + 1 ) ;
			showBoard ( board ) ;
			moveIndex + + ;
			whoseTurn = COMPUTER ;
		}
	}
	// If the game has drawn
	if ( gameOver ( board ) == false && moveIndex == SIDE * SIDE )
		printf ( " It's a draw \ n " ) ;
	else
	{
		// Toggling the user to declare the actual
		// winner
		if ( whoseTurn == COMPUTER )
			whoseTurn = HUMAN ;
		else if ( whoseTurn == HUMAN )
			whoseTurn = COMPUTER ; 
		// Declare the winner
		declareWinner ( whoseTurn ) ;
	}

Above function i.e. void playTictacToe will be the main function to play tic-tac-toe.

Program for Tic-Tac-Toe in C++

Example

// A C++ Program to play tic-tac-toe
#include <bits/stdc++.h>
using namespace std;
#define COMPUTER 1
#define HUMAN 2
#define SIDE 3 // Length of the board
// Computer will move with 'O'
// and human with 'X'
#define COMPUTERMOVE 'O'
#define HUMANMOVE 'X'
// A function to show the current board status
void showBoard(char board[][SIDE])
{
    printf("\n\n");

    printf("\t\t\t %c | %c | %c \n", board[0][0],
           board[0][1], board[0][2]);
    printf("\t\t\t--------------\n");
    printf("\t\t\t %c | %c | %c \n", board[1][0],
           board[1][1], board[1][2]);
    printf("\t\t\t--------------\n");
    printf("\t\t\t %c | %c | %c \n\n", board[2][0],
           board[2][1], board[2][2]);

    return;
}

// A function to show the instructions
void showInstructions()
{
    printf("\t\t\t Tic-Tac-Toe\n\n");
    printf("Choose a cell numbered from 1 to 9 as below"
           " and play\n\n");

    printf("\t\t\t 1 | 2 | 3 \n");
    printf("\t\t\t--------------\n");
    printf("\t\t\t 4 | 5 | 6 \n");
    printf("\t\t\t--------------\n");
    printf("\t\t\t 7 | 8 | 9 \n\n");

    printf("-\t-\t-\t-\t-\t-\t-\t-\t-\t-\n\n");

    return;
}

// A function to initialise the game
void initialise(char board[][SIDE], int moves[])
{
    // Initiate the random number generator so that
    // the same configuration doesn't arises
    srand(time(NULL));

    // Initially the board is empty
    for (int i = 0; i < SIDE; i++)
    {
        for (int j = 0; j < SIDE; j++)
            board[i][j] = ' ';
    }

    // Fill the moves with numbers
    for (int i = 0; i < SIDE * SIDE; i++)
        moves[i] = i;

    // randomise the moves
    random_shuffle(moves, moves + SIDE * SIDE);

    return;
}

// A function to declare the winner of the game
void declareWinner(int whoseTurn)
{
    if (whoseTurn == COMPUTER)
        printf("COMPUTER has won\n");
    else
        printf("HUMAN has won\n");
    return;
}

// A function that returns true if any of the row
// is crossed with the same player's move
bool rowCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++)
    {
        if (board[i][0] == board[i][1] &&
            board[i][1] == board[i][2] &&
            board[i][0] != ' ')
            return (true);
    }
    return (false);
}

// A function that returns true if any of the column
// is crossed with the same player's move
bool columnCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++)
    {
        if (board[0][i] == board[1][i] &&
            board[1][i] == board[2][i] &&
            board[0][i] != ' ')
            return (true);
    }
    return (false);
}

// A function that returns true if any of the diagonal
// is crossed with the same player's move
bool diagonalCrossed(char board[][SIDE])
{
    if (board[0][0] == board[1][1] &&
        board[1][1] == board[2][2] &&
        board[0][0] != ' ')
        return (true);

    if (board[0][2] == board[1][1] &&
        board[1][1] == board[2][0] &&
        board[0][2] != ' ')
        return (true);

    return (false);
}

// A function that returns true if the game is over
// else it returns a false
bool gameOver(char board[][SIDE])
{
    return (rowCrossed(board) || columnCrossed(board) || diagonalCrossed(board));
}

// A function to play Tic-Tac-Toe
void playTicTacToe(int whoseTurn)
{
    // A 3*3 Tic-Tac-Toe board for playing
    char board[SIDE][SIDE];

    int moves[SIDE * SIDE];

    // Initialise the game
    initialise(board, moves);

    // Show the instructions before playing
    showInstructions();

    int moveIndex = 0, x, y;

    // Keep playing till the game is over or it is a draw
    while (gameOver(board) == false &&
           moveIndex != SIDE * SIDE)
    {
        if (whoseTurn == COMPUTER)
        {
            x = moves[moveIndex] / SIDE;
            y = moves[moveIndex] % SIDE;
            board[x][y] = COMPUTERMOVE;
            printf("COMPUTER has put a %c in cell %d\n",
                   COMPUTERMOVE, moves[moveIndex] + 1);
            showBoard(board);
            moveIndex++;
            whoseTurn = HUMAN;
        }

        else if (whoseTurn == HUMAN)
        {
            x = moves[moveIndex] / SIDE;
            y = moves[moveIndex] % SIDE;
            board[x][y] = HUMANMOVE;
            printf("HUMAN has put a %c in cell %d\n",
                   HUMANMOVE, moves[moveIndex] + 1);
            showBoard(board);
            moveIndex++;
            whoseTurn = COMPUTER;
        }
    }

    // If the game has drawn
    if (gameOver(board) == false &&
        moveIndex == SIDE * SIDE)
        printf("It's a draw\n");
    else
    {
        // Toggling the user to declare the actual
        // winner
        if (whoseTurn == COMPUTER)
            whoseTurn = HUMAN;
        else if (whoseTurn == HUMAN)
            whoseTurn = COMPUTER;

        // Declare the winner
        declareWinner(whoseTurn);
    }
    return;
}

// Driver program
int main()
{
    // Let us play the game with COMPUTER starting first
    playTicTacToe(COMPUTER);

    return (0);
}

Output:

Output

Tic-Tac-Toe

Choose a cell numbered from 1 to 9 as below and play
              1 | 2  | 3  
            - - - - - - - -
              4 | 5  | 6  
            - - - - - - - - 
              7 | 8  | 9  
-    -    -    -    -    -    -    -    -    -
COMPUTER has put a O in cell 6
                |    |    
            - - - - - - - -
                |    | O  
            - - - - - - - -
                |    |    
HUMAN has put a X in cell 7
                |    |    
            - - - - - - - -
                |    | O  
            - - - - - - - -
              X |    |    

COMPUTER has put a O in cell 5
                |    |    
            - - - - - - - -
                | O  | O  
            - - - - - - - -
              X |    |    
HUMAN has put a X in cell 1
              X |    |    
            - - - - - - - -
                | O  | O  
            - - - - - - - -
              X |    |    
COMPUTER has put a O in cell 9
              X |    |    
            - - - - - - - -
                | O  | O  
            - - - - - - - -
              X |    | O  
HUMAN has put a X in cell 8
              X |    |    
            - - - - - - - -
                | O  | O  
            - - - - - - - -
              X | X  | O  

COMPUTER has put a O in cell 4
              X |    |    
            - - - - - - - -
              O | O  | O  
            - - - - - - - -
              X | X  | O  
COMPUTER has won

Input Required

This code uses input(). Please provide values below: