/// <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]); } }
/// <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); }