Esempio n. 1
0
            // 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;
                }
            }
Esempio n. 2
0
            // 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);
                    }
                }
            }