private Prostokat ZbierzKwadrat(bool[,] kopiaMapy, Punkt <int> pozycja)
        {
            int szerokosc = pozycja.X;

            for (; szerokosc < rozmiarMapyX; ++szerokosc)
            {
                if (kopiaMapy[szerokosc, pozycja.Y])
                {
                    break;
                }
            }


            int  wysokosc  = pozycja.Y;
            bool czasWyjsc = false;

            for (; wysokosc < rozmiarMapyY && !czasWyjsc; ++wysokosc)
            {
                for (int i = pozycja.X; i < szerokosc; ++i)
                {
                    if (kopiaMapy[i, wysokosc])
                    {
                        wysokosc--;
                        czasWyjsc = true;
                    }
                }
            }


            Prostokat kwadrat = new Prostokat(pozycja, wysokosc - pozycja.Y, szerokosc - pozycja.X);

            ZaznaczNaMapie <bool>(kopiaMapy, kwadrat, true);

            return(kwadrat);
        }
 private void ZaznaczNaMapie <T>(T[,] mapa, Prostokat kwadrat, T wartosc)
 {
     for (int j = kwadrat.Pozycja.Y; j < kwadrat.Pozycja.Y + kwadrat.Wysokosc && j < rozmiarMapyY; ++j)
     {
         for (int i = kwadrat.Pozycja.X; i < kwadrat.Pozycja.X + kwadrat.Szerokosc && i < rozmiarMapyX; ++i)
         {
             mapa[i, j] = wartosc;
         }
     }
 }
        /// <summary>
        /// Generuje budynki w miejscach optymalnych przez podział przestrzeni
        /// </summary>
        private void GenerujBudynki()
        {
            List <Prostokat> kwadraty = ZbierzWolneKwadraty();

            while (kwadraty.Count > 0)
            {
                for (int l = kwadraty.Count - 1; l >= 0; --l)
                {
                    Prostokat kwadrat = kwadraty[l];

                    if (kwadrat.Wysokosc >= 2 && kwadrat.Szerokosc >= 2)
                    {
                        bool czyDziele = GeneratorPoziomu.GeneratorLosowosci.Next(0, 2) == 1 ? true : false;
                        if (kwadrat.Wysokosc > 6 || kwadrat.Szerokosc > 6 || kwadrat.Wysokosc * kwadrat.Szerokosc > 16)
                        {
                            czyDziele = true;
                        }
                        else if (kwadrat.Wysokosc * kwadrat.Szerokosc <= 8 || (kwadrat.Szerokosc <= 4 && kwadrat.Wysokosc <= 4))
                        {
                            czyDziele = false;
                        }

                        if (czyDziele)
                        {
                            bool dzielePionowo = true;
                            bool dzielePoziomo = true;

                            if (kwadrat.Wysokosc > kwadrat.Szerokosc + 1)
                            {
                                dzielePionowo = false;
                            }
                            else if (kwadrat.Szerokosc > kwadrat.Wysokosc + 1)
                            {
                                dzielePoziomo = false;
                            }
                            else
                            {
                                if (GeneratorPoziomu.GeneratorLosowosci.Next(0, 2) == 0)
                                {
                                    dzielePionowo = false;
                                }
                                else
                                {
                                    dzielePoziomo = false;
                                }
                            }

                            if (dzielePionowo)
                            {
                                kwadraty.Add(new Prostokat(kwadrat.Pozycja, kwadrat.Wysokosc, kwadrat.Szerokosc - (kwadrat.Szerokosc / 2)));
                                kwadraty.Add(new Prostokat(new Punkt <int>(kwadrat.Pozycja.X + (kwadrat.Szerokosc - (kwadrat.Szerokosc / 2)), kwadrat.Pozycja.Y), kwadrat.Wysokosc, kwadrat.Szerokosc / 2));
                            }
                            else if (dzielePoziomo)
                            {
                                kwadraty.Add(new Prostokat(kwadrat.Pozycja, kwadrat.Wysokosc - (kwadrat.Wysokosc / 2), kwadrat.Szerokosc));
                                kwadraty.Add(new Prostokat(new Punkt <int>(kwadrat.Pozycja.X, kwadrat.Pozycja.Y + (kwadrat.Wysokosc - (kwadrat.Wysokosc / 2))), kwadrat.Wysokosc / 2, kwadrat.Szerokosc));
                            }

                            kwadraty.Remove(kwadrat);
                        }
                        else
                        {
                            Budynki.Add(kwadrat);
                            kwadraty.Remove(kwadrat);

                            ZaznaczNaMapie <TypPrzestrzeni>(Mapa, kwadrat, TypPrzestrzeni.Budynek);
                        }
                    }
                    else
                    {
                        kwadraty.Remove(kwadrat);
                    }
                }
            }
        }