Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //CONNECT FOUR PROJECT
- #include<stdio.h>
- #include<string.h>
- #include<string.h>
- #include<math.h>
- #include<windows.h>
- #include<conio.h>
- #include<stdlib.h>
- char check[4], yes[]="yes";
- int num_rows=6, num_cols=7;
- int save_load();
- 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;
- char board[100][100];
- char read[10], name1[20];
- char name2[20];
- char save[]="save";
- char sides[]="replace";
- char mains[]="start";
- int position [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 select_side(); //FUNCTION TO SWAPE SELECT SIDES
- void XML(); //FUNCTION TO READ FROM XML FILE
- void exit_program();
- void start();
- 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");
- printf(" Connect-Four\n"); //WELCOME MESSAGE
- for(k=0;k<3;k++)printf("\n");
- printf(" 1-new game\n"
- " -------------\n"
- " 2-load game\n"
- " -------------\n"
- " 3-exit\n"
- " -------------\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: read[0]='l';save_load();printnumber();break;
- case 3: exit_program();break;
- default: printf("error please try again !!");
- }
- }
- //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
- 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'){
- // 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);
- 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{
- player2();
- }
- 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]=='0'&&read[1]=='\0')){ //COMPARISON IF THE USER WANT TO SAVE OR LOAD
- save_load();
- i--;
- }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
- 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);
- else
- printf("Score X = %d Score O =%d\n ",score_x,score_o); //PRINTING THE SCORE
- printf("press 0 : to save the game \n");
- printf("press 1-7 : to choose empty \n");
- }
- }
- if(i==num_rows*num_cols) {
- 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 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 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]=='0'&&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,".save"); //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("Your file is saved '%s.file'.\n",fileName);
- 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);
- 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
- }
- }
- //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
- //LEN REFFERE TO THE LENGTH BETWEEN TWO CONFIGURTIONS
- //a IN A COUNTER
- //H -------> HEIGHT W ---------> WIDTH
- char y,x[200]= {'0'},conf_1[]="<Configurations>",width_1[]="<Width>",height_1[]="<Height>";
- char conf_2[]="</Configurations>",width_2[]="</Width>",height_2[]="</Height>";
- int i=0,start,end,start_w,end_w,start_h,end_h,len,a,size,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
- W=7;
- printf("Width is Not found !! the defult is Width =7\n");
- printf("Wait to load the default!!\n");
- }
- 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");
- }
- char score[3];
- score[0]=array[12]; //PUTTING BETWEEN TAGS IN ARRAY FOR READING WITH ATOI
- score[1]=array[13];
- score[2]='\0';
- num_cols=W; //CHANGING THE GLOBAL VALUE FOR WIDTH
- num_rows=H; //CHANGING THE GLOBAL VALUE FOR HEIGHT
- }
- //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;
- }
- //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;
- }
- }
- void exit_program(){
- printf("Thanks for playing.");
- exit(0);
- }
- //END OF PROJECT !
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement