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