Tic Tac Toe game in C++

programming Dec 28, 2021

We are using C++ this time.
So lets start, We are using two libraries so lets import them first

#include <iostream>
#include <fstream> // For file manipulation

Then we have to declare a global variable right after importing both of the libraries

char square[10] = {'o','1','2','3','4','5','6','7','8','9'};

Displaying my name in ASCII art at the top

void Logo()  //Function to display Usman
{
    std::string line;

    #ifdef _WIN32  //Checking if opreating system is windows
        std::ifstream myfile ("logo.txt");
        if (myfile.is_open())
        {
        while ( getline (myfile,line)){
            std::cout <<"\t\t\t\t\t\t\t"<< line << '\n';
        }

        myfile.close();

    #elif __APPLE__ //Checking if opreating system is MacOS
        std::ifstream myfile ("/Users/matrix/Desktop/Tic Tac Toe/Tic Tac Toe/logo.txt");
        if (myfile.is_open())
        {
            while ( getline (myfile,line))
        {
            std::cout <<"\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<< line << '\n';
        }

        myfile.close();

    #endif
    }
}

Now we have to initiate a function which will be marking both of the players and assigning them there marks.

int marker(int player)  //Function for returning user
{
    if (player == 1)
    {
        return 'X';
    }
    else
    {
        return 'O';
    }
}

Now creating a clear function to clear our Command Line Interface (CLI) this will be used when we restart the game

void clearSquare() //To clear the CLI
{
    for(int i = 0; i<10; i++)
        square[i] = '0'+i;
}

One of the most important function in this game here is going to be VictoryChecker whose sole purpose is to compare blocks by other blocks and if theirs a match then voila!

int VictoryChecker() //compairing blocks by other blocks to check if player has won
{
    if (square[1] == square[2] && square[2] == square[3])
        return 1;

    else if (square[4] == square[5] && square[5] == square[6])
        return 1;

    else if (square[7] == square[8] && square[8] == square[9])
        return 1;

    else if (square[1] == square[4] && square[4] == square[7])
        return 1;

    else if (square[2] == square[5] && square[5] == square[8])
        return 1;

    else if (square[3] == square[6] && square[6] == square[9])
        return 1;

    else if (square[1] == square[5] && square[5] == square[9])
        return 1;

    else if (square[3] == square[5] && square[5] == square[7])

        return 1;
    else if (square[1] != '1' && square[2] != '2' && square[3] != '3'
                    && square[4] != '4' && square[5] != '5' && square[6] != '6'
                  && square[7] != '7' && square[8] != '8' && square[9] != '9')

        return 0;
    else
        return -1;
}

Now lets design our User Interface. Don't freak out its not Graphical instead we are using Command Line Interface approach here

void Cli() //Command Line Interface of the game.
{

    #ifdef _WIN32  //Checking if opreating system is windows

    system("cls"); // cls command to clear screen for windows
    Logo(); // Logo

    std::cout << "\t\t\t\t\t\t\t\t"<<"Tic Tac Toe"<< std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<< "Player 1 (X)  -  Player 2 (O)" << std::endl << std::endl << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl << std::endl;

    #elif __APPLE__ //Checking if opreating system is MacOS

    system("export TERM=xterm"); //clear command to clear screen for MacOS
    system("clear"); //clear command to clear screen for MacOS
    Logo(); // Logo

    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"Tic Tac Toe"<< std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<< "Player 1 (X)  -  Player 2 (O)" << std::endl << std::endl << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl << std::endl;
    #endif
}

Main function now

int main() //Main
    {
        bool replay=true;
        while (replay!=false){

        int player = 1,i;
        char choice, mark;

        do   // Checking Input given from user and compairing it with the box
        {
            Cli();

            if(player%2)
            {
                player=1;
            }
            else
            {
                player=2;
            }

            std::cout << "Player " << player << ", Choose the box: ";
            std::cin >> choice;

            mark=marker(player);

            if (choice == '1' && square[1] == '1' && choice < '9')
                square[1] = mark;

            else if (choice == '2' && square[2] == '2' && choice < '9')
                square[2] = mark;

            else if (choice == '3' && square[3] == '3' && choice < '9')
                square[3] = mark;

            else if (choice == '4' && square[4] == '4' && choice < '9')
                square[4] = mark;

            else if (choice == '5' && square[5] == '5' && choice < '9')
                square[5] = mark;

            else if (choice == '6' && square[6] == '6' && choice < '9')
                square[6] = mark;

            else if (choice == '7' && square[7] == '7' && choice < '9')
                square[7] = mark;

            else if (choice == '8' && square[8] == '8' && choice < '9')
                square[8] = mark;

            else if (choice == '9' && square[9] == '9' && choice <= '9')
                square[9] = mark;

            else  // To handle the crap shit user might input
            {
                std::cout<<"Invalid move "<<std::endl;

                player--;

            }
            player++;
            i=VictoryChecker();

            } while(i==-1);

        Cli();

        if(i==1)
        {
            std::cout<<"Player "<<--player<<" has Won! "<<std::endl;//Decrementing the Player value so in output it shows which player won
        }
        else
        {

            std::cout<<"Game draw - No one has WON!"<<std::endl;
        }

        std::string Replay;
        std::cout<<"Would you like to try your luck again? and play "<<std::endl;
        std::cin>>Replay;

            if(Replay == "y"|| "yes" || "Yes" ||"YES" ||"Y" || "ye" || "Ye" ||"yas" ||"Yas"){ //sasti try to catch all types crap shit input user my enter
                clearSquare();
                        }
                else
                    {
                   exit(0); //explicitly exiting.
                    }
        }}

All code at one place now


//
//  main.cpp
//  Tic Tac Toe
//
//  Created by Usman Rizwan on 22/1/21
//

#include <iostream>
#include <fstream> // For file manipulation


char square[10] = {'o','1','2','3','4','5','6','7','8','9'};

void Logo()  //Function to display Usman
{
    std::string line;

    #ifdef _WIN32  //Checking if opreating system is windows
        std::ifstream myfile ("logo.txt");
        if (myfile.is_open())
        {
        while ( getline (myfile,line)){
            std::cout <<"\t\t\t\t\t\t\t"<< line << '\n';
        }

        myfile.close();

    #elif __APPLE__ //Checking if opreating system is MacOS
        std::ifstream myfile ("/Users/matrix/Desktop/Tic Tac Toe/Tic Tac Toe/logo.txt");
        if (myfile.is_open())
        {
            while ( getline (myfile,line))
        {
            std::cout <<"\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<< line << '\n';
        }

        myfile.close();

    #endif
    }
}
int marker(int player)  //Function for returning user
{
    if (player == 1)
    {
        return 'X';
    }
    else
    {
        return 'O';
    }
}

void clearSquare() //To clear the CLI
{
    for(int i = 0; i<10; i++)
        square[i] = '0'+i;
}

int VictoryChecker() //compairing blocks by other blocks to check if player has won
{
    if (square[1] == square[2] && square[2] == square[3])
        return 1;

    else if (square[4] == square[5] && square[5] == square[6])
        return 1;

    else if (square[7] == square[8] && square[8] == square[9])
        return 1;

    else if (square[1] == square[4] && square[4] == square[7])
        return 1;

    else if (square[2] == square[5] && square[5] == square[8])
        return 1;

    else if (square[3] == square[6] && square[6] == square[9])
        return 1;

    else if (square[1] == square[5] && square[5] == square[9])
        return 1;

    else if (square[3] == square[5] && square[5] == square[7])

        return 1;
    else if (square[1] != '1' && square[2] != '2' && square[3] != '3'
                    && square[4] != '4' && square[5] != '5' && square[6] != '6'
                  && square[7] != '7' && square[8] != '8' && square[9] != '9')

        return 0;
    else
        return -1;
}

void Cli() //Command Line Interface of the game.
{

    #ifdef _WIN32  //Checking if opreating system is windows

    system("cls"); // cls command to clear screen for windows
    Logo(); // Logo

    std::cout << "\t\t\t\t\t\t\t\t"<<"Tic Tac Toe"<< std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<< "Player 1 (X)  -  Player 2 (O)" << std::endl << std::endl << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl << std::endl;

    #elif __APPLE__ //Checking if opreating system is MacOS

    system("export TERM=xterm"); //clear command to clear screen for MacOS
    system("clear"); //clear command to clear screen for MacOS
    Logo(); // Logo

    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"Tic Tac Toe"<< std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<< "Player 1 (X)  -  Player 2 (O)" << std::endl << std::endl << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"_____|_____|_____" << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << std::endl;
    std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"<<"     |     |     " << std::endl << std::endl;
    #endif
}
    int main() //Main
    {
        bool replay=true;
        while (replay!=false){

        int player = 1,i;
        char choice, mark;

        do   // Checking Input given from user and compairing it with the box
        {
            Cli();

            if(player%2)
            {
                player=1;
            }
            else
            {
                player=2;
            }

            std::cout << "Player " << player << ", Choose the box: ";
            std::cin >> choice;

            mark=marker(player);

            if (choice == '1' && square[1] == '1' && choice < '9')
                square[1] = mark;

            else if (choice == '2' && square[2] == '2' && choice < '9')
                square[2] = mark;

            else if (choice == '3' && square[3] == '3' && choice < '9')
                square[3] = mark;

            else if (choice == '4' && square[4] == '4' && choice < '9')
                square[4] = mark;

            else if (choice == '5' && square[5] == '5' && choice < '9')
                square[5] = mark;

            else if (choice == '6' && square[6] == '6' && choice < '9')
                square[6] = mark;

            else if (choice == '7' && square[7] == '7' && choice < '9')
                square[7] = mark;

            else if (choice == '8' && square[8] == '8' && choice < '9')
                square[8] = mark;

            else if (choice == '9' && square[9] == '9' && choice <= '9')
                square[9] = mark;

            else  // To handle the crap shit user might input
            {
                std::cout<<"Invalid move "<<std::endl;

                player--;

            }
            player++;
            i=VictoryChecker();

            } while(i==-1);

        Cli();

        if(i==1)
        {
            std::cout<<"Player "<<--player<<" has Won! "<<std::endl;//Decrementing the Player value so in output it shows which player won
        }
        else
        {

            std::cout<<"Game draw - No one has WON!"<<std::endl;
        }

        std::string Replay;
        std::cout<<"Would you like to try your luck again? and play "<<std::endl;
        std::cin>>Replay;

            if(Replay == "y"|| "yes" || "Yes" ||"YES" ||"Y" || "ye" || "Ye" ||"yas" ||"Yas"){ //sasti try to catch all types crap shit input user my enter
                clearSquare();
                        }
                else
                    {
                   exit(0); //explicitly exiting.
                    }
        }}

Complete Xcode project and source code can be found here
Huge credits to one of my most favorite teacher Sir Haroon for helping me in this project.

Tags

Usman Razwan

Works in the dark to serve the light, Dev Ops engineer for Pluto Networks