/// <summary> /// Konstruktor, uruchamia się przy tworzeniu okna /// </summary> public MainPage() { this.InitializeComponent(); Debug = new TextBoxTraceListener(debug); // tworzenie nowego obiektu i nadawanie jego cech poprzez konstruktor // domyślny lub z parametrami. konstruktor może rzucić ArgumentOutOfRangeException // i z tego powodu obejmujemy to w blok try..catch i pokazujemy komunikat // w razie wyjątku //try //{ // zwierze1 = new ArmiaChomików(100); //} //catch (ArgumentOutOfRangeException ex) //{ // MessageDialog m = new MessageDialog("błąd, wyjątek! " + ex.Message); // m.ShowAsync(); //} zwierze1 = new ChomikSzaman("Pucuś", 10); zwierze2 = new Jednorożec("Rafał", 5); // subskrybowanie zdarzenia, że zwierzę jest martwe i uruchamianie wtedy // odpowiedniej funkcji zwierze1.ZwierzęMartwe += OnZwierzeDead; zwierze2.ZwierzęMartwe += OnZwierzeDead; }
/// <summary> /// Konstruktor klasy głównego okienka aplikacji /// </summary> public MainWindow() { // to jest standardowa metoda ustawiająca komponenty InitializeComponent(); // tutaj się dzieje nieistotna magia - przekierowywany jest strumień informacji testowych // do pola tekstowego w okienku aplikacji TraceListener debugListener = new Ktos.Common.TextBoxTraceListener(tbLog); Debug.Listeners.Add(debugListener); // tworzone są nowe instancje walczących zwierzątek ////gracz1 = new ChomikSzaman("Pimpuś", 100); gracz1 = new ArmiaChomików(300); gracz2 = new Jednorożec("Rafał", 15); // subskrybujemy zdarzenie Zmarł - kiedy jednorożec padnie, // będziemy pokazywać komunikat // tutaj użyta jest wersja z funkcją anonimową gracz2.Zmarł += (sender) => { MessageBox.Show(string.Format("{0} nie żyje!", sender.Imię)); }; // wersja alternatywna - z oddzielną funkcją obsługującą zdarzenie gracz2.Zmarł += Gracz2_Zmarł; }
/// <summary> /// Funkcja realizująca atak jednego gracza na drugiego /// </summary> /// <param name="atakujący">Obiekt który jest atakujący</param> /// <param name="cel">Obiekt który jest atakowany</param> private void Atak(Zwierzę atakujący, Zwierzę cel) { Random r = new Random(); var d = r.NextDouble(); // mówi czy atak nastąpił, czy mamy testować dalej bool czyAtakował = false; // dla Zwierzęcia Magicznego 20% szans ataku magicznego if ((atakujący is ZwierzęMagiczne) && (d > 0.8)) { // spróbuj zaatakować magicznie try { (atakujący as ZwierzęMagiczne).AtakujMagicznie(cel); Debug.WriteLine(atakujący.Imię + " zaatakował magią!"); czyAtakował = true; } // jeżeli wystąpi wyjątek NoManaException, przechwyć go // i pokaż w liście zdarzeń odpowiedni komunikat catch (NoManaException) { Debug.WriteLine("Nie ma już many!"); } } // jeżeli nie udało się, a atakujący lata, to może zużyć swój ruch // na start do lotu z 40% szans na powodzenie - start też jest uznawany // za atak, mimo, że nie zadaje obrażeń if (!czyAtakował && (atakujący is ILatający) && (d > 0.6)) { if (!(atakujący as ILatający).CzyLata) { (atakujący as ILatający).Lataj(); Debug.WriteLine(atakujący.Imię + " odleciał!"); czyAtakował = true; } } // jeśli nie zaatakował w żaden specjalny sposób, gryzie if (!czyAtakował) atakujący.Gryź(cel); }
private void OnZwierzeDead(Zwierzę sender) { MessageDialog m = new MessageDialog("Padło nam :(\n" + sender.Imię); m.ShowAsync(); }
/// <summary> /// Funkcja obsługująca zdarzenie śmierci jednego z graczy /// </summary> /// <param name="sender">Obiekt, który wysłał zdarzenie Zmarł</param> private void Gracz2_Zmarł(Zwierzę sender) { MessageBox.Show(string.Format("{0} nie żyje!", sender.Imię)); }
/// <summary> /// Obsługa kolejnej tury - gracz atakuje graczDrugi, losując typ ataku w zależności od jego umiejętności /// </summary> /// <param name="gracz">Gracz atakujący</param> /// <param name="graczDrugi">Gracz atakowany</param> private void Tura(Zwierzę gracz, Zwierzę graczDrugi) { Random r = new Random(); var w = r.Next(10); var zaatakował = false; if (gracz is ZwierzęMagiczne) { // 30% szans na atak magiczny if (w >= 7) { (gracz as ZwierzęMagiczne).AtakujMagicznie(graczDrugi); Debug.WriteLine("{0} zaatakował magicznie {1}!", gracz.Imię, graczDrugi.Imię); zaatakował = true; } } if (gracz is ILatający) { // 20% szans na odlot if (w >= 8 && !zaatakował) { try { (gracz as ILatający).Lataj(); Debug.WriteLine(string.Format("{0} odleciał!", gracz.Imię)); } catch (HorseCannotIntoSkyException) // jeżeli wystąpił wyjątek, że koń nie może polecieć { Debug.WriteLine("Koń za słaby, aby latać!"); // pokazujemy komunikat } finally { zaatakował = true; // niezależnie, czy poleciał, czy nie, uznajemy, że jego tura się kończy } } } // jeżeli nie zaatakował wcześniej w inny sposób, to po prostu gryzie if (!zaatakował) { gracz.Gryź(graczDrugi); Debug.WriteLine("{0} ugryzł {1}!", gracz.Imię, graczDrugi.Imię); } }