Advertisement
Guest User

Untitled

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