Implementation of Tic-Tac-Toe for 2 person game (User vs. User) - GeeksforGeeks

24 Sep, 2021
For 1-Person game (User vs. CPU), please refer Implementation of Tic-Tac-Toe game 
Rules of the Game
The game is to be played between two people (in this program between HUMAN to HUMAN).
First the game will take the names of the two players as input.
One of the player chooses ‘O’ and the other ‘X’ to mark their respective cells.
There would be a game toss, which will decide which player will move first.
The game starts with one of the players and the game ends when one of the players has one whole row/ column/ diagonal filled with his/her respective character (‘O’ or ‘X’).
If the game is Tie then, A message is displayed “Game is Tie”.
Winning Strategy – An Interesting FactIf both the players play optimally then it is destined that you will never lose (“although the match can still be drawn”). It doesn’t matter whether you play first or second. In another way – “ Two expert players will always draw ”.Isn’t this interesting?
Below is the code for the Game: 
C++
// C++ program to play Tic-Tac-Toe#include <bits/stdc++.h>using namespace std; // Length of the board#define SIDE 3 // Name fo the playersstring PLAYER1, PLAYER2; // Function to show the current// board statusvoid 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;} // Function to show the instructionsvoid 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;} // Function to initialise the gamevoid 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;} // Function to declare winner of the gamevoid declareWinner(string whoseTurn){    if (whoseTurn == PLAYER1)        cout << PLAYER1 << " has won\n";    else        cout << PLAYER1 << " has won\n";    return;} // Function that returns true if// any of the row is crossed with// the same player's movebool 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);} // Function that returns true if any// of the column is crossed with the// same player's movebool 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);} // Function that returns true if any// of the diagonal is crossed with// the same player's movebool 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);} // Function that returns true if the// game is over else it returns a falsebool gameOver(char board[][SIDE]){    return (rowCrossed(board)            || columnCrossed(board)            || diagonalCrossed(board));} // Function to play Tic-Tac-Toevoid playTicTacToe(string 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 instructions before playing    showInstructions();     int moveIndex = 0, x, y;    int r, c;     // Keep playing till the game is    // over or it is a draw    while (gameOver(board) == false           && moveIndex != SIDE * SIDE) {        if (whoseTurn == PLAYER1) {         // Label for player1 wrong choice        // of row and column        player1:             // Input the desired row and            // column by player 1 to            // insert X            cout << PLAYER1                 << " Enter the respective"                 << " row and column to "                    "insert X :\n";            cin >> r >> c;             if (r <= 3 && c <= 3) {                 // To check desired row and                // column should be empty                if (board[r - 1] == ' ')                    board[r - 1] = 'X';                 // If input is on already                // filled position                else {                    cout << "You cannot Overlap"                         << " on Already "                            "filled position:\n";                    goto player1;                }            }             // Input is not valid            else {                cout << "\nInput is not "                     << "valid please enter "                     << "right one\n";                 goto player1;            }             showBoard(board);            moveIndex++;            whoseTurn = PLAYER2;        }         else if (whoseTurn == PLAYER2) {         // Label for player2 wrong choice        // of row and column        player2:             // Input the desired row and            // column by player 1 to            // insert X            cout << PLAYER2                 << " Enter the respective"                 << " row and column to "                    "insert O :";            cin >> r >> c;            if (r <= 3 && c <= 3) {                 // Input the desired row and                // column by player 1 to                // insert X                if (board[r - 1] == ' ')                    board[r - 1] = 'O';                 // If input is on already                // filled position                else {                    cout << "You cannot Overlap"                         << " on Already "                         << "filled position:\n";                    goto player2;                }            }             // Input is not valid            else {                cout << "\nInput is not "                     << "valid please enter "                     << "right one :\n";                goto player2;            }             showBoard(board);            moveIndex++;            whoseTurn = PLAYER1;        }    }     // 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 == PLAYER1)            whoseTurn = PLAYER2;        else if (whoseTurn == PLAYER2)            whoseTurn = PLAYER1;         // Declare the winner        declareWinner(whoseTurn);    }    return;} // Driver Codeint main(){    // Take the name of players    cout << "Enter name of first Player: ";    cin >> PLAYER1;     cout << "Enter name of Second Player: ";    cin >> PLAYER2;     // Use current time as seed for    // random generator    srand(time(0));     // Lets do toss    int toss = rand() % 2;     // Let us play the game    if (toss == 1) {        cout << "Player "             << PLAYER1             << " win the toss"             << endl;         playTicTacToe(PLAYER1);    }    else {        cout << "Player "             << PLAYER2             << " win the toss"             << endl;        playTicTacToe(PLAYER2);    }     return (0);}
Output: Below is the output of the above code: 
 
abhishek0719kadiyan
anikakapoor
Algorithms
Project
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
DSA Sheet by Love Babbar
How to Start Learning DSA?
K means Clustering - Introduction
Quadratic Probing in Hashing
Types of Complexity Classes | P, NP, CoNP, NP hard and NP complete
Working with zip files in Python
XML parsing in Python
Python | Simple GUI calculator using Tkinter
Implementing Web Scraping in Python with BeautifulSoup
Working with Images in Python