/// <summary>
        /// Funkcja sprawdzająca, czy wszystkie pola statku są trafione. Jeśli tak, statek został zatopiony.
        /// </summary>
        /// <param name="IDStatku">ID Statku do sprawdzenia</param>
        /// <returns></returns>
        private bool CzyZatopilemStatek(int IDStatku)
        {
            List <L_Statek> statkiGracza   = _planszaGracza.Statki;
            L_Statek        trafionyStatek = statkiGracza[IDStatku];

            trafionyStatek.SprawdzStan();

            return(trafionyStatek.Zatopiony);
        }
        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);
        }
 /// <summary>
 /// Funkcja, która dodaje pola zajęte stanowiące statek do planszy.
 /// </summary>
 /// <param name="r">Rząd</param>
 /// <param name="k">Kolumna</param>
 /// <param name="kierunek">Kierunek budowania statku</param>
 /// <param name="statek">Statek do wybudowania</param>
 private void BudujStatek(int r, int k, Kierunki kierunek, L_Statek statek)
 {
     if (kierunek == Kierunki.Lewo)
     {
         for (int i = 0; i < statek.IloscPol; i++)
         {
             L_Pole nowePole = new L_PoleZajete(statek.ID);
             _polaPlanszy[r, k - i] = nowePole;
             statek.DodajPole(nowePole);
         }
     }
     else if (kierunek == Kierunki.Gora)
     {
         for (int i = 0; i < statek.IloscPol; i++)
         {
             L_Pole nowePole = new L_PoleZajete(statek.ID);
             _polaPlanszy[r - i, k] = nowePole;
             statek.DodajPole(nowePole);
         }
     }
     else if (kierunek == Kierunki.Prawo)
     {
         for (int i = 0; i < statek.IloscPol; i++)
         {
             L_Pole nowePole = new L_PoleZajete(statek.ID);
             _polaPlanszy[r, k + i] = nowePole;
             statek.DodajPole(nowePole);
         }
     }
     else if (kierunek == Kierunki.Dol)
     {
         for (int i = 0; i < statek.IloscPol; i++)
         {
             L_Pole nowePole = new L_PoleZajete(statek.ID);
             _polaPlanszy[r + i, k] = nowePole;
             statek.DodajPole(nowePole);
         }
     }
 }
        /// <summary>
        /// Funkcja budująca statki w losowych położeniach oraz kierunkach.
        /// Budowane są cztery jednomasztowce, trzy dwumasztowce, dwa trójmasztowce i jeden czteromasztowiec.
        /// </summary>
        public void BudujStatkiLosowo()
        {
            L_Statek[] tablicaStatkow = new L_Statek[10];
            tablicaStatkow[0] = new L_Czteromasztowiec(0);
            tablicaStatkow[1] = new L_Trojmasztowiec(1);
            tablicaStatkow[2] = new L_Trojmasztowiec(2);
            tablicaStatkow[3] = new L_Dwumasztowiec(3);
            tablicaStatkow[4] = new L_Dwumasztowiec(4);
            tablicaStatkow[5] = new L_Dwumasztowiec(5);
            tablicaStatkow[6] = new L_Jednomasztowiec(6);
            tablicaStatkow[7] = new L_Jednomasztowiec(7);
            tablicaStatkow[8] = new L_Jednomasztowiec(8);
            tablicaStatkow[9] = new L_Jednomasztowiec(9);

            Random los          = new Random(DateTime.Now.Millisecond);
            Random losKierunkow = new Random();

            Array tablicaKierunkow = Enum.GetValues(typeof(Kierunki));

            for (int i = 0; i < tablicaStatkow.Length; i++)
            {
                // Losowe liczby od 0 do 9 włącznie
                int      losowyR        = los.Next(0, 10);
                int      losowaK        = los.Next(0, 10);
                Kierunki losowyKierunek = (Kierunki)tablicaKierunkow.GetValue(losKierunkow.Next(tablicaKierunkow.Length));

                // Losuj pozycje, dopóki nie znajdziesz takiej, ktora spelnia warunki budowania
                while (!MoznaBudowac(losowyR, losowaK, losowyKierunek, tablicaStatkow[i]))
                {
                    losowyR = los.Next(0, 10);
                    losowaK = los.Next(0, 10);
                }

                BudujStatek(losowyR, losowaK, losowyKierunek, tablicaStatkow[i]);
                _statki.Add(tablicaStatkow[i]);
            }
        }
Exemple #5
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>
 /// Funkcja dodająca statek do listy statków na planszy.
 /// </summary>
 /// <param name="statek">L_Statek do dodania do planszy</param>
 public void DodajStatek(L_Statek statek)
 {
     _statki.Add(statek);
 }
        /// <summary>
        /// Funkcja sprawdzająca, czy można budować statek w danej pozycji na planszy i w danym kierunku.
        /// Aby statek dało się wybudować, należy spełnić dwa warunki:
        /// 1. Żadne pole statku nie może wychodzić poza planszę.
        /// 2. W bezpośrednim sąsiedztwie statku nie może znajdować się inne pole zajęte.
        /// </summary>
        /// <param name="r">Rząd</param>
        /// <param name="k">Kolumna</param>
        /// <param name="kierunek">Kierunek budowania statku</param>
        /// <param name="statek">Statek do wybudowania</param>
        /// <returns></returns>
        private bool MoznaBudowac(int r, int k, Kierunki kierunek, L_Statek statek)
        {
            // Sprawdza:
            #region 1. Czy statek wyjdzie poza grid

            if (kierunek == Kierunki.Lewo && k - statek.IloscPol + 1 < 0)
            {
                return(false);
            }
            else if (kierunek == Kierunki.Gora && r - statek.IloscPol + 1 < 0)
            {
                return(false);
            }
            else if (kierunek == Kierunki.Prawo && k + statek.IloscPol - 1 > 9)
            {
                return(false);
            }
            else if (kierunek == Kierunki.Dol && r + statek.IloscPol - 1 > 9)
            {
                return(false);
            }

            #endregion

            #region 2. Czy pola statku oraz pola dookoła są zajęte

            // Lista pól do sprawdzenia
            List <L_Pole> listaPol = new List <L_Pole>();

            #region Statek budowany w lewo

            if (kierunek == Kierunki.Lewo)
            {
                // ((statek.IloscPol - 1) + 1) == statek.IloscPol
                bool poleNaLewoIstnieje  = k - statek.IloscPol >= 0;
                bool poleWyzejIstnieje   = r - 1 >= 0;
                bool poleNaPrawoIstnieje = k + 1 <= 9;
                bool poleNizejIstnieje   = r + 1 <= 9;

                //Sprzawdzenie pól na prawo od statku
                if (poleNaPrawoIstnieje)
                {
                    //Pole na wysokości statku
                    listaPol.Add(_polaPlanszy[r, k + 1]);

                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k + 1]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k + 1]);
                    }
                }

                //Petla sprawdzająca pola statku i pola powyżej i poniżej statku
                for (int i = 0; i < statek.IloscPol; i++)
                {
                    //Pole, na którym będzie statek
                    listaPol.Add(_polaPlanszy[r, k - i]);

                    //Pola otaczające pole statku
                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k - i]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k - i]);
                    }
                }

                //Sprzawdzenie pól na lewo od statku
                if (poleNaLewoIstnieje)
                {
                    //Pole na wysokości statku
                    listaPol.Add(_polaPlanszy[r, k - statek.IloscPol]);

                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k - statek.IloscPol]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k - statek.IloscPol]);
                    }
                }
            }

            #endregion Statek budowany w lewo

            #region Statek budowany do góry

            else if (kierunek == Kierunki.Gora)
            {
                // ((statek.IloscPol - 1) + 1) == statek.IloscPol
                bool poleNaLewoIstnieje  = k - 1 >= 0;
                bool poleWyzejIstnieje   = r - statek.IloscPol >= 0;
                bool poleNaPrawoIstnieje = k + 1 <= 9;
                bool poleNizejIstnieje   = r + 1 <= 9;

                //Sprzawdzenie pól powyżej statku
                if (poleWyzejIstnieje)
                {
                    //Pole na szerokości statku
                    listaPol.Add(_polaPlanszy[r - statek.IloscPol, k]);

                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - statek.IloscPol, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - statek.IloscPol, k + 1]);
                    }
                }

                //Petla sprawdzająca pola statku i pola po bokach statku
                for (int i = 0; i < statek.IloscPol; i++)
                {
                    //Pole, na którym będzie statek
                    listaPol.Add(_polaPlanszy[r - i, k]);

                    //Pola otaczające pole statku
                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - i, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - i, k + 1]);
                    }
                }

                //Sprzawdzenie pól poniżej statku
                if (poleNizejIstnieje)
                {
                    //Pole na szerokości statku
                    listaPol.Add(_polaPlanszy[r + 1, k]);

                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k + 1]);
                    }
                }
            }

            #endregion Statek budowany do góry

            #region Statek budowany w prawo

            else if (kierunek == Kierunki.Prawo)
            {
                // ((statek.IloscPol - 1) + 1) == statek.IloscPol
                bool poleNaLewoIstnieje  = k - 1 >= 0;
                bool poleWyzejIstnieje   = r - 1 >= 0;
                bool poleNaPrawoIstnieje = k + statek.IloscPol <= 9;
                bool poleNizejIstnieje   = r + 1 <= 9;

                //Sprzawdzenie pól na prawo od statku
                if (poleNaPrawoIstnieje)
                {
                    //Pole na wysokości statku
                    listaPol.Add(_polaPlanszy[r, k + statek.IloscPol]);

                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k + statek.IloscPol]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k + statek.IloscPol]);
                    }
                }

                //Petla sprawdzająca pola statku i pola powyżej i poniżej statku
                for (int i = 0; i < statek.IloscPol; i++)
                {
                    //Pole, na którym będzie statek
                    listaPol.Add(_polaPlanszy[r, k + i]);

                    //Pola otaczające pole statku
                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k + i]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k + i]);
                    }
                }

                //Sprzawdzenie pól na lewo od statku
                if (poleNaLewoIstnieje)
                {
                    //Pole na wysokości statku
                    listaPol.Add(_polaPlanszy[r, k - 1]);

                    //Pole powyżej
                    if (poleWyzejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k - 1]);
                    }
                    //Pole poniżej
                    if (poleNizejIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + 1, k - 1]);
                    }
                }
            }

            #endregion Statek budowany w prawo

            #region Statek budowany w dół

            else if (kierunek == Kierunki.Dol)
            {
                // ((statek.IloscPol - 1) + 1) == statek.IloscPol
                bool poleNaLewoIstnieje  = k - 1 >= 0;
                bool poleWyzejIstnieje   = r - 1 >= 0;
                bool poleNaPrawoIstnieje = k + 1 <= 9;
                bool poleNizejIstnieje   = r + statek.IloscPol <= 9;

                //Sprzawdzenie pól powyżej statku
                if (poleWyzejIstnieje)
                {
                    //Pole na szerokości statku
                    listaPol.Add(_polaPlanszy[r - 1, k]);

                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r - 1, k + 1]);
                    }
                }

                //Petla sprawdzająca pola statku i pola po bokach statku
                for (int i = 0; i < statek.IloscPol; i++)
                {
                    //Pole, na którym będzie statek
                    listaPol.Add(_polaPlanszy[r + i, k]);

                    //Pola otaczające pole statku
                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + i, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + i, k + 1]);
                    }
                }

                //Sprzawdzenie pól poniżej statku
                if (poleNizejIstnieje)
                {
                    //Pole na szerokości statku
                    listaPol.Add(_polaPlanszy[r + statek.IloscPol, k]);

                    //Pole na lewo
                    if (poleNaLewoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + statek.IloscPol, k - 1]);
                    }
                    //Pole na prawo
                    if (poleNaPrawoIstnieje)
                    {
                        listaPol.Add(_polaPlanszy[r + statek.IloscPol, k + 1]);
                    }
                }
            }

            #endregion Statek budowany w dół

            // Jeśli którekolwiek z zebranych pól jest zajęte, nie można budować
            foreach (L_Pole pole in listaPol)
            {
                if (pole != null)
                {
                    return(false);
                }
            }

            #endregion 2. Czy pola statku oraz pola dookoła są zajęte


            // Jeśli żaden z powyższych warunków nie jest spełniony, można budować
            return(true);
        }