Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define NUM_NEIGBHORS 8
  8.  
  9. typedef struct
  10. {
  11. int value;
  12. int is_mine;
  13. int revealed;
  14. } spot;
  15.  
  16. spot **build_matrix(spot **matrix, int size);
  17. void print_matrix(spot **a, int size);
  18. void print_line(int size);
  19. void spread_mines(spot **matrix, int size, int mines);
  20. void neighbor_value(spot **matrix,int size, int v, int h);
  21. void empty_matrix(spot **a, int size);
  22. void print_row_numbers(int size);
  23. void move(spot **a, int size, int *revealed);
  24. void spot_consequence(spot **a,int size,int v,int h, int *revealed);
  25. void open_area(spot **a,int size,int v,int h, int *revealed);
  26. int in_matrix(int v, int h, int size);
  27.  
  28. int main()
  29. {
  30. int mines;
  31. spot **matrix;
  32. int matrix_size;
  33. int number_of_revealed = 0; //move index
  34. srand(time(NULL));
  35.  
  36. printf("Enter size:\n");
  37. scanf("%d",&matrix_size);
  38.  
  39. matrix = build_matrix(matrix,matrix_size);
  40.  
  41. empty_matrix(matrix,matrix_size);
  42.  
  43. print_matrix(matrix,matrix_size);
  44.  
  45. printf("Enter amount of mines:\n");
  46. scanf("%d",&mines);
  47.  
  48. spread_mines(matrix, matrix_size, mines);
  49. while (number_of_revealed < matrix_size*matrix_size-mines)
  50. {
  51. printf("Enter spot:\n");
  52. move(matrix,matrix_size,&number_of_revealed);
  53. printf("revealed: %d\n",number_of_revealed);
  54. print_matrix(matrix,matrix_size);
  55. }
  56. printf("\nWe have a winner!!\n");
  57. return 0;
  58. }
  59.  
  60. void empty_matrix(spot **a, int size)
  61. {
  62. int i,j; //loop indexs
  63.  
  64. for (i=0; i<size; i++)
  65. for (j=0; j<size; j++)
  66. {
  67. a[i][j].value=0;
  68. a[i][j].revealed=FALSE;
  69. a[i][j].is_mine=FALSE;
  70. }
  71. }
  72.  
  73. spot **build_matrix(spot **matrix, int size)
  74. {
  75. spot **temp; //temporary matrix array
  76. int i; //loop index
  77. if ((matrix = (spot **) malloc (sizeof(spot *))) == NULL)
  78. {
  79. printf("could not allocate matrix !!");
  80. exit(1);
  81. }
  82. if ((temp = (spot **) realloc (matrix, size*sizeof(spot *))) == NULL)
  83. {
  84. printf("could not allocate temp !!");
  85. exit(1);
  86. }
  87.  
  88. for (i=0; i<size; i++)
  89. if ((matrix[i] = (spot *) malloc (size*sizeof(spot))) == NULL)
  90. {
  91. printf("could not allocate matrix[%d]",i);
  92. exit(1);
  93. }
  94. return matrix;
  95. }
  96.  
  97. void print_matrix(spot **a, int size)
  98. {
  99. int i,j; //loop indexs
  100.  
  101. printf("\n");
  102. print_row_numbers(size);
  103. printf("\n");
  104. print_line(size);
  105. printf("\n");
  106. for (i=0; i<size; i++)
  107. {
  108. printf("%c|",toupper('a'+i));
  109. for (j=0; j<size; j++)
  110. if (a[i][j].revealed == TRUE)
  111. if (a[i][j].is_mine == TRUE)
  112. printf(" @ |");
  113. else
  114. if (a[i][j].value == 0)
  115. printf(" |");
  116. else
  117. printf(" %d |",a[i][j].value);
  118. else
  119. printf(" # |");
  120. printf("\n");
  121. print_line(size);
  122. printf("\n");
  123. }
  124. }
  125.  
  126. void print_line(int size)
  127. {
  128. int i; //loop index
  129. printf(" ");
  130. for (i=0; i<size; i++)
  131. printf("----");
  132. }
  133.  
  134. void spread_mines(spot **matrix, int size, int mines)
  135. {
  136. int i=0; //loop index
  137. int v,h;//location
  138.  
  139. while (i<mines)
  140. {
  141. v = rand()%size;
  142. h = rand()%size;
  143. if (matrix[v][h].is_mine == FALSE)
  144. {
  145. matrix[v][h].is_mine = TRUE;
  146. i++;
  147. neighbor_value(matrix,size,v,h);
  148. }
  149. }
  150. }
  151.  
  152.  
  153. void neighbor_value(spot **matrix,int size, int v, int h)
  154. {
  155. int neighborv[NUM_NEIGBHORS] = { 1, 1, 1 ,0 ,0,-1,-1,-1};
  156. int neighborh[NUM_NEIGBHORS] = {-1, 0, 1,-1 ,1, -1, 0,1};
  157. int new_h=0, new_v=0;
  158. int i,j; //loop indexs
  159.  
  160. for (i=0; i<NUM_NEIGBHORS; i++)
  161. {
  162. new_h = h + neighborh[i];
  163. new_v = v + neighborv[i];
  164. if (in_matrix(new_v,new_h,size))
  165. if (matrix[new_v][new_h].is_mine != TRUE)
  166. matrix[new_v][new_h].value++;
  167. }
  168. }
  169.  
  170. void move(spot **a, int size,int *revealed)
  171. {
  172. char v;
  173. int h;
  174. int n_v; //v as verticle number
  175.  
  176. v = getchar();
  177. while (!isalpha(v))
  178. v = getchar();
  179. scanf("%d",&h);
  180. n_v = tolower(v) - 'a';
  181. while (n_v<0 || n_v>=size || h<0 || h>size)
  182. {
  183. printf("Invalid spot. Try again:\n");
  184. v = getchar();
  185. while (!isalpha(v))
  186. v = getchar();
  187. scanf("%d",&h);
  188. n_v = tolower(v) - 'a';
  189. }
  190. spot_consequence(a,size,n_v,h-1,revealed);
  191.  
  192. }
  193.  
  194. void print_row_numbers(int size)
  195. {
  196. int i;
  197. printf(" ");
  198. for (i=0; i<size; i++)
  199. i<9 ? printf(" %d ",i+1) : printf(" %d ",i+1);
  200. }
  201.  
  202. void spot_consequence(spot **a,int size,int v,int h,int *revealed)
  203. {
  204. if (a[v][h].is_mine)
  205. {
  206. a[v][h].revealed = TRUE;
  207. printf("BOMB!!!\n");
  208. print_matrix(a,size);
  209. exit(1);
  210. }
  211. open_area(a,size,v,h,revealed);
  212. }
  213.  
  214. void open_area(spot **a,int size,int v,int h,int *revealed)
  215. {
  216. static int nv[NUM_NEIGBHORS] = { 1, 1, 1 ,0 ,0,-1,-1,-1};
  217. static int nh[NUM_NEIGBHORS] = {-1, 0, 1,-1 ,1, -1, 0,1};
  218.  
  219. int new_v, new_h;
  220. int i;
  221.  
  222. if (a[v][h].revealed == TRUE)
  223. return;
  224.  
  225. a[v][h].revealed = TRUE;
  226. *revealed=*revealed +1;
  227.  
  228. if (a[v][h].value != 0)
  229. return;
  230.  
  231. for (i=0; i<NUM_NEIGBHORS; i++)
  232. {
  233. // printf("%d",i);
  234. new_v = v+nv[i];
  235. new_h = h+nh[i];
  236. if (in_matrix(new_v,new_h,size))
  237. open_area(a,size,new_v,new_h,revealed);
  238. }
  239. }
  240.  
  241. int in_matrix(int v, int h, int size)
  242. {
  243. if (h >= 0 && v >= 0 && h < size && v < size)
  244. return 1;
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement