Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <ctime>
- #include <cstdlib>
- #include <iomanip>
- using namespace std;
- void unosPodataka(int &w, int &h, int &brMina) {
- cout << "Unesite sirinu: ";
- cin >> w;
- cout << "Unesite visinu: ";
- cin >> h;
- while (1) {
- cout << "NAPOMENA: Preporuceno je da broj mina bude upola manji \n od broja mogucih pozicija! (" << w * h / 2 << ", MAX " << w * h - 1 << ")" << endl;
- cout << "Unesite broj mina: ";
- cin >> brMina;
- if (brMina < w * h) break;
- cout << "Broj mina mora biti strogo manji od broja mogućih pozicija!!!\n (MAX " << w * h - 1 << ")" << endl;
- }
- w--;
- h--;
- }
- bool jeMina(int ** polje, int i, int j) {
- return (polje[i][j] == 9) ? true : false;
- }
- void povecajZaJedan(int ** polje, int i, int j, int w, int h) {
- if (i >= 0 && i <= h && j >= 0 && j <= w) {
- if (!jeMina(polje, i, j)) {
- //cout<<"i = "<<i<<"; j = "<<j<<endl;
- polje[i][j]++;
- }
- }
- }
- int dodajMinu(int ** polje, int ** vidljivo, int i, int w, int h) {
- int novaPozicija[2];
- novaPozicija[0] = rand() % (h + 1);
- novaPozicija[1] = rand() % (w + 1);
- if (polje[novaPozicija[0]][novaPozicija[1]] == 0) {
- polje[novaPozicija[0]][novaPozicija[1]] = 9;
- vidljivo[novaPozicija[0]][novaPozicija[1]] = 9;
- return 1;
- } else {
- return 0;
- }
- }
- void povecajOkoMine(int ** polje, int i, int j, int w, int h) {
- povecajZaJedan(polje, i - 1, j - 1, w, h); // Gore lijevo
- povecajZaJedan(polje, i - 1, j, w, h); // Gore
- povecajZaJedan(polje, i - 1, j + 1, w, h); // Gore desno
- povecajZaJedan(polje, i, j - 1, w, h); // Lijevo
- povecajZaJedan(polje, i, j + 1, w, h); // Desno
- povecajZaJedan(polje, i + 1, j - 1, w, h); // Dolje lijevo
- povecajZaJedan(polje, i + 1, j, w, h); // Dolje
- povecajZaJedan(polje, i + 1, j + 1, w, h); // Dolje desno
- }
- void init(int ** polje, int ** vidljivo, int w, int h, int brMina) {
- for (int i = 0; i <= h; i++) {
- for (int j = 0; j <= w; j++) {
- polje[i][j] = 0;
- vidljivo[i][j] = -1;
- }
- }
- srand(time(NULL));
- for (int i = 1; i <= brMina; i++) {
- while (1) {
- if (dodajMinu(polje, vidljivo, i, w, h)) break;
- };
- }
- for (int i = 0; i <= h; i++) {
- for (int j = 0; j <= w; j++) {
- if (polje[i][j] == 9) {
- povecajOkoMine(polje, i, j, w, h);
- }
- }
- }
- }
- void ispisRijesenja(int ** polje, int w, int h) {
- cout << setw(5) << ":-) ";
- for (int i = 1; i <= w + 1; i++) cout << setw(3) << i;
- cout << endl << endl;
- for (int i = 0; i <= h; i++) {
- for (int j = 0; j <= w; j++) {
- if (j == 0) {
- cout << setw(3) << i + 1 << setw(2) << " ";
- }
- if (polje[i][j] == 0) cout << setw(3) << 0;
- else {
- if (polje[i][j] != 9)
- cout << setw(3) << polje[i][j];
- else
- cout << setw(3) << "X";
- }
- }
- cout << endl;
- }
- cout << endl << endl;
- }
- void ispisPolja(int ** polje, int w, int h) {
- cout << setw(5) << ":-) ";
- for (int i = 1; i <= w + 1; i++) cout << setw(3) << i;
- cout << endl << endl;
- for (int i = 0; i <= h; i++) {
- for (int j = 0; j <= w; j++) {
- if (j == 0) {
- cout << setw(3) << i + 1 << setw(2) << " ";
- }
- if (polje[i][j] == -1) cout << setw(3) << " ";
- else {
- if (polje[i][j] != 9)
- cout << setw(3) << polje[i][j];
- else
- cout << setw(3) << " ";
- }
- }
- cout << endl;
- }
- cout << endl << endl;
- }
- void unosLokacije(int & x, int & y, int w, int h) {
- while (1) {
- cout << "Unesite redak: ";
- cin >> x;
- cout << "Unesite stupac: ";
- cin >> y;
- if (x > 0 && x <= h + 1 && y > 0 && y <= w + 1) break;
- cout << "Redak mora biti izmedju 1 i " << w + 1 << ",\na stupac izmedju 1 i " << h + 1 << endl;
- }
- x--;
- y--;
- }
- bool imaZatvorenihPolja(int ** polje, int w, int h) {
- for (int i = 0; i <= h; i++) {
- for (int j = 0; j <= w; j++) {
- if (polje[i][j] == -1) return true;
- }
- }
- return false;
- }
- void otkrijPolje(int ** polje, int ** vidljivo, int x, int y, int w, int h) {
- if (x >= 0 && x <= h && y >= 0 && y <= w)
- vidljivo[x][y] = polje[x][y];
- }
- bool jeNula(int ** polje, int x, int y, int w, int h) {
- if (x >= 0 && x <= h && y >= 0 && y <= w) {
- return ( polje[x][y] == 0) ? true : false;
- }
- return 0;
- }
- void otkrijOtok(int ** polje, int ** vidljivo, int x, int y, int w, int h) {
- if (x >= 0 && x <= h && y >= 0 && y <= w) {
- if (vidljivo[x][y] != -1) return;
- otkrijPolje(polje, vidljivo, x, y, w, h);
- if (!jeNula(polje, x, y, w, h)) return;
- // Gore lijevo
- otkrijOtok(polje, vidljivo, x - 1, y - 1, w, h);
- // Gore
- otkrijOtok(polje, vidljivo, x - 1, y, w, h);
- // Gore desno
- otkrijOtok(polje, vidljivo, x - 1, y + 1, w, h);
- // Lijevo
- otkrijOtok(polje, vidljivo, x, y - 1, w, h);
- // Desno
- otkrijOtok(polje, vidljivo, x, y + 1, w, h);
- // Dolje lijevo
- otkrijOtok(polje, vidljivo, x + 1, y - 1, w, h);
- // Dolje
- otkrijOtok(polje, vidljivo, x + 1, y, w, h);
- // Dolje desno
- otkrijOtok(polje, vidljivo, x + 1, y + 1, w, h);
- } else
- return;
- };
- int main() {
- int w, h, brMina;
- char odg;
- while (odg != 'n') {
- system("clear");
- unosPodataka(w, h, brMina);
- int ** polje = new int*[h];
- for (int i = 0; i <= h; i++)
- polje[i] = new int[w];
- int ** vidljivo = new int*[h];
- for (int i = 0; i <= h; i++)
- vidljivo[i] = new int[w];
- init(polje, vidljivo, w, h, brMina);
- bool pobjeda = true;
- while (imaZatvorenihPolja(vidljivo, w, h)) {
- system("clear");
- //devIspisPolja(polje, w, h);
- ispisPolja(vidljivo, w, h);
- int x, y;
- unosLokacije(x, y, w, h);
- if (jeMina(polje, x, y)) {
- pobjeda = false;
- break;
- } else {
- if (polje[x][y] != 0) otkrijPolje(polje, vidljivo, x, y, w, h);
- else {
- otkrijOtok(polje, vidljivo, x, y, w, h);
- }
- }
- }
- if (pobjeda) {
- system("clear");
- ispisRijesenja(polje, w, h);
- cout << "USPIJESNO ste odigrali igru!" << endl << endl;
- } else {
- cout << endl;
- ispisRijesenja(polje, w, h);
- cout << "Igra je IZGUBLJENA!!!" << endl;
- }
- cout << "Zelite li pokusati ponovno? (d/n) ";
- cin >> odg;
- }
- system("clear");
- cout << "HVALA I DOVIDJENJA!" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment