示例#1
0
        public void LosujPole_KomputerStrzelaLosowo_KolejneLosowanieZwracaInneMiejsceNaPlanszyPoTrafieniu()
        {
            //Przygotowanie

            L_PlanszaBitwy plansza = new L_PlanszaBitwy();
            //Na poziomie łatwym komputer będzie cały czas strzelał losowo
            PoziomTrudnosci poziomTrudnosci = PoziomTrudnosci.Latwy;
            L_Komputer      komputer        = new L_Komputer(plansza, poziomTrudnosci);

            int[] ostatnieIndeksy = new int[2];
            int[] noweIndeksy;
            bool  kazdeLosowanieJestUnikalne = true;

            //Działanie
            //Wylosowanie 100 pól powinno za każdym kolejnym razem zwrócić inne pole, jeśli pole wylosowane wcześniej zostało trafione
            for (int i = 0; i < plansza.Pola.GetLength(0); i++)
            {
                for (int j = 0; j < plansza.Pola.GetLength(1); j++)
                {
                    noweIndeksy = komputer.LosujPole();

                    if (i == 0 && j == 0)
                    {
                        ostatnieIndeksy = noweIndeksy;
                        //Trafienie wylosowanego pola
                        plansza.Pola[noweIndeksy[0], noweIndeksy[1]].Trafione = true;
                    }
                    else
                    {
                        //Jeśli zostały wylosowane te same indeksy, test nie zostanie zdany
                        if (ostatnieIndeksy[0] == noweIndeksy[0] && ostatnieIndeksy[1] == noweIndeksy[1])
                        {
                            kazdeLosowanieJestUnikalne = false;
                            break;
                        }
                        else
                        {
                            ostatnieIndeksy = noweIndeksy;
                            //Trafienie wylosowanego pola
                            plansza.Pola[noweIndeksy[0], noweIndeksy[1]].Trafione = true;
                        }
                    }
                }
            }

            //Sprawdzenie
            Assert.IsTrue(kazdeLosowanieJestUnikalne);
        }
        /// <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;
        }
示例#3
0
        public void LosujPole_KomputerStrzelaDookolaPoTrafieniu_PoTrafieniuKolejneLosowanePoleZnajdujeSieWBezposrednimSasiedztwie()
        {
            //Przygotowanie

            L_PlanszaBitwy plansza = new L_PlanszaBitwy();
            //Na poziomie zaawansowanym i trudnym komputer będzie strzelał dookoła po trafieniu pola zajętego.
            //Tutaj wybrałem poziom trudny, ponieważ daje to większą szansę na trafienie pól zajętych.
            PoziomTrudnosci poziomTrudnosci = PoziomTrudnosci.Trudny;
            L_Komputer      komputer        = new L_Komputer(plansza, poziomTrudnosci);

            int[]    indeksy = new int[2];
            L_Pole   trafionePole;
            L_Statek trafionyStatek;

            //Działanie

            //Komputer losuje pola dopóki nie trafi w pole zajęte
            for (int i = 0; i < plansza.Pola.GetLength(0); i++)
            {
                for (int j = 0; j < plansza.Pola.GetLength(1); j++)
                {
                    indeksy               = komputer.LosujPole();
                    trafionePole          = plansza.Pola[indeksy[0], indeksy[1]];
                    trafionePole.Trafione = true;

                    //Po trafieniu w pole zajęte trzeba sprawdzic, czy to pole nie należy do jednomasztowca, czyli czy statek nie został zatopiony od razu
                    if (trafionePole.Zajete)
                    {
                        trafionyStatek = plansza.Statki[trafionePole.IDStatku];
                        trafionyStatek.SprawdzStan();

                        //Jeśli statek nie jest zatopiony, komputer będzie strzelał dookoła
                        if (!trafionyStatek.Zatopiony)
                        {
                            komputer.SprawdzRuch();
                            break;
                        }
                    }

                    komputer.SprawdzRuch();
                }
            }

            //Indeksy po wykonaniu pętli są indeksami pierwszego pola trafionego statku
            //W tablicy poniżej przechowujemy kolejne indeksy z następnego losowania
            int[] kolejneIndeksy = komputer.LosujPole();

            //Indeksy pierwszego pola
            int i_1 = indeksy[0];
            int j_1 = indeksy[1];

            //Indeksy kolejnego pola
            int i_2 = kolejneIndeksy[0];
            int j_2 = kolejneIndeksy[1];

            //Sprawdzenie
            //Sprawdzamy czy kolejne wylosowane pole znajduje się w bezpośrednim sąsiedztwie poprzedniego pola. (lewo, góra, prawo, dół)
            //Komputer najpierw strzela w lewo, ale pole po lewej stronie może nie istnieć bądź może być już pustym polem trafionym.
            //W takim przypadku komputer strzeli w kolejnym kierunku, który, w sytuacji jak wyżej, może zostać zmieniony.
            Assert.IsTrue(
                j_2 <j_1 || //Lewo
                     i_2 <i_1 || //Góra
                          j_2> j_1 || //Prawo
                     i_2> i_1 //Dół
                );
        }
示例#4
0
 /// <summary>
 /// Funkcja ustalająca poziom trudności rozgrywki.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 /// <param name="poziomTrudnosci">Jeden z trzech poziomów: Latwy, Zaawansowany, Trudny</param>
 private void WybierzPoziomTrudnosci(Object sender, RoutedEventArgs e, PoziomTrudnosci poziomTrudnosci)
 {
     NowaGra(xPlanszaGracza, xPlanszaKomputera, _pierwszaGra, poziomTrudnosci);
     _popupTrudnosci.IsOpen = false;
 }
示例#5
0
        /// <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();
        }
示例#6
0
 private void easyBtn_Click(object sender, EventArgs e)
 {
     trudnosc = PoziomTrudnosci.Latwy;
     diffMenu.Hide();
     gameMenu.Show();
 }
示例#7
0
 private void medBtn_Click(object sender, EventArgs e)
 {
     trudnosc = PoziomTrudnosci.Sredni;
     diffMenu.Hide();
     gameMenu.Show();
 }
示例#8
0
 /// <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;
 }
示例#9
0
    public bool WyruszNaWyprawe(int poziomTrudnosci, List <PrzedmiotWartosciowy> coMoznaZdobyc)
    {
        PoziomTrudnosci poziom = (PoziomTrudnosci)poziomTrudnosci; //(PoziomTrudnosci)Enum.Parse(typeof(PoziomTrudnosci), poziomTrudnosci);
        //SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue")
        bool czyZepsutyPojazd = false;

        if (mojSzpital.WybranyPojazd?.AwariaPojazdu() == true)
        {
            Console.WriteLine($"Ups! {mojSzpital.WybranyPojazd.Nazwa} się rozklekotał! Lekarz musi odbyć tę wyprawę bez pojazdu.");
            czyZepsutyPojazd         = true;
            mojSzpital.WybranyPojazd = null;
        }

        int modyfikatorTrudnosci    = (mojSzpital.WybranyPojazd?.ModyfikatorTrudnosci ?? 0);
        int liczbaMiejscNaPacjentow = (mojSzpital.WybranyPojazd?.LiczbaMiejscNaPacjentow ?? 0);

        int maxIloscPacjentow   = 0;
        int szansaUtratyLekarza = 20;

        if (poziom == PoziomTrudnosci.Latwy)
        {
            maxIloscPacjentow   = 14;
            szansaUtratyLekarza = 20;
        }
        else if (poziom == PoziomTrudnosci.Normalny)
        {
            maxIloscPacjentow   = 20;
            szansaUtratyLekarza = 30;
        }
        else if (poziom == PoziomTrudnosci.Trudny)
        {
            maxIloscPacjentow   = 30;
            szansaUtratyLekarza = 60;
        }
        else if (poziom == PoziomTrudnosci.GetinHardocore)
        {
            maxIloscPacjentow   = 100;
            szansaUtratyLekarza = 95;
        }

        Random losowanie       = new Random();
        int    szansaPrzedmiot = losowanie.Next(0, 100);

        //OrderBy - sortowanie po tym co w nawiasie
        //FirtstOrDefault - znajduje pierwszy element spełniający warunek,
        //jeśli nic nie znajdzie, to zwraca null
        Przedmiot wylosowany = coMoznaZdobyc.OrderBy(p => p.SzansaTrafienia).FirstOrDefault(p => p.SzansaTrafienia <= szansaPrzedmiot);

        // foreach(Przedmiot p in coMoznaZdobyc)
        // {
        //     if(p.SzansaTrafienia <= szansaPrzedmiot)
        //     {
        //         wylosowany = p;
        //         break;
        //     }
        // }

        if (wylosowany != null)
        {
            mojSzpital.Przedmioty.Add(wylosowany);
            Console.WriteLine($"Podczas wyprawy twój lekarz zdobył {wylosowany.Nazwa}. Podjarał się tym jak lampion w roraty lub tester w dzień wypłaty!");
        }


        if (mojSzpital.IloscDostepnychLekarzy > 0 && mojSzpital.PobierzZBudzetu(50))
        {
            //Random losowanie = new Random();
            int nowiPacjenci = losowanie.Next(5, maxIloscPacjentow + liczbaMiejscNaPacjentow);
            mojSzpital.IloscPacjentow += nowiPacjenci;
            if (mojSzpital.IloscPacjentow > mojSzpital.IloscLozek)
            {
                mojSzpital.IloscPacjentow = mojSzpital.IloscLozek;
            }

            if (losowanie.Next(1, 101) > 100 - szansaUtratyLekarza + modyfikatorTrudnosci)
            {
                mojSzpital.IloscDostepnychLekarzy -= 1;
                Console.WriteLine($"Wyprawa udana. Niestety jeden lekarz poświęcił się dla uratowania przed straszliwym wirusem {nowiPacjenci} nowych pacjentów");
                return(czyZepsutyPojazd);
            }
            else
            {
                Console.WriteLine($"Wyprawa udana, znaleziono {nowiPacjenci} nowych pacjentów. Wszyscy szczęśliwi, radośni, poobijani i z nowym kredytem wracają do domu.");
                return(czyZepsutyPojazd);
            }
        }
        else if (mojSzpital.IloscDostepnychLekarzy == 0)
        {
            Console.WriteLine("Dopadła Cię choroba Polskiego NFZ - wszyscy lekarze są na Zachodzie");
            return(czyZepsutyPojazd);
        }
        else
        {
            Console.WriteLine("Zgłoś się do NFZ po fundusze, bo ten wyjazd nie będzie refundowany");
            return(czyZepsutyPojazd);
        }

        //    mojSzpital.IloscPacjentow += nowiPacjenci;
        //    if (mojSzpital.IloscPacjentow > mojSzpital.IloscLozek)
        //    {
        //        mojSzpital.IloscPacjentow = mojSzpital.IloscLozek;
        //        Console.WriteLine("Liczba znalezionych pacjentów przekroczyła liczbę dostępnych łóżek. Nie wszyscy mogli zostać zabrani do szpitala.");
        //    }
    }