예제 #1
0
        /// <summary>
        /// Funkcja rozpoczynająca nową grę.
        /// Najpierw tworzy nową grę w kontrolerze logicznym, a potem pobiera z niego plansze logiczne i na ich podstawie buduje plansze z przycisków.
        /// </summary>
        /// <param name="xPlanszaGracza"></param>
        /// <param name="xPlanszaKomputera"></param>
        /// <param name="czyPierwszaGra"></param>
        /// <param name="poziomTrudnosci"></param>
        private void NowaGra(Grid xPlanszaGracza, Grid xPlanszaKomputera, bool czyPierwszaGra, PoziomTrudnosci poziomTrudnosci)
        {
            _kontroler.NowaGra();

            if (_pierwszaGra)
            {
                _pierwszaGra = false;
            }
            else
            {
                WyczyscPlansze();
            }
            _komunikat.Text = $"Rozpocznij!";

            lPlanszaGracza    = _kontroler.ObecnaGra.PlanszaGracza;
            lPlanszaKomputera = _kontroler.ObecnaGra.PlanszaKomputera;

            gPlanszaGracza    = new G_PlanszaBitwy(xPlanszaGracza, lPlanszaGracza, true, czyPierwszaGra);
            gPlanszaKomputera = new G_PlanszaBitwy(xPlanszaKomputera, lPlanszaKomputera, false, czyPierwszaGra);

            _komputer = new G_Komputer(this, lPlanszaGracza, gPlanszaGracza, poziomTrudnosci);

            _pierwszyRuch = true;

            ZmienAktywnaPlansze(_kontroler.CzyTuraGracza);

            NasluchujKlikniec();
        }
        /// <summary>
        /// Konstruktor Planszy Bitwy
        /// </summary>
        /// <param name="grid">Grid, w którym zostanie stworzona siatka 10x10</param>
        public G_PlanszaBitwy(Grid grid, L_PlanszaBitwy planszaLogiczna, bool czyPlanszaGracza, bool czyPierwszaGra)
        {
            _grid             = grid;
            _planszaLogiczna  = planszaLogiczna;
            _czyPlanszaGracza = czyPlanszaGracza;

            if (czyPierwszaGra)
            {
                TworzSiatke();
            }

            WypelnijPolami();
        }
        public void DodajStatek_DodanoJedenStatek()
        {
            //Przygotowanie
            L_PlanszaBitwy  plansza           = new L_PlanszaBitwy();
            List <L_Statek> listaStatkow      = plansza.Statki;
            int             poprzedniaDlugosc = listaStatkow.Count;

            L_Statek statek = new L_Statek();

            //Działanie
            plansza.DodajStatek(statek);

            //Sprawdzenie
            Assert.IsTrue(listaStatkow.Count > poprzedniaDlugosc);
        }
예제 #4
0
        public void LosujPole_KomputerStrzelaLosowo_KolejneLosowanieZwracaInneMiejsceNaPlanszyPoTrafieniu()
        {
            //Przygotowanie

            L_PlanszaBitwy plansza = new L_PlanszaBitwy();
            //Na poziomie łatwym komputer będzie cały czas strzelał losowo
            PoziomTrudnosci poziomTrudnosci = PoziomTrudnosci.Latwy;
            L_Komputer      komputer        = new L_Komputer(plansza, poziomTrudnosci);

            int[] ostatnieIndeksy = new int[2];
            int[] noweIndeksy;
            bool  kazdeLosowanieJestUnikalne = true;

            //Działanie
            //Wylosowanie 100 pól powinno za każdym kolejnym razem zwrócić inne pole, jeśli pole wylosowane wcześniej zostało trafione
            for (int i = 0; i < plansza.Pola.GetLength(0); i++)
            {
                for (int j = 0; j < plansza.Pola.GetLength(1); j++)
                {
                    noweIndeksy = komputer.LosujPole();

                    if (i == 0 && j == 0)
                    {
                        ostatnieIndeksy = noweIndeksy;
                        //Trafienie wylosowanego pola
                        plansza.Pola[noweIndeksy[0], noweIndeksy[1]].Trafione = true;
                    }
                    else
                    {
                        //Jeśli zostały wylosowane te same indeksy, test nie zostanie zdany
                        if (ostatnieIndeksy[0] == noweIndeksy[0] && ostatnieIndeksy[1] == noweIndeksy[1])
                        {
                            kazdeLosowanieJestUnikalne = false;
                            break;
                        }
                        else
                        {
                            ostatnieIndeksy = noweIndeksy;
                            //Trafienie wylosowanego pola
                            plansza.Pola[noweIndeksy[0], noweIndeksy[1]].Trafione = true;
                        }
                    }
                }
            }

            //Sprawdzenie
            Assert.IsTrue(kazdeLosowanieJestUnikalne);
        }
예제 #5
0
        /// <summary>
        /// Konstruktor komputera
        /// </summary>
        /// <param name="planszaGracza">Logiczna plansza gracza</param>
        /// <param name="poziomTrudnosci">Poziom trudności, na jakim będzie się odbywać rozgrywka</param>
        public L_Komputer(L_PlanszaBitwy planszaGracza, PoziomTrudnosci poziomTrudnosci)
        {
            _poziomTrudnosci = poziomTrudnosci;
            _planszaGracza   = planszaGracza;

            _wlasnieTrafilem  = false;
            _wlasnieZatopilem = false;

            _wylosowanePole       = null;
            _trafionePierwszePole = null;
            _w = -1;
            _k = -1;

            _obranyKierunek = null;
            _ktoryStrzal    = 1;

            _komenda = Komendy.Losuj;
        }
        public void WypelnijPustePola_NieMaPolOwartosciNull()
        {
            //Przygotowanie
            L_PlanszaBitwy plansza = new L_PlanszaBitwy();

            L_Pole[,] pola = plansza.Pola;

            //Działanie
            bool polaSaPuste = true;

            for (int i = 0; i < pola.GetLength(0); i++)
            {
                for (int j = 0; j < pola.GetLength(1); j++)
                {
                    if (pola[i, j] == null)
                    {
                        polaSaPuste = false;
                    }
                }
            }

            //Sprawdzenie
            Assert.IsTrue(polaSaPuste);
        }
예제 #7
0
        public void LosujPole_KomputerStrzelaDookolaPoTrafieniu_PoTrafieniuKolejneLosowanePoleZnajdujeSieWBezposrednimSasiedztwie()
        {
            //Przygotowanie

            L_PlanszaBitwy plansza = new L_PlanszaBitwy();
            //Na poziomie zaawansowanym i trudnym komputer będzie strzelał dookoła po trafieniu pola zajętego.
            //Tutaj wybrałem poziom trudny, ponieważ daje to większą szansę na trafienie pól zajętych.
            PoziomTrudnosci poziomTrudnosci = PoziomTrudnosci.Trudny;
            L_Komputer      komputer        = new L_Komputer(plansza, poziomTrudnosci);

            int[]    indeksy = new int[2];
            L_Pole   trafionePole;
            L_Statek trafionyStatek;

            //Działanie

            //Komputer losuje pola dopóki nie trafi w pole zajęte
            for (int i = 0; i < plansza.Pola.GetLength(0); i++)
            {
                for (int j = 0; j < plansza.Pola.GetLength(1); j++)
                {
                    indeksy               = komputer.LosujPole();
                    trafionePole          = plansza.Pola[indeksy[0], indeksy[1]];
                    trafionePole.Trafione = true;

                    //Po trafieniu w pole zajęte trzeba sprawdzic, czy to pole nie należy do jednomasztowca, czyli czy statek nie został zatopiony od razu
                    if (trafionePole.Zajete)
                    {
                        trafionyStatek = plansza.Statki[trafionePole.IDStatku];
                        trafionyStatek.SprawdzStan();

                        //Jeśli statek nie jest zatopiony, komputer będzie strzelał dookoła
                        if (!trafionyStatek.Zatopiony)
                        {
                            komputer.SprawdzRuch();
                            break;
                        }
                    }

                    komputer.SprawdzRuch();
                }
            }

            //Indeksy po wykonaniu pętli są indeksami pierwszego pola trafionego statku
            //W tablicy poniżej przechowujemy kolejne indeksy z następnego losowania
            int[] kolejneIndeksy = komputer.LosujPole();

            //Indeksy pierwszego pola
            int i_1 = indeksy[0];
            int j_1 = indeksy[1];

            //Indeksy kolejnego pola
            int i_2 = kolejneIndeksy[0];
            int j_2 = kolejneIndeksy[1];

            //Sprawdzenie
            //Sprawdzamy czy kolejne wylosowane pole znajduje się w bezpośrednim sąsiedztwie poprzedniego pola. (lewo, góra, prawo, dół)
            //Komputer najpierw strzela w lewo, ale pole po lewej stronie może nie istnieć bądź może być już pustym polem trafionym.
            //W takim przypadku komputer strzeli w kolejnym kierunku, który, w sytuacji jak wyżej, może zostać zmieniony.
            Assert.IsTrue(
                j_2 <j_1 || //Lewo
                     i_2 <i_1 || //Góra
                          j_2> j_1 || //Prawo
                     i_2> i_1 //Dół
                );
        }
예제 #8
0
 /// <summary>
 /// Konstruktor komputera.
 /// </summary>
 /// <param name="kontroler">Kontroler graficzny gry</param>
 /// <param name="lPlanszaGracza">Plansza logiczna gracza</param>
 /// <param name="gPlanszaGracza">Plansza graficzna gracza</param>
 /// <param name="poziomTrudnosci">Poziom trudnościu komputera logicznego</param>
 public G_Komputer(G_KontrolaGry kontroler, L_PlanszaBitwy lPlanszaGracza, G_PlanszaBitwy gPlanszaGracza, PoziomTrudnosci poziomTrudnosci)
 {
     _gPlanszaGracza = gPlanszaGracza;
     _lKomputer      = new L_Komputer(lPlanszaGracza, poziomTrudnosci);
     _kontroler      = kontroler;
 }
예제 #9
0
 /// <summary>
 /// Konstruktor nowej gry.
 /// </summary>
 public L_Gra()
 {
     _planszaGracza    = new L_PlanszaBitwy();
     _planszaKomputera = new L_PlanszaBitwy();
 }
예제 #10
0
 /// <summary>
 /// Sędzia kalosz
 /// </summary>
 /// <param name="gra">obecna gra</param>
 public L_Sedzia(L_Gra gra)
 {
     _gra              = gra;
     _planszaGracza    = _gra.PlanszaGracza;
     _planszaKomputera = _gra.PlanszaKomputera;
 }