Example #1
0
 /// <summary>
 /// Funkcja dodająca nowe pole do statku.
 /// </summary>
 public void DodajPole(L_Pole pole)
 {
     if (this._pola.Count < this._iloscPol && pole.Zajete)
     {
         this._pola.Add(pole);
     }
 }
Example #2
0
        public void OddajStatki_ZwroconoListeTypuL_Statek()
        {
            //Przygotowanie
            L_Pole[,] tablicaPol = new L_Pole[10, 10];
            L_BudowniczyStatkow budowniczy = new L_BudowniczyStatkow(tablicaPol);

            //Działanie
            var zwroconaWartosc = budowniczy.OddajStatki();

            //Sprawdzenie
            Assert.IsTrue(zwroconaWartosc is List <L_Statek>);
        }
Example #3
0
        public void BudujStatkiLosowo_Zbudowano10Statkow()
        {
            //Przygotowanie
            L_Pole[,] tablicaPol = new L_Pole[10, 10];
            L_BudowniczyStatkow budowniczy = new L_BudowniczyStatkow(tablicaPol);

            //Działanie
            budowniczy.BudujStatkiLosowo();

            //Sprawdzenie
            Assert.IsTrue(budowniczy.OddajStatki().Count == 10);
        }
Example #4
0
        public void OddajPlansze_ZwroconoTablice2DTypuL_Pole()
        {
            //Przygotowanie
            L_Pole[,] tablicaPol = new L_Pole[10, 10];
            L_BudowniczyStatkow budowniczy = new L_BudowniczyStatkow(tablicaPol);

            //Działanie
            var zwroconaWartosc = budowniczy.OddajPlansze();

            //Sprawdzenie
            Assert.IsTrue(zwroconaWartosc is L_Pole[, ]);
        }
        /// <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;
        }
        /// <summary>
        /// Funkcja sprawdzająca, czy gra zakończyła się po danym ruchu.
        /// </summary>
        /// <returns>prawda/fałsz - czy gra została zakończona</returns>
        public bool SprawdzCzyKoniec(bool czyTuraGracza)
        {
            L_Pole[,] polaPrzeciwnika;
            List <L_Pole> zajetePolaPrzeciwnika = new List <L_Pole>();

            //Jeśli jest tura gracza, sprawdzane są pola komputera i na odwrót
            if (czyTuraGracza)
            {
                polaPrzeciwnika = _planszaKomputera.Pola;
            }
            else
            {
                polaPrzeciwnika = _planszaGracza.Pola;
            }

            for (int i = 0; i < polaPrzeciwnika.GetLength(0); i++)
            {
                for (int j = 0; j < polaPrzeciwnika.GetLength(1); j++)
                {
                    if (polaPrzeciwnika[i, j] != null)
                    {
                        L_Pole pole = polaPrzeciwnika[i, j];

                        if (pole.Zajete)
                        {
                            zajetePolaPrzeciwnika.Add(pole);
                        }
                    }
                }
            }

            bool koniecGry = true;

            foreach (L_Pole pole in zajetePolaPrzeciwnika)
            {
                if (!pole.Trafione)
                {
                    koniecGry = false;
                }
            }

            return(koniecGry);
        }
        /// <summary>
        /// Funkcja wypełniająca planszę polami
        /// </summary>
        private void WypelnijPolami()
        {
            //Dla pól pustych zrobić puste po kliknięciu, dla zajętych wypełnione
            L_Pole[,] polaPlanszy = _planszaLogiczna.Pola;

            for (int i = 0; i < polaPlanszy.GetLength(0); i++)
            {
                for (int j = 0; j < polaPlanszy.GetLength(1); j++)
                {
                    if (polaPlanszy[i, j] != null)
                    {
                        L_Pole pole = polaPlanszy[i, j];

                        Button button = new Button();
                        if (_czyPlanszaGracza)
                        {
                            if (pole.Zajete)
                            {
                                button.Background = KolorZHex("#000000", 0.75);
                            }
                            else
                            {
                                button.Background = KolorZHex("#FFFFFF", 0.5);
                            }
                        }
                        else
                        {
                            button.Background = KolorZHex("#FFFFFF", 0.2);
                        }

                        button.BorderBrush = KolorZHex("#FFFFFF", .9);
                        button.Cursor      = Cursors.Hand;

                        Grid.SetRow(button, i);
                        Grid.SetColumn(button, j);
                        _grid.Children.Add(button);
                        _planszaZPrzyciskami[i, j] = button;
                    }
                }
            }
        }
Example #8
0
        /// <summary>
        /// Funkcja obsługująca kliknięcie przycisku i zaznaczająca trafienie na planszy logicznej.
        /// </summary>
        /// <param name="button">Trafiony przycisk</param>
        public async void KliknieciePrzycisku(Button button)
        {
            //Jeśli gra jest skończona, zablokuj klikanie
            if (_kontroler.GraSkonczona)
            {
                return;
            }

            int i = Grid.GetRow(button);
            int j = Grid.GetColumn(button);

            Grid buttonParent = (Grid)button.Parent;

            L_Pole[,] polaPlanszy;
            L_PlanszaBitwy plansza;

            //Tura gracza
            if (_kontroler.CzyTuraGracza)
            {
                if (buttonParent == xPlanszaGracza)
                {
                    return;
                }
                else
                {
                    plansza = lPlanszaKomputera;
                }
            }
            //Tura komputera
            else
            {
                if (buttonParent == xPlanszaKomputera)
                {
                    return;
                }
                else
                {
                    plansza = lPlanszaGracza;
                }
            }

            polaPlanszy = plansza.Pola;

            bool   trafionoStatek  = false;
            bool   zatopionoStatek = false;
            L_Pole pole            = polaPlanszy[i, j];

            //Jeżeli pole już zostało trafione, nic się nie dzieje
            if (pole.Trafione)
            {
                return;
            }

            //Oznaczenie pola w zależności od tego czy jest zajęte, czy nie
            if (pole.Zajete)
            {
                button.Background = G_PlanszaBitwy.KolorZHex("#AA0000", 0.9);
                pole.Trafione     = true;
                trafionoStatek    = true;

                //Sprawdzenie stanu statku po trafieniu
                L_Statek statek = plansza.Statki[pole.IDStatku];
                statek.SprawdzStan();

                if (statek.Zatopiony)
                {
                    zatopionoStatek = true;
                }
            }
            else
            {
                button.Background = G_PlanszaBitwy.KolorZHex("#AAAAAA", 0.9);
                pole.Trafione     = true;
            }

            //Kontroler sprawdza stan gry po trafieniu pola
            _kontroler.SprawdzRuch(trafionoStatek);

            ZmienKomunikat(trafionoStatek, zatopionoStatek);

            //Zakończenie gry
            if (_kontroler.GraSkonczona)
            {
                _kontroler.ZakonczGre();

                _komunikat.Text = $"Grę wygrał {_kontroler.ObecnaGra.zwyciezca} w {_kontroler.LicznikTur} turach!";
            }
            //Komputer wykonuje ruch, jeśli właśnie kończy się tura gracza
            else if (!_kontroler.CzyTuraGracza)
            {
                await Task.Delay(1000);

                _komputer.WykonajRuch();
            }

            //Jeżeli gra nie jest skończona, zmień aktywną planszę
            if (!_kontroler.GraSkonczona)
            {
                ZmienAktywnaPlansze(_kontroler.CzyTuraGracza);
                _pierwszyRuch = false;
            }
        }
        /// <summary>
        /// Komputer po każdym wykonanym ruchu sprawdza co ten ruch spowodował i zależnie od tego podejmuje kolejną akcję.
        /// </summary>
        public void SprawdzRuch()
        {
            //Jeśli poziom trudności jest ustawiony na łatwy, strzelaj na ślepo
            if (_poziomTrudnosci == PoziomTrudnosci.Latwy)
            {
                _komenda = Komendy.Losuj;
                return;
            }

            #region Trafione pole było zajęte

            if (_wylosowanePole.Zajete)
            {
                _wlasnieZatopilem = CzyZatopilemStatek(_wylosowanePole.IDStatku);

                //Jeżeli dany strzał zatopił statek
                if (_wlasnieZatopilem)
                {
                    _wlasnieTrafilem = false;
                    _ktoryStrzal     = 1;
                    _komenda         = Komendy.Losuj;
                }
                else
                {
                    //Jeżeli dany strzał trafił kolejne pole statku
                    if (_wlasnieTrafilem)
                    {
                        _komenda     = Komendy.StrzelajWTymKierunku;
                        _ktoryStrzal = 1;
                    }
                    else
                    {
                        //Jeżeli dany strzał trafił pierwsze pole statku
                        _wlasnieTrafilem      = true;
                        _obranyKierunek       = null;
                        _ktoryStrzal          = 1;
                        _trafionePierwszePole = _wylosowanePole;
                        _w_1 = _w;
                        _k_1 = _k;

                        _komenda = Komendy.SzukajDookola;
                    }
                }
            }

            #endregion

            #region Trafione pole było puste

            //Jeżeli trafiło się kolejne pole statku, po czym spudłowało, ale statek statek nie został zatopiony.
            //Np. Kiedy trafiono w lewą stronę 3 pola 4-masztowca, ale jego ostatnie pole jest po prawej.
            else if (_komenda == Komendy.StrzelajWTymKierunku)
            {
                _ktoryStrzal      = 1;
                _wlasnieZatopilem = false;

                //Zamień obecny kierunek na przeciwny
                if (_obranyKierunek == Kierunki.Dol)
                {
                    _obranyKierunek = Kierunki.Gora;
                }
                else if (_obranyKierunek == Kierunki.Gora)
                {
                    _obranyKierunek = Kierunki.Dol;
                }
                else if (_obranyKierunek == Kierunki.Lewo)
                {
                    _obranyKierunek = Kierunki.Prawo;
                }
                else if (_obranyKierunek == Kierunki.Prawo)
                {
                    _obranyKierunek = Kierunki.Lewo;
                }
            }
            //Jeżeli komputer szuka kolejnego pola statku dookoła, to następnym razem strzeli w kolejnym kierunku
            else if (_komenda == Komendy.SzukajDookola)
            {
                _wlasnieZatopilem = false;
                _ktoryStrzal++;
            }
            //Jeżeli nie trafił losowo, strzela dalej
            else
            {
                _wlasnieTrafilem = false;
            }

            #endregion
        }
        /// <summary>
        /// Funkcja zwracająca tablicę z losowym indeksem tablicy.
        /// </summary>
        /// <returns>tablica z numerami wiersza i kolumny, w których znajduje się pole</returns>
        public int[] LosujPole()
        {
            L_Pole[,] polaPlanszy = _planszaGracza.Pola;
            int i = _w;
            int j = _k;

            #region Losowe wybranie pola

            if (_komenda == Komendy.Losuj)
            {
                // Losowe liczby od 0 do 9 włącznie
                Random los = new Random(DateTime.Now.Millisecond);
                i = los.Next(0, 10);
                j = los.Next(0, 10);

                Random losTrudnosci = new Random(DateTime.Now.Millisecond);

                //Szansa na trafienie prosto w statek wynosi 20% - tylko dla poziomu trudnego
                int  losowaLiczba       = losTrudnosci.Next(0, 5);
                bool czyStrzelicWStatek = losowaLiczba == 0;

                if (czyStrzelicWStatek && _poziomTrudnosci == PoziomTrudnosci.Trudny)
                {
                    //Dopóki losowe pole jest polem już trafionym i nie jest pole zajętym przez statek, szukaj dalej
                    while ((polaPlanszy[i, j].Trafione && !polaPlanszy[i, j].Zajete) || (!polaPlanszy[i, j].Trafione && !polaPlanszy[i, j].Zajete) || (polaPlanszy[i, j].Trafione && polaPlanszy[i, j].Zajete))
                    {
                        i = los.Next(0, 10);
                        j = los.Next(0, 10);
                    }
                }
                else
                {
                    //Dopóki losowe pole jest polem już trafionym, szukaj innego pola
                    while (polaPlanszy[i, j].Trafione)
                    {
                        i = los.Next(0, 10);
                        j = los.Next(0, 10);
                    }
                }
            }

            #endregion

            #region Szukanie pól statku dookoła trafionego pola

            else if (_komenda == Komendy.SzukajDookola)
            {
                i = _w_1;
                j = _k_1;

                while ((i == _w_1 || j == _k_1) && polaPlanszy[i, j].Trafione)
                {
                    //Lewo
                    if (_ktoryStrzal == 1)
                    {
                        if (_k_1 > 0)
                        {
                            if (polaPlanszy[i, j - 1].Trafione)
                            {
                                _ktoryStrzal++;
                            }
                            else
                            {
                                j--;
                                _obranyKierunek = Kierunki.Lewo;
                            }
                        }
                        else
                        {
                            _ktoryStrzal++;
                        }
                    }
                    //Góra
                    else if (_ktoryStrzal == 2)
                    {
                        if (_w_1 > 0)
                        {
                            if (polaPlanszy[i - 1, j].Trafione)
                            {
                                _ktoryStrzal++;
                            }
                            else
                            {
                                i--;
                                _obranyKierunek = Kierunki.Gora;
                            }
                        }
                        else
                        {
                            _ktoryStrzal++;
                        }
                    }
                    //Prawo
                    else if (_ktoryStrzal == 3)
                    {
                        if (_k_1 < 9)
                        {
                            if (polaPlanszy[i, j + 1].Trafione)
                            {
                                _ktoryStrzal++;
                            }
                            else
                            {
                                j++;
                                _obranyKierunek = Kierunki.Prawo;
                            }
                        }
                        else
                        {
                            _ktoryStrzal++;
                        }
                    }
                    //Dół
                    else if (_ktoryStrzal == 4)
                    {
                        if (_w_1 < 9)
                        {
                            if (polaPlanszy[i + 1, j].Trafione)
                            {
                                _ktoryStrzal++;
                            }
                            else
                            {
                                i++;
                                _obranyKierunek = Kierunki.Dol;
                            }
                        }
                        else
                        {
                            _ktoryStrzal++;
                        }
                    }
                }
            }

            #endregion

            #region Szukanie pól statku w obranym kierunku

            else if (_komenda == Komendy.StrzelajWTymKierunku)
            {
                while (polaPlanszy[i, j].Trafione)
                {
                    //Lewo
                    if (_obranyKierunek == Kierunki.Lewo)
                    {
                        if (_k > 0)
                        {
                            if (!(polaPlanszy[i, j - 1].Trafione && !polaPlanszy[i, j - 1].Zajete))
                            {
                                j--;
                            }
                            else if (polaPlanszy[i, j - 1].Trafione && polaPlanszy[i, j - 1].Zajete)
                            {
                                j--;
                            }
                            else
                            {
                                _obranyKierunek = Kierunki.Prawo;
                            }
                        }
                        else
                        {
                            _obranyKierunek = Kierunki.Prawo;
                        }
                    }
                    //Góra
                    else if (_obranyKierunek == Kierunki.Gora)
                    {
                        if (_w > 0)
                        {
                            if (!(polaPlanszy[i - 1, j].Trafione && !polaPlanszy[i - 1, j].Zajete))
                            {
                                i--;
                            }
                            else if (polaPlanszy[i - 1, j].Trafione && polaPlanszy[i - 1, j].Zajete)
                            {
                                i--;
                            }
                            else
                            {
                                _obranyKierunek = Kierunki.Dol;
                            }
                        }
                        else
                        {
                            _obranyKierunek = Kierunki.Dol;
                        }
                    }
                    //Prawo
                    else if (_obranyKierunek == Kierunki.Prawo)
                    {
                        if (_k < 9)
                        {
                            if (!(polaPlanszy[i, j + 1].Trafione && !polaPlanszy[i, j + 1].Zajete))
                            {
                                j++;
                            }
                            else if (polaPlanszy[i, j + 1].Trafione && polaPlanszy[i, j + 1].Zajete)
                            {
                                j++;
                            }
                            else
                            {
                                _obranyKierunek = Kierunki.Lewo;
                            }
                        }
                        else
                        {
                            _obranyKierunek = Kierunki.Lewo;
                        }
                    }
                    //Dół
                    else if (_obranyKierunek == Kierunki.Dol)
                    {
                        if (_w < 9)
                        {
                            if (!(polaPlanszy[i + 1, j].Trafione && !polaPlanszy[i + 1, j].Zajete))
                            {
                                i++;
                            }
                            else if (polaPlanszy[i + 1, j].Trafione && polaPlanszy[i + 1, j].Zajete)
                            {
                                i++;
                            }
                            else
                            {
                                _obranyKierunek = Kierunki.Gora;
                            }
                        }
                        else
                        {
                            _obranyKierunek = Kierunki.Gora;
                        }
                    }
                }
            }

            #endregion

            _wylosowanePole = polaPlanszy[i, j];
            _w = i;
            _k = j;

            int[] indeksy = new int[2] {
                i, j
            };

            return(indeksy);
        }