public void GdyDwieRzekiSi꣹cząTaKrótszaSięKończyADłuższaPłynieDalejGrubsza(bool najpierwKrotsza)
        {
            var aktualizator = new AktualizatorNastepstwaMapyWysokosci();
             IPunkt punktPoczatkowyKrotszej = _mapa.Komorki.ElementAt(3).Punkt;
             IPunkt punktPoczatkowyDluzszej = _mapa.Komorki.ElementAt(4).Punkt;
             _mapa.Rogi.ElementAt(1).Punkt.Sasiedzi.Remove(_mapa.Rogi.ElementAt(0).Punkt);
             _mapa.Rogi.ElementAt(2).Punkt.Sasiedzi.Remove(_mapa.Rogi.ElementAt(0).Punkt); // usuwamy te sąsiedztwa, żeby rzeka płynęła przez k2
             IPunkt ujscie = _mapa.Komorki.ElementAt(1).Punkt;
             ujscie.Wysokosc = 1.5f; // żeby mieć pewność, że z r3 spływa do k2, a nie do r2
             IRog brzeg = _mapa.Komorki.ElementAt(0).Rogi.First();
             brzeg.Dane.Brzeznosc = BrzeznoscRogu.Brzeg;
             _mapa.ZastosujPrzetwarzanie(aktualizator);

             IGeneratorRzeki generatorKrotszejRzeki = new GeneratorRzeki(punktPoczatkowyKrotszej);
             IGeneratorRzeki generatorDluzszejRzeki = new GeneratorRzeki(punktPoczatkowyDluzszej);
             IRzeka krotsza;
             IRzeka dluzsza;
             if (najpierwKrotsza)
             {
            _mapa.ZastosujPrzetwarzanie(generatorKrotszejRzeki as IPrzetwarzaczMapy);

            krotsza = _mapa.Rzeki.ElementAt(0);
            generatorKrotszejRzeki.UdaloSieUtworzyc.Value.ShouldBeTrue();
            krotsza.Odcinki.Last().PunktB.ShouldEqual(brzeg.Punkt);

            _mapa.ZastosujPrzetwarzanie(generatorDluzszejRzeki as IPrzetwarzaczMapy);
            dluzsza =  _mapa.Rzeki.ElementAt(1);
             }
             else
             {
            _mapa.ZastosujPrzetwarzanie(generatorDluzszejRzeki as IPrzetwarzaczMapy);

            dluzsza = _mapa.Rzeki.ElementAt(0);
            generatorDluzszejRzeki.UdaloSieUtworzyc.Value.ShouldBeTrue();
            dluzsza.Odcinki.Last().PunktB.ShouldEqual(brzeg.Punkt);

            _mapa.ZastosujPrzetwarzanie(generatorKrotszejRzeki as IPrzetwarzaczMapy);
            krotsza = _mapa.Rzeki.ElementAt(1);
             }

             generatorDluzszejRzeki.UdaloSieUtworzyc.Value.ShouldBeTrue();
             _mapa.Rzeki.Count().ShouldEqual(2);
             krotsza.Odcinki.Last().PunktB.ShouldEqual(ujscie);
             dluzsza.Odcinki.Last().PunktB.ShouldEqual(brzeg.Punkt);
             krotsza.Odcinki.Count.ShouldEqual(2); // k4-r3-k2
             dluzsza.Odcinki.Count.ShouldEqual(4); // k5-r4-r2-k2-r1
             krotsza.Odcinki.ToList().ForEach(o => o.Grubosc.ShouldEqual(GeneratorRzeki.GruboscJednostkowa));
             dluzsza.Odcinki.Take(3).ToList().ForEach(o => o.Grubosc.ShouldEqual(GeneratorRzeki.GruboscJednostkowa));
             krotsza.Odcinki.Skip(3).ToList().ForEach(o => o.Grubosc.ShouldEqual(GeneratorRzeki.GruboscJednostkowa*2));
        }
        public void UtworzRzeki(int ile, Random gen)
        {
            int wykonanychProb = 0;
             for (int utworzonych = 0; utworzonych < ile; ++wykonanychProb)
             {
            if (wykonanychProb > ile*Konf.LimitProbUtworzeniaSrednioJednejRzeki)
            {
               Debug.LogWarning("Przekroczono dopuszczaln¹ iloœæ prób wygenerowania rzeki.");
               return;
            }
            var komorkiKandydaci = Poziom._mapa.Komorki.Where(k => k.Dane.Podloze == Podloze.Ziemia
               && k.Punkt.Wysokosc > Konf.MinimalnaWysokoscZrodlaRzeki).ToList();

            int indeksKomorki = gen.Next(komorkiKandydaci.Count());
            IPunkt punktPoczatkowy = komorkiKandydaci.ElementAt(indeksKomorki).Punkt;
            var generatorRzek = new GeneratorRzeki(punktPoczatkowy);
            generatorRzek.Przetwarzaj(Poziom._mapa);
            if (generatorRzek.UdaloSieUtworzyc == true)
            {
               ++utworzonych;
            }
             }
        }
        public void PunktNiebędącyNieckąMaNastępnik()
        {
            var aktualizator = new AktualizatorNastepstwaMapyWysokosci();
             IPunkt punktPoczatkowy = _mapa.Komorki.ElementAt(2).Punkt;
             punktPoczatkowy.Wysokosc = 100; // wysoko
             _mapa.ZastosujPrzetwarzanie(aktualizator);
             IGeneratorRzeki generatorRzeki = new GeneratorRzeki(punktPoczatkowy);

             generatorRzeki.PunktPoczatkowy.Nastepnik.ShouldNotBeNull();
        }
        public void RzekaSpływającaDoNieckiNieTworzySię()
        {
            _mapa.Komorki.ElementAt(1).Punkt.Wysokosc = 0; // niecka
             var aktualizator = new AktualizatorNastepstwaMapyWysokosci();
             IPunkt punktPoczatkowy = _mapa.Komorki.ElementAt(2).Punkt;
             IGeneratorRzeki generatorRzeki = new GeneratorRzeki(punktPoczatkowy);
             _mapa.ZastosujPrzetwarzanie(aktualizator);

             _mapa.ZastosujPrzetwarzanie(generatorRzeki as IPrzetwarzaczMapy);

             generatorRzeki.UdaloSieUtworzyc.Value.ShouldBeFalse();
             _mapa.Rzeki.Count().ShouldEqual(0);
        }
        public void RzekaSpływającaDoMorzaPrzezKomorkeTworzySięPoprawnie(Podloze podlozeK2, TypKomorki typK2)
        {
            var aktualizator = new AktualizatorNastepstwaMapyWysokosci();
             IPunkt punktPoczatkowy = _mapa.Komorki.ElementAt(2).Punkt;
             _mapa.Komorki.ElementAt(1).Dane.Podloze = podlozeK2;
             _mapa.Komorki.ElementAt(1).Dane.Typ = typK2;
             IRog brzeg = _mapa.Komorki.ElementAt(0).Rogi.First();
             brzeg.Dane.Brzeznosc = BrzeznoscRogu.Brzeg;
             _mapa.ZastosujPrzetwarzanie(aktualizator);

             IGeneratorRzeki generatorRzeki = new GeneratorRzeki(punktPoczatkowy);
             _mapa.ZastosujPrzetwarzanie(generatorRzeki as IPrzetwarzaczMapy);

             generatorRzeki.UdaloSieUtworzyc.Value.ShouldBeTrue();
             _mapa.Rzeki.Count().ShouldEqual(1);
             _mapa.Rzeki.First().Odcinki.Last().PunktB.ShouldEqual(brzeg.Punkt);
             _mapa.Rzeki.First().Odcinki.Count.ShouldEqual(2); // k3-r2-r1
             _mapa.Komorki.ElementAt(2).Punkt.ZawieraRzeke.ShouldBeTrue();
             _mapa.Rogi.ElementAt(1).Punkt.ZawieraRzeke.ShouldBeTrue();
             _mapa.Rogi.ElementAt(0).Punkt.ZawieraRzeke.ShouldBeTrue();
        }