In: Computer Science
In C, build a connect 4 game with no graphical use interface. Build only the text interface. Use a 2D array as the Data structure. The skeleton of the game is provided for you, Build the game based on the guidelines below. The game does NOT need a mode where you play against the computer. It is simply a game of Connect 4 between player 1 and player 2.
SKELETON:
#include
// Initializing constants
#define NAME_LENGTH 30
#define BOARD_WIDTH 6
#define BOARD_HEIGHT 6
#define GAME 0
#define P_ONE 1
#define P_TWO 2
#define NO 0
#define YES 1
// Declaring variables
char p1[NAME_LENGTH];
char p2[NAME_LENGTH];
int bWidth = BOARD_WIDTH;
int bHeight = BOARD_HEIGHT;
int playCurrent = P_ONE; // Player 1 starts by default
int gameOver = GAME; // GAME = game is running, P_ONE = player one
has won and so on
int p1Quit = NO;
int p2Quit = NO;
//print “Setting up the game”. Ask each player their name.
void Initialization() {
        printf("Setting up the
game\n");
        printf("Enter your
names\n");
        printf("Player
1:\n");
        scanf("%s", p1);
        printf("Player
2:\n");
        scanf("%s", p2);
}
void Teardown() {
        printf("Destroying the
game\n");
}
/*accept a letter for which column of the game we are going to drop a disc into. Valid letters are A-G (7 columns). You should designate a letter for “Quit the game”. Input must be returned from this function*/
char AcceptInput() {
        char c;
        int valid = 0;
        do {
               
printf("Player %d:\n", playCurrent);
               
printf("Print a character to pick your column (A - G) or Q to
quit\n");
               
scanf(" %c", &c);
               
if (c < 'A' || (c > 'G' && c != 'Q')) printf("Invalid
character. Try again\n");
               
else break;
               
} while (1);
        return c;
}
/*pass the input data to this function. Since we do not have a “world” right now, choosing “A” is the “winning move”, all other letters make the game continue.*/
void UpdateWorld(char c) {
        if (c == 'Q') {
               
if (playCurrent == P_ONE) {
                       
p1Quit = YES;
                       
gameOver = P_TWO;
               
} else {
                       
p2Quit = YES;
                       
gameOver = P_ONE;
               
}
        }
        if (c == 'A') {
               
gameOver = playCurrent;
        }
        playCurrent =
playCurrent == P_ONE ? P_TWO : P_ONE;
}
//Print the result calculated in the state of the world
void DisplayWorld() {
        if (p1Quit == YES)
printf("Player 1 quit\n");
        if (p2Quit == YES)
printf("Player 2 quit\n");
        if (gameOver == GAME)
{
               
printf("Game is currently in process\n");
        } else {
               
printf("Player %d won\n", gameOver);
        }
}
/*call initialization, then loop until a flag is set (game over or a player quit), calling accept input, update and display. Outside of the loop, call teardown.*/
int main() {
        Initialization();
        while (gameOver == GAME
&& p1Quit == NO && p2Quit == NO) {
               
char c;
               
c = AcceptInput();
               
UpdateWorld(c);
               
DisplayWorld();
        }
        Teardown();
        return 0;
}
Connect Four is a game that alternates player 1 and player 2. You should keep track of whose turn it is next. Here are the guidelines for building the game.
Solution: below here is the C code for building this game
#include<stdio.h>
#include<string.h>
#include<string.h>
#include<math.h>
#include<windows.h>
#include<conio.h>
char check[4];
char yes[]="yes";
int  num_rows=12;
int num_cols=12;
int save_load();
int i=0,j=0,k,n,row,col,value,score_x=0,score_o=0,game_mode=0,number,Highscore,connecter=0,b=0,select_sides=0;
char board[100][100];
char read[10];
char name1[20];
char name2[20];
char save[]="save";
char sides[]="replace";
char red[]="redo";
char undo[]="undo";
char mains[]="start";
int position [100];
int redo[100];
void printboard();      //FUNCTIONS TO PRINT BOARD
void findposition();    //FUNCTION TO GET THE POSITION OF ELEMENT
void printnumber();     //FUNCTION TO PRINT NUMBER AND CHECK IT's VALIDTY
void scoreCheck();      //FUNCTION TO CHECK SCORE
void High_Score();      //FUNCTION TO DETERMINE THE HIGH SCORE
void select_side();     //FUNCTION TO SWAPE SELECT SIDES
void XML();             //FUNCTION TO READ FROM XML FILE
void instrctions();     //FUNCTIONS TO PRINT THE INSTRUCTIONS OF THE GAME
int main(){
    int flag=1;
    XML();              //FUNCTION TO READ FROM XML FILE
    findposition();     //FUNCTION TO GET THE POSITION OF ELEMENT
    start();            //FUNCTION FOR MAIN MENU
    score_o=0;score_x=0;b=0;                //NEW INTIALIZATION FOR NEW GAME
    while(flag==1){                         //FLAG TO START A NEW GAME
    printf("\nDo you want to go to main menue yes/no?");
    scanf("%s",&check);
    if(strcmp(check,yes)==0)start();        //ASKING FOR CONTINUE
    else flag=0;
    }
    return 0;
}
//FUNCTION TO STARTING THE MAIN MENU
void start(){
    XML();
    int choose;
    system("cls");                              //CLEAR SCREEN AFTER EACH PLAY
    for(i=0;i<15;i++)printf("\n");
    system("COLOR 1C");                         //CHANGING THE COLOR OF SCREEN
    printf("                              Welcome to connect four\n");              //WELCOME MESSAGE
    Sleep(1000);
    for(k=0;k<3;k++)printf("\n");
    system("COLOR EC");                           //CHANGING COLR OF THE SCREEN
    printf("                                   1-new game\n"                ////////////////////////////
           "                                   ----------  \n"              //                          //
          "                                   2-high scores\n"              //    MAIN MENU            //
          "                                   -------------\n"              ////////////////////////////
          "                                   3-load game\n"
          "                                   -----------\n"
          "                                   4-instruction\n"
          "                                   -------------      "
          "                                   \n");
    printf("choose from the previous options: \n");
    for(i=0;i<32;i++)printf("-");                                              //SCAN THE OPERATION TYPE FROM THE USER
    printf("\n");
    scanf("%d",&choose);                                                        //GET THE USER CHOOSE
    switch(choose){
        case 1: printnumber();break;
        case 2: High_Score();break;
        case 3: read[0]='l';save_load();printnumber();break;
        case 4: instrctions();break;
        default: printf("error please try again !!");
    }
}
void instrctions(){
    system("cls");                                       //PRINTING A NEW SCREEN
    system("COLOR 1C");
    printf("             **        HOW TO PLAY        ** \n\n\n");          //GAME INSTRUCTIONS
    printf("the aim of the game is to connect 4 (x) or 4 (0) vertically or\n horizontally or diagonally \n");
    printf("the player who connect 4 more than the other will be the winner\n\n\n");
    printf("press u or undo :    to go back one step , you can return back to first turn in the board\n");
    printf("press r or redo :    to go forward for one step, you can return the board again\n");
    printf("press s or save :    to save the game with its score \n");
    printf("to  load a game :    to load the game again you can use this option  \n                   just press start and choose load from menue\n");
    printf("press start     :    to go to main menue at any time\n");
    printf("press replace   :    to re-select sides this option can't be use in case of player v.s computer to prevent\n evil indeeds");
    char back[]="back";
    char main[6];
    printf("\n press back to return to main menue \n");         //GET BACK TO MAIN MENU TO CONTINUE PLAYING
    scanf("%s",&main);
    if(strcmp(main,back)==0){system("cls");start();}
}
//FUNCTION TO PRINT THE BOARD
void printboard(){
    int row,col,a,c;
    if(b==0){                               //INTIALIZATION TO BOARD WITH '.'
        for(a=0;a<num_rows;a++){
                for(c=0;c<num_cols;c++)
                board[a][c]='.';
        }
    }
    b++;
    system("cls");                          //TO CLEAR SCREEN AFTER EACH PLAY
    system("COLOR 4E");                     //TO COLOR THE BOARD
    for(row=0; row<num_rows; row++){        //PRINTING THE BOARD
        for(col=0; col<num_cols; col++){
            printf("| %c ",board[row][col]);
        }
        printf("|\n");
        for(a=0; a<num_cols; a++) printf("__");
        printf("\n");
    }
    for(a=0; a<num_cols; a++)printf("%*d",4,a+1);
    printf("\n");
}
//FUNCTION TO FIND THE POSITION OF ELEMENTS IN BOARD
void findposition(){
    for(i=0; i<num_cols; i++){
        position[i]=num_rows-1;
    }
}
//FUNCTION TO PRINT THE X & O AND CHECK THE BOARD
void printnumber(){
    if(read[0]!='l'){
    printf("choose the game mode \n");
    printf("--------------------\n");
    printf("                         1) Player V.s Player \n                         2) Player V.s Computer \n                         3)player V.s hard computer\n");
    scanf("%d",&game_mode);                 //GET THE GAME MODE FROM THE USER
    b=0;
    printboard();                           //FUNCTION TO PRINT BOARD
    findposition();                         //FUNCTION TO GET THE POSITION OF ELEMENT
    }
    printf("please enter player (1) name: ");       //GETTING THE PLAYERS NAME FROM THE USER
    scanf("%s",&name1);
        if(game_mode==1){
    printf("please enter player (2) name: ");
        scanf("%s",&name2);
        }
    for(i=connecter; i<num_cols*num_rows+select_sides; i++){
        if(i%2==0){                         //SWAPING TURNS
            printf(" %s's turn\n choose the column to put x in: ",name1);       //PRINTING PLAYER'S TURNS
            scanf("%s",&read);
            number=atoi(read);
        }else{
            if (game_mode==1) player2();                    //CALLING THE FUNCTIONS OF PLAYERS MODE
            else if(game_mode==2)computer();
            else medium_computer();
        }
        if(strcmp(read,sides)==0){select_side();i--;}
        else if(strcmp(read,mains)==0){
                XML();
                printf("WARNING the game won't be save\n do you want to save yes/no ? ");           //WARNING IN CASE OF NOT SAVING FILE
                scanf("%s",check);
                if(strcmp(check,yes)==0){
                    read[0]='s';
                    save_load();
                }
                score_x=0;score_o=0;findposition();b=0;printboard();
                start();
                break;
        }
       else if(strcmp(read,save)==0||(read[0]=='s'&&read[1]=='\0')){     //COMPARISON IF THE USER WANT TO SAVE OR LOAD
            save_load();
            i--;
        }else if((read[0]=='r'&&read[1]=='\0')||strcmp(read,red)==0||(read[0]=='u'&&read[1]=='\0')||strcmp(read,undo)==0){    //CHECK FOR UNDO AND REDO
            redo_undo();
        }else if(number<1||number>num_cols||board[0][number-1]!='.'){                   //BOARD LIMITS
            printf("out of scoop please try again\n");
            i--;
        }else{                                                 //PRINTING X AND O
            redo[i]=number-1;
            value=position[number-1];
            if(i%2==0)board[value][number-1]= 'X';
            else board[value][number-1]= 'O';
            position[number-1] -=1;
            scoreCheck ();                                  //CHECK SCORE
            printboard();                                   //PRINTING THE BOARD
            if(i%2==0) system("COLOR 5E");                  //CHANGING THE COLOR OF SCREEN FOR EACH PLAYER
            else system("COLOR BC");
            printf("Score X =  %d    Score O =%d\n ",score_x,score_o);          //PRINTING THE SCORE
             printf("             **        HOW TO PLAY        ** \n\n\n");          //GAME INSTRUCTIONS
            printf("the aim of the game is to connect 4 (x) or 4 (0) vertically or\n horizontally or diagonally \n");
            printf("the player who connect 4 more than the other will be the winner\n\n\n");
            printf("press u or undo :    to go back one step , you can return back to first turn in the board\n");
            printf("press r or redo :    to go forward for one step, you can return the board again\n");
            printf("press s or save :    to save the game with its score \n");
            printf("to  load a game :    to load the game again you can use this option  \n                   just press start and choose load from menue\n");
            printf("press start     :    to go to main menue at any time\n");
            printf("press replace   :    to re-select sides this option can't be use in case of player v.s computer to prevent\n evil indeeds\n");
        }
    }
    if(i==num_rows*num_cols) {
            High_Score();                    //CALLING HIGH SCORE FUNCTION WHEN GAME IS ENDED
            printf("\nDo you want to save ? (yes/no ) \n");
            scanf("%s",&check);
            if(strcmp(check,yes)==0){
                read[0]='s';
                save_load();
            }
    }
}
//FUNCTION TO CHECK CONNECT FOUR OR NOT
char  checkFour(int a_1,int a_2,int b_1,int b_2,int c_1,int c_2,int d_1,int d_2){
    if (board[a_1][a_2]==board[b_1][b_2]&&board[b_1][b_2]==board[c_1][c_2]&&board[c_1][c_2]==board[d_1][d_2]&&board[a_1][a_2]!='.')
        return board[a_1][a_2];
    return 'a';
}
//FUNCTION TO CHECK SCORE AFTER EACH PLAY
void scoreCheck (){
    int i=1,j=1,counter =0,a,c=1,b=-1;
    for(a=0; a<4; a++){
        i=-i;
        j=j*pow(-1,counter); //LOOPING TO CHCK SCORE IN FOUR DIRECTIONS
        counter++;
        if(num_rows>value+i*3&&value+i*3>=0&&num_cols>number-1+j*3&&number-1+j*3>=0){
            if('X'==checkFour(value,number-1,value+i,number-1+j,value+i*2,number-1+j*2,value+i*3,number-1+j*3)) score_x+=1;
            if('O'==checkFour(value,number-1,value+i,number-1+j,value+i*2,number-1+j*2,value+i*3,number-1+j*3)) score_o+=1;
        }
        if ('X'==checkFour(value,number-1,value+j,number-1+i,value-j,number-1-i,value-2*j,number-1-2*i)) score_x+=1;
        if ('O'==checkFour(value,number-1,value+j,number-1+i,value-j,number-1-i,value-2*j,number-1-2*i)) score_o+=1;
    }
    for(a=0; a<2; a++){
        c=-c;
        b*=-1;
        if(num_rows>value+3*c&&value+3*c>=0){
            if('X'==checkFour(value,number-1,value+c,number-1,value+2*c,number-1,value+3*c,number-1))score_x+=1;
            if('O'==checkFour(value,number-1,value+c,number-1,value+2*c,number-1,value+3*c,number-1))score_o+=1;
        }
        if(num_cols>number-1+3*c&&number-1+3*c>=0){
            if('X'==checkFour(value,number-1,value,number-1+c,value,number-1+2*c,value,number-1+3*c))score_x+=1;
            if('O'==checkFour(value,number-1,value,number-1+c,value,number-1+2*c,value,number-1+3*c))score_o+=1;
        }
        if('X'==checkFour(value,number-1,value,number-1+b,value,number-1-b,value,number-1-2*b)&&value-2*b>=0)score_x+=1;
        if('O'==checkFour(value,number-1,value,number-1+b,value,number-1-b,value,number-1-2*b)&&value-2*b>=0)score_o+=1;
    }
}
//FUNCTION FOR UNDO AND REDO
void redo_undo(){
    int old_scorex=score_x;
    int old_scoreo=score_o;
    if(strcmp(read,undo)==0||(read[0]=='u'&&read[1]=='\0')){             //CALLING THE FUNCTION WHEN UUSER ENTER U OR UNDO
        i--;
        if(i<0) {}                                                       //IF I<0 HE CAN'T UNDO ANY STEP SO THIS FUNCTION IS USELESS
        else{
            int col = redo[i];
            number=col+1;
            value=position[number-1]+1;
            scoreCheck();                               //CHECKING THE SCORE
            if(score_x>old_scorex)score_x=score_x-2*(score_x-old_scorex);               //CECK THE NEW SCORE AFTER REDO
            if(score_o>old_scoreo)score_o=score_o-2*(score_o-old_scoreo);
            position[col]+=1;
            number=col+1;
            row=position[col];
            board[row][col]='.';
            i--;
            j++;
        }
    }
    else{
        if(j<1){
            i--;
        }else{
            int col=redo[i];
            row=position[col];
            if(i%2==0)board[row][col]='X';              //IT RETURNS THE X REMOVED BY UNDO FUNCTION
            else board[row][col]='O';
            position[col]-=1;
            value=row;number=col+1;
            scoreCheck();
            j--;
        }
    }
    printboard();                                               //CHEXK SCORE AFTER UNDO & REDO
    printf("Score X = %d    Score O =%d \n",score_x,score_o);   //PRINTING THE SCORE
}
//FUNCTION TO PLAY PLAYER VS PLAYER
int player2 (){
    printf("%s's turn\n choose the column to put 0 in: ",name2);          //PRINTING TURN TO PLAYER TWO
    scanf(" %s",read);                                          //SCAN THE NUMBR FROM PLAYER TWO
    number=atoi(read);
    return number;
}
//FUNCTION TO PLAY VS COMPUTER EASY
int computer (){
    printf("Computer  turn: ");
    if ((read[0] == 'u'&&read[1]=='\0')||strcmp(read,undo)==0) return;           //FOR UNDO AND REDO RETURN NOTHING TO GET BACK FOR PLAYER TURN
    else{
        number=1+(rand()%num_cols);                     //COMPUTER PLAYING IN A RANDOM WAY
        return number;
    }
}
//FUNCTION FOR SAVE AND LOAD BINRY !!!!!!!!
int save_load(){
    int k=num_rows-1 ,n,load;       //INTIALIZATION AND DECLERATION VARAIABLES
    static int counter=6;
    char byte = 0;
    FILE*save;
    if((read[0]=='s'&&read[1]=='\0')||strcmp(read,save)==0){
            char fileName[100],str[100] ;
        puts("enter the file name : ");                     //GET THE FILE NAME FROM THE USER
        scanf("%s",fileName);
        sprintf(str,"%s%s",fileName,".shehab");             //ADD THE EXE TO THE FILE NAME
        FILE*save=fopen(str,"wb");                          //OPEN THE FILE FOR WRITE BINRY
         byte |= num_cols<<4;
            byte |= num_rows;
            fprintf(save,"%c",byte);
            byte=0;
        for(n=0;n<num_cols;n++){
            k=num_rows-1;
            while(k>=0){                                    //WRITING IN BINRY FILE
                if(board[k][n]=='X')load=3;
                else if(board[k][n]=='O')load=2;
                else if(board[k][n]=='.')load=0;
                byte |= load<<counter;                      //SHIFTING THE BITS
                counter-=2;
                if(counter==-2){
                    counter=6;
                    fprintf(save,"%c",byte);
                    byte = 0;
                }if(load==0)break;
                k--;
            }
        }
        if(counter!=-2)fprintf(save,"%c",byte);
        fclose(save);
        printf("Do you want to continue yes/no ? \n");
        scanf(" %s",&check);
        if(strcmp(yes,check)==0){}
        else exit(main);
    }
   else if(read[0]=='l'){     //LOADING THE BINRY FILE
        i=0;
        char fileName[100],str[100] ;               //DECLARTION
        puts("enter the file name : ");             //GET THE FILE NAME FROM THE USER
        scanf("%s",fileName);
        strcat(fileName, ".shehab");                 //ADD THE EXETO THE FILE NAME
        sscanf(str,"%s",fileName);
        printf(" 1) Player V.s Player \n 2) Player V.s Computer \n 3) medium computer \n");
        scanf("%d",&game_mode);                        //ASK THE USER FOR GAME LOADING MODE
        save=fopen(fileName,"rb");                     //READ BINRY FROM THE FILE
        fscanf(save,"%c",&byte);
        num_rows= byte &0xF;
        num_cols= (byte>>4)&0xF;
        b=0;findposition();printboard();system("cls");
        counter = 6;
        for(n=0;n<num_cols;n++){
            k=num_rows-1;
            while(k>=0){                            //SHIFTING AND READING FROM BINRY FILE
                if (counter == 6) {
                    fscanf(save,"%c",&byte);
                }
                load = (byte>>counter) & 3;
                if (load == 0) {
                } else if (load == 2) {
                    i++;connecter++;
                    board[k][n]='O';
                    value=k;number=n+1;
                    position[number-1]--;
                    scoreCheck();                            //CHECK THE SCORE AFTER READING
                } else if (load == 3) {
                    i++;connecter++;
                    board[k][n]='X';
                    value=k;number=n+1;
                    position[number-1]--;
                    scoreCheck();
                }
                counter-=2;
                if(counter==-2){
                    counter=6;
                }
                k--;
            if (load==0)break;
        }
    }fclose(save);                      //closing the file
    printboard();
    printf("Score X = %d    Score O =%d \n",score_x,score_o);       //PRINTING THE SCORE
    }
}
//AI FUNCTION FOR PLAYING VS COMPUTER
int medium_computer(){
    // THE FIRST PART OF AI THE MAIN IDEA OF THE AI IS WHEN THE TURN IS TO COMPUTER THE COMPUTER PUT X IN THE BOARD AND IF THE SCORE OF X INC. THEN
    // IT'S THE BEST PLACE FOR O TO PREVENT X FROM CONNECTING FOUR
    //IF THERE IS NO DANGER FROM X TO WIN SO THE COMPUTER STARTS TO THINK ABOUT THE BEST WAY TO PLAY SO IT'S SCORE INC.
    int old_scorex=score_x;
    int old_scoreo=score_o;
    //CONNECT_4X REFERS TO ANY  FOUR X
    //CONNECT3_X REFERES TO EVERY THREE X AFTER EACH OTHER
    //CONNECT4_0 REFERES TO EVERY FOUR O AFTER EACH OTHER
    //CONNECT3_0 REFERES TO EVERY THREE O AFTER EACH OTHER
    //CONNECT2_0 REFERES TO EVERY TWO O AFTER EACH OTHER
    //CONNECT1_0 REFERES TO EVERY ONE O AND HAVE 3 SPACES AFTER IT OR BEFORE IT
    int connect4_x=-1,connect3_x=-1 , connect4_o=-1,connect3_o=-1,connect2_o=-1,connect1_o=-1;
    int num=number,critical;
    number=number-4;
    //HERE THE COMPUTER START TO DETECT THE BEST WAY FOR O TO PREVENT X FROM WINNIG
    for(k=-3; k<=3; k++){
        number++;
        if(number<1||position[number-1]==-1||number>num_cols){
            continue;
        }else{
            value=position[number-1];
            board[value][number-1]= 'X';
            scoreCheck();
            board[value][number-1]= '.';
            if(score_x-old_scorex>0){
                connect4_x=number;
                score_x=old_scorex;
            }
            score_x=old_scorex;
            if(score_x-old_scorex>0)break;
        }
    }
    //AFTER COMPUTER FAIL IN FINDING THE PLACE WHERE IF X PLAYS ON IT WILL WIN HE BEGIN TO CHECK ONE CASE IF THERE IS 2 X ON THE
    //SAME ROW AND HAS TWO OR MORE SPACE BEFORE AND AFTER IT HE CONSIDER THIS CASE AS A CRITICAL ONE AND PREDICT WITH 2 STEPS
    if(connect4_x==-1){
        number=num;
        value=position[number-1];
        if(board[value+1][number-2]=='X' && ((value+1==position[number]&&value+1==position[number+1]&&value+1==position[number-3])||(value+1==position[number]&&value+1==position[number-3]&&value+1==position[number-4])))
            connect3_x=number+1;
        else if((board[value+1][number]=='X')&& ((value+1==position[number+1]&&value+1==position[number+2]&&value+1==position[number-2])||(value+1==position[number-2]&&value+1==position[number-3]&&value+1==position[number+1])))
            connect3_x=number-1;
    }
    //AFTER HE FAILS TO DEFENCE HE TRIES TO ATTACK
    //HE WILL CHECK THE BEST WAY TO PLAY O TO WIN
    if(connect3_x==-1&&connect4_x==-1){
        for(n=0; n<num_cols; n++){
            number=n+1;
            if(position[n]>=0){
                value=position[n];
                board[value][n]='O';
                number=n+1;
                scoreCheck();
                if(score_o-old_scoreo>0){
                    connect4_o=number;
                    score_o=old_scoreo;
                    score_x=old_scorex;
                }
                 score_o=old_scoreo;
                 score_x=old_scorex;
            }
            if(n<num_cols-1&&connect4_o==-1&&position[n+1]>=0){
                value=position[n+1];
                board[value][n+1]='O';
                number=n+2;
                scoreCheck();
                if (score_o-old_scoreo>0){
                    connect3_o=number;
                    score_o=old_scoreo;
                    score_x=old_scorex;
                }
                 score_o=old_scoreo;
                 score_x=old_scorex;
            }
            if(n<num_cols-2&&connect3_o==-1&&position[n+2]>=0&&connect4_o==-1){
                value=position[n+2];
                board[value][n+2]='O';
                number=n+3;
                scoreCheck();
                if (score_o-old_scoreo>0){
                    connect2_o=number;
                    score_o=old_scoreo;
                    score_x=old_scorex;
                }
                 score_o=old_scoreo;
                 score_x=old_scorex;
            }
            if(n<num_cols-3&&connect2_o==-1&&position[n+3]>=0&&connect3_o==-1&&connect4_o==-1){
                value=position[n+3];
                board[value][n+3]='O';
               number=n+4;
                scoreCheck();
                if(score_o-old_scoreo>0){
                    connect1_o=number;
                    score_o=old_scoreo;
                    score_x=old_scorex;
                }
                 score_o=old_scoreo;
                 score_x=old_scorex;
            }
            if(position[n]>=0){
                value=position[n];
                board[value][n]='.';
            }
            if(n<num_cols-1&&position[n+1]>=0){
                value=position[n+1];
                board[value][n+1]='.';
            }
            if(n<num_cols-2&&position[n+2]>=0){
                value=position[n+2];
                board[value][n+2]='.';
            }
            if(n<num_cols-3&&position[n+3]>=0){
                value=position[n+3];
                board[value][n+3]='.';
            }
        }
    }
    number=num;
    if ((read[0]=='u'&&read[1]=='\0')||strcmp(read,undo)==0||strcmp(read,sides)==0){
        return ;
    }else if(connect4_x>-1){
        number=connect4_x;
        return number;
    }else if(connect3_x>-1){
        number=connect3_x;
        return number;
    }else if(connect4_o>-1){
        number=connect4_o;
        return number;
    }else if(connect3_o>-1){
        number=connect3_o;
        return number;
    }else if(connect2_o>-1){
        number=connect2_o;
        return number;
    }else if(connect1_o>-1){
        number=connect1_o;
        return number;
    }else {
            for(n=0;n<num_cols;n++){
                    value=position[n];
                if (board[value][n]=='.'){
                number=n+1;
                return number;
                }
            }
    }
}
//FUNCTION TO READ FROM XML FILE
void XML (){
    //START REFEERE TO START OF INDEX TO CONFIGURATION TAG
    //END REFEERE TO END OF INDEX OF CONFIGURATION TAGG
    //START _W REFEERE TO STARTING INDEX OF WIDTH TAG
    //END_W REFEERE TO ENDING INDEX OF WIDTH TAG
    //START _H REFFERE TO START INDEX OF HEIGHT TAG
    //END_H REFFERE TO END INDEX OF HIEGHT TAG
    //START HS REFFERE TO START INDEX OF HIGHSCORES TAG
    //END_HS REFFERE TO END INDEX OF HIGHSCORE TAG
    //LEN REFFERE TO THE LENGTH BETWEEN TWO CONFIGURTIONS
    //a IN A COUNTER
    // HS ------> HIGHSSCORE    H -------> HEIGHT      W ---------> WIDTH
    char y,x[200]= {'0'},conf_1[]="<Configurations>",width_1[]="<Width>",height_1[]="<Height>",highscores_1[]="<Highscores>";
    char conf_2[]="</Configurations>",width_2[]="</Width>",height_2[]="</Height>",highscores_2[]="</Highscores>";
    int i=0,start,end,start_w,end_w,start_h,end_h,start_hs,end_hs,len,a,size,HS,H,W;
    FILE *file= fopen("project.xml", "r");              //READING FROM THE FILE
    while((y=fgetc(file))!=EOF){
        if(y!=' '&&y!='\n'&&y!='\t'){           //IGNORING ANY SPACES OR TABS OR BREAKING LINE
            x[i]=y;
            i++;
            len++;
        }
    }
    start=over_lapping(conf_1,x);               //CALLING OVERLAPPING FUNCTION
    end =over_lapping(conf_2,x);
    size=end-start+1;
    char array[size];                           //ARRAY TO RED BETWEEN TWO CONFIGRATIONS TAGS
    for(a=0; a<size; a++)array[a]=x[start+a];   // INTIALIZATION FOR NWE ARRAY
    start_w=over_lapping(width_1,array);
    end_w=over_lapping(width_2,array);
    char row [3];                               //CHECKING OPENING AND CLOSING THE TAGS IN RIGHT WAY
    row[0]=array[start_w+7];
    row[1]=array[start_w+8];
    row[2]='\0';
    if(start_w!=-1&&end_w!=-1&&(end_w-start_w==8||end_w-start_w==9)&&atoi(row)>=4) W=atoi(row);
    else{                                       //SET THE DEFULT IN THERE IS WRONG IN READING THE XML FILE
        system("COLOR 8C");
        W=7;
        printf("Width is Not found !! the defult is Width =7\n");
        printf("Wait to load the default!!\n");
        Sleep(5000);
    }
    start_h=over_lapping(height_1,array);       //CALLING THE OVERLAPPING FUNCTION
    end_h=over_lapping(height_2,array);
    char col [3];                                  //CHECK OPENING AND CLOSING THE TAGS IN WRIGHT WAY
    col[0]=array[start_h+8];
    col[1]=array[start_h+9];
    col[2]='\0';
    if(start_h!=-1&&end_h!=-1&&(end_h-start_h==9||end_h-start_h==10)&&atoi(col)>=4)H=atoi(col);
    else{
        H=6;                                        //SET THE DEFULT IF THERE IS ERROR WHILE READING FROM XML FILE
        printf("Height is Not found !! the defult is Height =6\n");
        printf("Wait to load the default!!\n");
        Sleep(5000);
    }
    start_hs=over_lapping(highscores_1,array);
    end_hs=over_lapping(highscores_2,array);        //CALLING OVER LAPPING FUNCTIONS
    char score[3];
    score[0]=array[start_hs+12];                    //PUTTING BETWEEN TAGS IN ARRAY FOR READING WITH ATOI
    score[1]=array[start_hs+13];
    score[2]='\0';
    if(start_hs!=-1&&end_hs!=-1&&end_hs-start_hs==13||end_hs-start_hs==14)HS=atoi(score);
    else{
        HS=5;                                       //SET THE DEFULT VALUE
        printf("High_score is Not found !! the defult is Highscore =5\n");      //PRINTING ERROR
        printf("Wait to load the default!!\n");                                 //ERROR MESSAGE
        Sleep(5000);
    }
    num_cols=W;                                     //CHANGING THE GLOBAL VALUE FOR WIDTH
    num_rows=H;                                     //CHANGING THE GLOBAL VALUE FOR HEIGHT
    Highscore=HS;                                   //CHANGING THE GLOBAL VAUE FOR HIGH SCORE
}
//FUNCTION TO CHECK IF WORD IS FOUND IN STRING OR NOT
int over_lapping(char s1[],char s2[]){
    int counter=-1,i=0;
    while(s2[i]!='\0'){
        int j=0;
        if(s2[i]==s1[j]){
            int k=i;
            while(s2[k]==s1[j] && s1[j]!='\0'){
                k++;
                j++;
            }
            if(s1[j]=='\0'){
                counter=i;
            }
        }
        i++;
    }
    return counter;
}
//FUNCTION TO PRINT THE HIGH SCORE LIST
void High_Score(){
    int scores[100]= {0},i,counter=-1,j=0,temp=0;
    FILE *file= fopen("High_scores.text", "r");         //READING FROM THE FILE
    for(i=0; i<20; i++){
        fscanf(file,"%d",&scores[i]);
        if(scores[i]!=0) counter++;
    }
    if(score_x>score_o) scores[counter+1]=score_x;
    else  scores[counter+1]=score_o;
    for(i=0; i<Highscore; i++){             //SORTING THE ARRAY FOR PRINTING
        for(j=0; j<Highscore; j++)
            if(scores[j]<scores[i]){
                temp=scores[i];
                scores[i]=scores[j];
                scores[j]=temp;
            }
    }
    printf("HIGH SCORE LIST IS : ");                    //PRINING THE HIGH SCORE LIST
    file= fopen("High_scores.text", "w");               // WRITING THE HIGH SCORE LIST IN FILE
    for(i=0; i<Highscore; i++){
        printf("%d   ",scores[i]);
        fprintf(file,"%d  ",scores[i]);
    }
    fclose(file);
}
//FUNCTIONS TO SWAPE SELECT SIDES OF TWO PLAYERS
void select_side(){
    if(game_mode==1){
        printf("Enter the new name for %s :",name1);        //GETTING THE USER NAME
        scanf("%s",&name1);
        printf("Enter the new name for %s :",name2);
        scanf("%s",&name2);
        select_sides=1;
    }
}
**Fell free to ask any queries in the comment section. I am happy to help. if you like our work, please give Thumbs up**