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