// Konstruktor public MinskoPolje(int iBrojRedova = 10, int iBrojKolona = 10, int iBrojMina = 8) { if ( // Zastita od pogresnog ulaza, default vrednosti iBrojRedova < 1 || iBrojRedova > MAX_REDOVA || iBrojKolona < 1 || iBrojKolona > MAX_KOLONA || iBrojMina < 0 || iBrojMina > iBrojRedova * iBrojKolona) { brojRedova = 10; brojKolona = 10; brojMina = 8; } else { // Ako su ulazne vredvosti u redu, proslediti ih clanovima objekta brojRedova = iBrojRedova; brojKolona = iBrojKolona; brojMina = iBrojMina; } /* Debug * Console.WriteLine("Broj redova: "+brojRedova); * Console.WriteLine("Broj kolona: "+brojKolona); * Console.WriteLine("Broj mina: "+brojMina); */ // Inicijalizacija preostalih clanova objekta brojOtvorenihPolja = 0; status = StatusIgre.nijeReseno; matricaMina = new int[brojRedova, brojKolona]; otvorenoPolje = new bool[brojRedova, brojKolona]; // Generisanje slucajnih brojeva, postavljanje mina Random random = new Random(); for (int i = 0; i < brojMina; ++i) { int mina = random.Next(0, brojRedova * brojKolona); /* Debug * Console.WriteLine("Random: "+mina); * Console.WriteLine("red: "+mina/brojKolona); * Console.WriteLine("kol: "+mina%brojKolona); */ // U slucaju da se ponovi ista mina, prebaciti je na sledece prazno mesto // Ovim nacinom je skraceno vreme postavljanja mina while (matricaMina[mina / brojKolona, mina % brojKolona] == 9) { mina++; if (mina == brojRedova * brojKolona) { mina = 0; } } matricaMina[mina / brojKolona, mina % brojKolona] = 9; } }
// Otvaranje polja, prebrojavanje mina oko zadatog polja // i otvaranje polja oko zadatog polja ako nema mina oko zadatog polja public StatusOtvorenoPolje OtvoriPolje(int red, int kolona) { // Zastita od pogresnog ulaza podataka if (red < 0 || red >= brojRedova || kolona < 0 || kolona >= brojKolona) { return(StatusOtvorenoPolje.greskaPogresanUnos); } // Zastita od otvaranja vec otvorenih polja i otvaranja polja ako je igra zavrsena // Izlazni uslov u slucaju rekurzivnih poziva if (status == StatusIgre.nijeReseno && !otvorenoPolje[red, kolona]) { int nadjenoMina = 0; otvorenoPolje[red, kolona] = true; // Otvorena mina, otvoriti ostale mine i zavrsiti if (matricaMina[red, kolona] == 9) { for (int i = 0; i < brojRedova; i++) { for (int j = 0; j < brojKolona; j++) { if (matricaMina[i, j] == 9) { otvorenoPolje[i, j] = true; } } } status = StatusIgre.poraz; return(StatusOtvorenoPolje.uRedu); } // Brojanje mina oko otvorenog polja // Gore levo if (red - 1 >= 0 && kolona - 1 >= 0) { if (matricaMina[red - 1, kolona - 1] == 9) { nadjenoMina++; } } // Gore if (red - 1 >= 0) { if (matricaMina[red - 1, kolona] == 9) { nadjenoMina++; } } // Gore desno if (red - 1 >= 0 && kolona + 1 < brojKolona) { if (matricaMina[red - 1, kolona + 1] == 9) { nadjenoMina++; } } // Desno if (kolona + 1 < brojKolona) { if (matricaMina[red, kolona + 1] == 9) { nadjenoMina++; } } // Dole desno if (red + 1 < brojRedova && kolona + 1 < brojKolona) { if (matricaMina[red + 1, kolona + 1] == 9) { nadjenoMina++; } } // Dole if (red + 1 < brojRedova) { if (matricaMina[red + 1, kolona] == 9) { nadjenoMina++; } } // Dole levo if (red + 1 < brojRedova && kolona - 1 >= 0) { if (matricaMina[red + 1, kolona - 1] == 9) { nadjenoMina++; } } // Levo if (kolona - 1 >= 0) { if (matricaMina[red, kolona - 1] == 9) { nadjenoMina++; } } // Mine su prebrojane, upis broja u matricu za prikaz matricaMina[red, kolona] = nadjenoMina; brojOtvorenihPolja++; // Ako su otvorena sva polja, kraj if (brojOtvorenihPolja == brojRedova * brojKolona - brojMina) { for (int i = 0; i < brojRedova; i++) { for (int j = 0; j < brojKolona; j++) { if (!otvorenoPolje[i, j]) { otvorenoPolje[i, j] = true; } } } status = StatusIgre.pobeda; return(StatusOtvorenoPolje.uRedu); } /* debug * Console.WriteLine("Otvoreno polje: [{0}, {1}]", red, kolona); * Console.WriteLine("brojOtvorenihPolja: "+brojOtvorenihPolja); */ // Nema mina okolo, otvoriti sva polja okolo (rekurzivni pozivi) if (nadjenoMina == 0) { // Gore levo if (red - 1 >= 0 && kolona - 1 >= 0) { OtvoriPolje(red - 1, kolona - 1); } // Gore if (red - 1 >= 0) { OtvoriPolje(red - 1, kolona); } // Gore desno if (red - 1 >= 0 && kolona + 1 < brojKolona) { OtvoriPolje(red - 1, kolona + 1); } // Desno if (kolona + 1 < brojKolona) { OtvoriPolje(red, kolona + 1); } // Dole desno if (red + 1 < brojRedova && kolona + 1 < brojKolona) { OtvoriPolje(red + 1, kolona + 1); } // Dole if (red + 1 < brojRedova) { OtvoriPolje(red + 1, kolona); } // Dole levo if (red + 1 < brojRedova && kolona - 1 >= 0) { OtvoriPolje(red + 1, kolona - 1); } // Levo if (kolona - 1 >= 0) { OtvoriPolje(red, kolona - 1); } } return(StatusOtvorenoPolje.uRedu); // Sve je u redu } else // Polje je vec otvoreno ili je zavrsena igra { if (otvorenoPolje[red, kolona]) { return(StatusOtvorenoPolje.greskaVecOtvoreno); } else { return(StatusOtvorenoPolje.greskaResenaPartija); } } }