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