Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.70 KB | None | 0 0
  1. //CONNECT FOUR PROJECT
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<string.h>
  5. #include<math.h>
  6. #include<windows.h>
  7. #include<conio.h>
  8. #include<stdlib.h>
  9. char check[4], yes[]="yes";
  10. int  num_rows=6, num_cols=7;
  11. int save_load();
  12. int i=0,j=0,k,n,row,col,value,score_x=0,score_o=0,game_mode=1,number,connecter=0,b=0,select_sides=0;
  13. char board[100][100];
  14. char read[10], name1[20];
  15. char name2[20];
  16. char save[]="save";
  17. char sides[]="replace";
  18. char mains[]="start";
  19. int position [100];
  20. void printboard();      //FUNCTIONS TO PRINT BOARD
  21. void findposition();    //FUNCTION TO GET THE POSITION OF ELEMENT
  22. void printnumber();     //FUNCTION TO PRINT NUMBER AND CHECK IT's VALIDTY
  23. void scoreCheck();      //FUNCTION TO CHECK SCORE
  24. void select_side();     //FUNCTION TO SWAPE SELECT SIDES
  25. void XML();             //FUNCTION TO READ FROM XML FILE
  26. void exit_program();
  27. void start();
  28. int main(){
  29.     int flag=1;
  30.     XML();              //FUNCTION TO READ FROM XML FILE
  31.     findposition();     //FUNCTION TO GET THE POSITION OF ELEMENT
  32.     start();            //FUNCTION FOR MAIN MENU
  33.     score_o=0;score_x=0;b=0;                //NEW INTIALIZATION FOR NEW GAME
  34.     while(flag==1){                         //FLAG TO START A NEW GAME
  35.     printf("\nDo you want to go to main menue yes/no?");
  36.     scanf("%s",&check);
  37.     if(strcmp(check,yes)==0)start();        //ASKING FOR CONTINUE
  38.     else flag=0;
  39.     }
  40.     return 0;
  41. }
  42. //FUNCTION TO STARTING THE MAIN MENU
  43. void start(){
  44.     XML();
  45.     int choose;
  46.     system("cls");                              //CLEAR SCREEN AFTER EACH PLAY
  47.     for(i=0;i<15;i++)printf("\n");
  48.     printf("                                    Connect-Four\n");              //WELCOME MESSAGE
  49.     for(k=0;k<3;k++)printf("\n");
  50.     printf("                                      1-new game\n"              
  51.           "                                   -------------\n"            
  52.           "                                    2-load game\n"            
  53.           "                                   -------------\n"    
  54.           "                                      3-exit\n"
  55.           "                                   -------------\n"      
  56.           "                                   \n");
  57.     printf("choose from the previous options: \n");
  58.     for(i=0;i<32;i++)printf("-");                                              //SCAN THE OPERATION TYPE FROM THE USER
  59.     printf("\n");
  60.     scanf("%d",&choose);                                                        //GET THE USER CHOOSE
  61.     switch(choose){
  62.         case 1: printnumber();break;
  63.         case 2: read[0]='l';save_load();printnumber();break;
  64.         case 3: exit_program();break;
  65.         default: printf("error please try again !!");
  66.     }
  67. }
  68. //FUNCTION TO PRINT THE BOARD
  69. void printboard(){
  70.     int row,col,a,c;
  71.     if(b==0){                               //INTIALIZATION TO BOARD WITH '.'
  72.         for(a=0;a<num_rows;a++){
  73.                 for(c=0;c<num_cols;c++)
  74.                 board[a][c]='.';
  75.         }
  76.     }
  77.     b++;
  78.     system("cls");                          //TO CLEAR SCREEN AFTER EACH PLAY
  79.     for(row=0; row<num_rows; row++){        //PRINTING THE BOARD
  80.         for(col=0; col<num_cols; col++){
  81.  
  82.             printf("| %c ",board[row][col]);
  83.         }
  84.         printf("|\n");
  85.         for(a=0; a<num_cols; a++) printf("____");
  86.         printf("\n");
  87.     }
  88.     for(a=0; a<num_cols; a++)printf("%*d",4,a+1);
  89.     printf("\n");
  90. }
  91. //FUNCTION TO FIND THE POSITION OF ELEMENTS IN BOARD
  92. void findposition(){
  93.     for(i=0; i<num_cols; i++){
  94.         position[i]=num_rows-1;
  95.     }
  96. }
  97. //FUNCTION TO PRINT THE X & O AND CHECK THE BOARD
  98. void printnumber(){
  99.  
  100.     if(read[0]!='l'){
  101.     // scanf("%d",&game_mode);                 //GET THE GAME MODE FROM THE USER
  102.     b=0;
  103.     printboard();                           //FUNCTION TO PRINT BOARD
  104.     findposition();                         //FUNCTION TO GET THE POSITION OF ELEMENT
  105.     }
  106.     printf("please enter player (1) name: ");       //GETTING THE PLAYERS NAME FROM THE USER
  107.     scanf("%s",&name1);
  108.     printf("please enter player (2) name: ");
  109.     scanf("%s",&name2);
  110.  
  111.     for(i=connecter; i<num_cols*num_rows+select_sides; i++){
  112.  
  113.         if(i%2==0){                         //SWAPING TURNS
  114.             printf(" %s's turn\n choose the column to put x in: ",name1);       //PRINTING PLAYER'S TURNS
  115.             scanf("%s",&read);
  116.             number=atoi(read);
  117.         }else{
  118.             player2();
  119.         }
  120.         if(strcmp(read,sides)==0){select_side();i--;}
  121.         else if(strcmp(read,mains)==0){
  122.                 XML();
  123.                 printf("WARNING the game won't be save\n do you want to save yes/no ? ");           //WARNING IN CASE OF NOT SAVING FILE
  124.                 scanf("%s",check);
  125.                 if(strcmp(check,yes)==0){
  126.                     read[0]='s';
  127.                     save_load();
  128.                 }
  129.                 score_x=0;score_o=0;findposition();b=0;printboard();
  130.                 start();
  131.                 break;
  132.         }
  133.        else if(strcmp(read,save)==0||(read[0]=='0'&&read[1]=='\0')){     //COMPARISON IF THE USER WANT TO SAVE OR LOAD
  134.  
  135.             save_load();
  136.             i--;
  137.         }else if(number<1||number>num_cols||board[0][number-1]!='.'){                   //BOARD LIMITS
  138.             printf("out of scoop please try again\n");
  139.             i--;
  140.         }else{                                                 //PRINTING X AND O
  141.             value=position[number-1];
  142.             if(i%2==0)board[value][number-1]= 'X';
  143.             else board[value][number-1]= 'O';
  144.             position[number-1] -=1;
  145.             scoreCheck ();                                  //CHECK SCORE
  146.             printboard();                                   //PRINTING THE BOARD
  147.             if(i%2==0);
  148.             else
  149.             printf("Score X =  %d    Score O =%d\n ",score_x,score_o);          //PRINTING THE SCORE
  150.             printf("press 0 : to save the game \n");
  151.             printf("press 1-7 : to choose empty \n");
  152.         }
  153.     }
  154.     if(i==num_rows*num_cols) {
  155.  
  156.             printf("\nDo you want to save ? (yes/no ) \n");
  157.             scanf("%s",&check);
  158.             if(strcmp(check,yes)==0){
  159.                 read[0]='s';
  160.                 save_load();
  161.             }
  162.     }
  163. }
  164. //FUNCTION TO CHECK CONNECT FOUR OR NOT
  165. 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){
  166.     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]!='.')
  167.         return board[a_1][a_2];
  168.     return 'a';
  169. }
  170. //FUNCTION TO CHECK SCORE AFTER EACH PLAY
  171. void scoreCheck (){
  172.     int i=1,j=1,counter =0,a,c=1,b=-1;
  173.     for(a=0; a<4; a++){
  174.         i=-i;
  175.         j=j*pow(-1,counter); //LOOPING TO CHCK SCORE IN FOUR DIRECTIONS
  176.         counter++;
  177.         if(num_rows>value+i*3&&value+i*3>=0&&num_cols>number-1+j*3&&number-1+j*3>=0){
  178.             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;
  179.             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;
  180.         }
  181.         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;
  182.         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;
  183.     }
  184.     for(a=0; a<2; a++){
  185.         c=-c;
  186.         b*=-1;
  187.         if(num_rows>value+3*c&&value+3*c>=0){
  188.             if('X'==checkFour(value,number-1,value+c,number-1,value+2*c,number-1,value+3*c,number-1))score_x+=1;
  189.             if('O'==checkFour(value,number-1,value+c,number-1,value+2*c,number-1,value+3*c,number-1))score_o+=1;
  190.         }
  191.         if(num_cols>number-1+3*c&&number-1+3*c>=0){
  192.             if('X'==checkFour(value,number-1,value,number-1+c,value,number-1+2*c,value,number-1+3*c))score_x+=1;
  193.             if('O'==checkFour(value,number-1,value,number-1+c,value,number-1+2*c,value,number-1+3*c))score_o+=1;
  194.         }
  195.         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;
  196.         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;
  197.     }
  198. }
  199. //FUNCTION TO PLAY PLAYER VS PLAYER
  200. int player2 (){
  201.  
  202.     printf("%s's turn\n choose the column to put 0 in: ",name2);          //PRINTING TURN TO PLAYER TWO
  203.     scanf(" %s",read);                                          //SCAN THE NUMBR FROM PLAYER TWO
  204.     number=atoi(read);
  205.     return number;
  206. }
  207. //FUNCTION FOR SAVE AND LOAD BINRY !!!!!!!!
  208. int save_load(){
  209.  
  210.     int k=num_rows-1 ,n,load;       //INTIALIZATION AND DECLERATION VARAIABLES
  211.     static int counter=6;
  212.     char byte = 0;
  213.     FILE*save;
  214.     if((read[0]=='0'&&read[1]=='\0')||strcmp(read,save)==0){
  215.  
  216.  
  217.             char fileName[100],str[100] ;
  218.         puts("enter the file name : ");                     //GET THE FILE NAME FROM THE USER
  219.         scanf("%s",fileName);
  220.         sprintf(str,"%s%s",fileName,".save");             //ADD THE EXE TO THE FILE NAME
  221.         FILE*save=fopen(str,"wb");                          //OPEN THE FILE FOR WRITE BINRY
  222.          byte |= num_cols<<4;
  223.             byte |= num_rows;
  224.             fprintf(save,"%c",byte);
  225.             byte=0;
  226.  
  227.         for(n=0;n<num_cols;n++){
  228.             k=num_rows-1;
  229.             while(k>=0){                                    //WRITING IN BINRY FILE
  230.                 if(board[k][n]=='X')load=3;
  231.                 else if(board[k][n]=='O')load=2;
  232.                 else if(board[k][n]=='.')load=0;
  233.                 byte |= load<<counter;                      //SHIFTING THE BITS
  234.                 counter-=2;
  235.                 if(counter==-2){
  236.                     counter=6;
  237.                     fprintf(save,"%c",byte);
  238.                     byte = 0;
  239.                 }if(load==0)break;
  240.                 k--;
  241.             }
  242.         }
  243.         if(counter!=-2)fprintf(save,"%c",byte);
  244.         fclose(save);
  245.         printf("Your file is saved '%s.file'.\n",fileName);
  246.         printf("Do you want to continue yes/no ? \n");
  247.         scanf(" %s",&check);
  248.         if(strcmp(yes,check)==0){}
  249.         else exit(main);
  250.     }
  251.    else if(read[0]=='l'){     //LOADING THE BINRY FILE
  252.  
  253.         i=0;
  254.         char fileName[100],str[100] ;               //DECLARTION
  255.         puts("enter the file name : ");             //GET THE FILE NAME FROM THE USER
  256.         scanf("%s",fileName);
  257.         strcat(fileName, ".shehab");                 //ADD THE EXETO THE FILE NAME
  258.         sscanf(str,"%s",fileName);
  259.         save=fopen(fileName,"rb");                     //READ BINRY FROM THE FILE
  260.         fscanf(save,"%c",&byte);
  261.  
  262.         num_rows= byte &0xF;
  263.         num_cols= (byte>>4)&0xF;
  264.  
  265.         b=0;findposition();printboard();system("cls");
  266.         counter = 6;
  267.         for(n=0;n<num_cols;n++){
  268.             k=num_rows-1;
  269.             while(k>=0){                            //SHIFTING AND READING FROM BINRY FILE
  270.                 if (counter == 6) {
  271.                     fscanf(save,"%c",&byte);
  272.                 }
  273.                 load = (byte>>counter) & 3;
  274.                 if (load == 0) {
  275.                 } else if (load == 2) {
  276.                     i++;connecter++;
  277.                     board[k][n]='O';
  278.                     value=k;number=n+1;
  279.                     position[number-1]--;
  280.                     scoreCheck();                            //CHECK THE SCORE AFTER READING
  281.                 } else if (load == 3) {
  282.                     i++;connecter++;
  283.                     board[k][n]='X';
  284.                     value=k;number=n+1;
  285.                     position[number-1]--;
  286.                     scoreCheck();
  287.                 }
  288.                 counter-=2;
  289.                 if(counter==-2){
  290.                     counter=6;
  291.                 }
  292.                 k--;
  293.             if (load==0)break;
  294.         }
  295.  
  296.     }fclose(save);                      //closing the file
  297.     printboard();
  298.     printf("Score X = %d    Score O =%d \n",score_x,score_o);       //PRINTING THE SCORE
  299.     }
  300. }
  301. //FUNCTION TO READ FROM XML FILE
  302. void XML (){
  303.     //START REFEERE TO START OF INDEX TO CONFIGURATION TAG
  304.     //END REFEERE TO END OF INDEX OF CONFIGURATION TAGG
  305.     //START _W REFEERE TO STARTING INDEX OF WIDTH TAG
  306.     //END_W REFEERE TO ENDING INDEX OF WIDTH TAG
  307.     //START _H REFFERE TO START INDEX OF HEIGHT TAG
  308.     //END_H REFFERE TO END INDEX OF HIEGHT TAG
  309.     //LEN REFFERE TO THE LENGTH BETWEEN TWO CONFIGURTIONS
  310.     //a IN A COUNTER
  311.     //H -------> HEIGHT      W ---------> WIDTH
  312.     char y,x[200]= {'0'},conf_1[]="<Configurations>",width_1[]="<Width>",height_1[]="<Height>";
  313.     char conf_2[]="</Configurations>",width_2[]="</Width>",height_2[]="</Height>";
  314.     int i=0,start,end,start_w,end_w,start_h,end_h,len,a,size,H,W;
  315.     FILE *file= fopen("project.xml", "r");              //READING FROM THE FILE
  316.     while((y=fgetc(file))!=EOF){
  317.         if(y!=' '&&y!='\n'&&y!='\t'){           //IGNORING ANY SPACES OR TABS OR BREAKING LINE
  318.             x[i]=y;
  319.             i++;
  320.             len++;
  321.         }
  322.     }
  323.     start=over_lapping(conf_1,x);               //CALLING OVERLAPPING FUNCTION
  324.     end =over_lapping(conf_2,x);
  325.     size=end-start+1;
  326.     char array[size];                           //ARRAY TO RED BETWEEN TWO CONFIGRATIONS TAGS
  327.     for(a=0; a<size; a++)array[a]=x[start+a];   // INTIALIZATION FOR NWE ARRAY
  328.     start_w=over_lapping(width_1,array);
  329.     end_w=over_lapping(width_2,array);
  330.     char row [3];                               //CHECKING OPENING AND CLOSING THE TAGS IN RIGHT WAY
  331.     row[0]=array[start_w+7];
  332.     row[1]=array[start_w+8];
  333.     row[2]='\0';
  334.     if(start_w!=-1&&end_w!=-1&&(end_w-start_w==8||end_w-start_w==9)&&atoi(row)>=4) W=atoi(row);
  335.  
  336.     else{                                       //SET THE DEFULT IN THERE IS WRONG IN READING THE XML FILE
  337.         W=7;
  338.         printf("Width is Not found !! the defult is Width =7\n");
  339.         printf("Wait to load the default!!\n");
  340.     }
  341.     start_h=over_lapping(height_1,array);       //CALLING THE OVERLAPPING FUNCTION
  342.     end_h=over_lapping(height_2,array);
  343.     char col [3];                                  //CHECK OPENING AND CLOSING THE TAGS IN WRIGHT WAY
  344.     col[0]=array[start_h+8];
  345.     col[1]=array[start_h+9];
  346.     col[2]='\0';
  347.     if(start_h!=-1&&end_h!=-1&&(end_h-start_h==9||end_h-start_h==10)&&atoi(col)>=4)H=atoi(col);
  348.     else{
  349.         H=6;                                        //SET THE DEFULT IF THERE IS ERROR WHILE READING FROM XML FILE
  350.         printf("Height is Not found !! the defult is Height =6\n");
  351.         printf("Wait to load the default!!\n");
  352.     }
  353.     char score[3];
  354.     score[0]=array[12];                    //PUTTING BETWEEN TAGS IN ARRAY FOR READING WITH ATOI
  355.     score[1]=array[13];
  356.     score[2]='\0';
  357.     num_cols=W;                                     //CHANGING THE GLOBAL VALUE FOR WIDTH
  358.     num_rows=H;                                     //CHANGING THE GLOBAL VALUE FOR HEIGHT
  359. }
  360. //FUNCTION TO CHECK IF WORD IS FOUND IN STRING OR NOT
  361. int over_lapping(char s1[],char s2[]){
  362.     int counter=-1,i=0;
  363.     while(s2[i]!='\0'){
  364.         int j=0;
  365.         if(s2[i]==s1[j]){
  366.             int k=i;
  367.             while(s2[k]==s1[j] && s1[j]!='\0'){
  368.                 k++;
  369.                 j++;
  370.             }
  371.             if(s1[j]=='\0'){
  372.                 counter=i;
  373.             }
  374.         }
  375.         i++;
  376.     }
  377.     return counter;
  378. }
  379. //FUNCTIONS TO SWAPE SELECT SIDES OF TWO PLAYERS
  380. void select_side(){
  381.     if(game_mode==1){
  382.         printf("Enter the new name for %s :",name1);        //GETTING THE USER NAME
  383.         scanf("%s",&name1);
  384.         printf("Enter the new name for %s :",name2);
  385.         scanf("%s",&name2);
  386.         select_sides=1;
  387.     }
  388. }
  389. void exit_program(){
  390.     printf("Thanks for playing.");
  391.     exit(0);
  392. }
  393. //END OF PROJECT !
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement