Guest User

Minesweeper

a guest
Sep 6th, 2013
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <iomanip>
  5.  
  6. using namespace std;
  7.  
  8. void unosPodataka(int &w, int &h, int &brMina) {
  9.  
  10. cout << "Unesite sirinu: ";
  11. cin >> w;
  12. cout << "Unesite visinu: ";
  13. cin >> h;
  14.  
  15. while (1) {
  16. cout << "NAPOMENA: Preporuceno je da broj mina bude upola manji \n od broja mogucih pozicija! (" << w * h / 2 << ", MAX " << w * h - 1 << ")" << endl;
  17. cout << "Unesite broj mina: ";
  18. cin >> brMina;
  19. if (brMina < w * h) break;
  20. cout << "Broj mina mora biti strogo manji od broja mogućih pozicija!!!\n (MAX " << w * h - 1 << ")" << endl;
  21. }
  22.  
  23. w--;
  24. h--;
  25. }
  26.  
  27. bool jeMina(int ** polje, int i, int j) {
  28. return (polje[i][j] == 9) ? true : false;
  29. }
  30.  
  31. void povecajZaJedan(int ** polje, int i, int j, int w, int h) {
  32. if (i >= 0 && i <= h && j >= 0 && j <= w) {
  33. if (!jeMina(polje, i, j)) {
  34. //cout<<"i = "<<i<<"; j = "<<j<<endl;
  35. polje[i][j]++;
  36. }
  37. }
  38. }
  39.  
  40. int dodajMinu(int ** polje, int ** vidljivo, int i, int w, int h) {
  41. int novaPozicija[2];
  42. novaPozicija[0] = rand() % (h + 1);
  43. novaPozicija[1] = rand() % (w + 1);
  44.  
  45. if (polje[novaPozicija[0]][novaPozicija[1]] == 0) {
  46. polje[novaPozicija[0]][novaPozicija[1]] = 9;
  47. vidljivo[novaPozicija[0]][novaPozicija[1]] = 9;
  48. return 1;
  49. } else {
  50. return 0;
  51. }
  52. }
  53.  
  54. void povecajOkoMine(int ** polje, int i, int j, int w, int h) {
  55.  
  56. povecajZaJedan(polje, i - 1, j - 1, w, h); // Gore lijevo
  57. povecajZaJedan(polje, i - 1, j, w, h); // Gore
  58. povecajZaJedan(polje, i - 1, j + 1, w, h); // Gore desno
  59.  
  60. povecajZaJedan(polje, i, j - 1, w, h); // Lijevo
  61. povecajZaJedan(polje, i, j + 1, w, h); // Desno
  62.  
  63. povecajZaJedan(polje, i + 1, j - 1, w, h); // Dolje lijevo
  64. povecajZaJedan(polje, i + 1, j, w, h); // Dolje
  65. povecajZaJedan(polje, i + 1, j + 1, w, h); // Dolje desno
  66.  
  67. }
  68.  
  69. void init(int ** polje, int ** vidljivo, int w, int h, int brMina) {
  70.  
  71. for (int i = 0; i <= h; i++) {
  72. for (int j = 0; j <= w; j++) {
  73. polje[i][j] = 0;
  74. vidljivo[i][j] = -1;
  75. }
  76. }
  77.  
  78. srand(time(NULL));
  79.  
  80. for (int i = 1; i <= brMina; i++) {
  81. while (1) {
  82. if (dodajMinu(polje, vidljivo, i, w, h)) break;
  83. };
  84. }
  85.  
  86. for (int i = 0; i <= h; i++) {
  87. for (int j = 0; j <= w; j++) {
  88. if (polje[i][j] == 9) {
  89. povecajOkoMine(polje, i, j, w, h);
  90. }
  91. }
  92. }
  93. }
  94.  
  95. void ispisRijesenja(int ** polje, int w, int h) {
  96. cout << setw(5) << ":-) ";
  97. for (int i = 1; i <= w + 1; i++) cout << setw(3) << i;
  98. cout << endl << endl;
  99. for (int i = 0; i <= h; i++) {
  100. for (int j = 0; j <= w; j++) {
  101. if (j == 0) {
  102. cout << setw(3) << i + 1 << setw(2) << " ";
  103. }
  104. if (polje[i][j] == 0) cout << setw(3) << 0;
  105. else {
  106. if (polje[i][j] != 9)
  107. cout << setw(3) << polje[i][j];
  108. else
  109. cout << setw(3) << "X";
  110. }
  111. }
  112. cout << endl;
  113. }
  114. cout << endl << endl;
  115. }
  116.  
  117. void ispisPolja(int ** polje, int w, int h) {
  118. cout << setw(5) << ":-) ";
  119. for (int i = 1; i <= w + 1; i++) cout << setw(3) << i;
  120. cout << endl << endl;
  121. for (int i = 0; i <= h; i++) {
  122. for (int j = 0; j <= w; j++) {
  123. if (j == 0) {
  124. cout << setw(3) << i + 1 << setw(2) << " ";
  125. }
  126. if (polje[i][j] == -1) cout << setw(3) << " ";
  127. else {
  128. if (polje[i][j] != 9)
  129. cout << setw(3) << polje[i][j];
  130. else
  131. cout << setw(3) << " ";
  132. }
  133. }
  134. cout << endl;
  135. }
  136. cout << endl << endl;
  137. }
  138.  
  139. void unosLokacije(int & x, int & y, int w, int h) {
  140.  
  141. while (1) {
  142. cout << "Unesite redak: ";
  143. cin >> x;
  144. cout << "Unesite stupac: ";
  145. cin >> y;
  146. if (x > 0 && x <= h + 1 && y > 0 && y <= w + 1) break;
  147. cout << "Redak mora biti izmedju 1 i " << w + 1 << ",\na stupac izmedju 1 i " << h + 1 << endl;
  148. }
  149.  
  150. x--;
  151. y--;
  152. }
  153.  
  154. bool imaZatvorenihPolja(int ** polje, int w, int h) {
  155. for (int i = 0; i <= h; i++) {
  156. for (int j = 0; j <= w; j++) {
  157. if (polje[i][j] == -1) return true;
  158. }
  159. }
  160. return false;
  161. }
  162.  
  163. void otkrijPolje(int ** polje, int ** vidljivo, int x, int y, int w, int h) {
  164. if (x >= 0 && x <= h && y >= 0 && y <= w)
  165. vidljivo[x][y] = polje[x][y];
  166. }
  167.  
  168. bool jeNula(int ** polje, int x, int y, int w, int h) {
  169. if (x >= 0 && x <= h && y >= 0 && y <= w) {
  170. return ( polje[x][y] == 0) ? true : false;
  171. }
  172. return 0;
  173. }
  174.  
  175. void otkrijOtok(int ** polje, int ** vidljivo, int x, int y, int w, int h) {
  176.  
  177. if (x >= 0 && x <= h && y >= 0 && y <= w) {
  178. if (vidljivo[x][y] != -1) return;
  179.  
  180. otkrijPolje(polje, vidljivo, x, y, w, h);
  181.  
  182. if (!jeNula(polje, x, y, w, h)) return;
  183.  
  184.  
  185. // Gore lijevo
  186. otkrijOtok(polje, vidljivo, x - 1, y - 1, w, h);
  187.  
  188. // Gore
  189. otkrijOtok(polje, vidljivo, x - 1, y, w, h);
  190.  
  191. // Gore desno
  192. otkrijOtok(polje, vidljivo, x - 1, y + 1, w, h);
  193.  
  194. // Lijevo
  195. otkrijOtok(polje, vidljivo, x, y - 1, w, h);
  196.  
  197. // Desno
  198. otkrijOtok(polje, vidljivo, x, y + 1, w, h);
  199.  
  200. // Dolje lijevo
  201. otkrijOtok(polje, vidljivo, x + 1, y - 1, w, h);
  202.  
  203. // Dolje
  204. otkrijOtok(polje, vidljivo, x + 1, y, w, h);
  205.  
  206. // Dolje desno
  207. otkrijOtok(polje, vidljivo, x + 1, y + 1, w, h);
  208. } else
  209. return;
  210. };
  211.  
  212. int main() {
  213.  
  214. int w, h, brMina;
  215. char odg;
  216.  
  217. while (odg != 'n') {
  218.  
  219. system("clear");
  220.  
  221. unosPodataka(w, h, brMina);
  222.  
  223. int ** polje = new int*[h];
  224. for (int i = 0; i <= h; i++)
  225. polje[i] = new int[w];
  226.  
  227. int ** vidljivo = new int*[h];
  228. for (int i = 0; i <= h; i++)
  229. vidljivo[i] = new int[w];
  230.  
  231. init(polje, vidljivo, w, h, brMina);
  232.  
  233. bool pobjeda = true;
  234.  
  235. while (imaZatvorenihPolja(vidljivo, w, h)) {
  236.  
  237. system("clear");
  238.  
  239. //devIspisPolja(polje, w, h);
  240. ispisPolja(vidljivo, w, h);
  241.  
  242. int x, y;
  243. unosLokacije(x, y, w, h);
  244.  
  245. if (jeMina(polje, x, y)) {
  246. pobjeda = false;
  247. break;
  248. } else {
  249. if (polje[x][y] != 0) otkrijPolje(polje, vidljivo, x, y, w, h);
  250. else {
  251. otkrijOtok(polje, vidljivo, x, y, w, h);
  252. }
  253. }
  254. }
  255. if (pobjeda) {
  256. system("clear");
  257. ispisRijesenja(polje, w, h);
  258. cout << "USPIJESNO ste odigrali igru!" << endl << endl;
  259. } else {
  260. cout << endl;
  261. ispisRijesenja(polje, w, h);
  262. cout << "Igra je IZGUBLJENA!!!" << endl;
  263. }
  264.  
  265. cout << "Zelite li pokusati ponovno? (d/n) ";
  266. cin >> odg;
  267. }
  268.  
  269. system("clear");
  270. cout << "HVALA I DOVIDJENJA!" << endl;
  271.  
  272. return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment