public void UsadHosta() //Usadenie novych hosti do restaurace { int PredchadzajuciPocetStolov = PocetVolStoly + 1; while (PredchadzajuciPocetStolov != PocetVolStoly) // Ak su nejaky hostia cakajuci na vstup, tak ich usadzame, dokym mame volne stoly { PredchadzajuciPocetStolov = PocetVolStoly; if (FrontaNaVstupe.Count > 0) { Zakaznik NaVstup = FrontaNaVstupe.Peek(); if (NaVstup.PocetStolov <= PocetVolStoly) //ak je pre daneho hosta dost volnych stolov, zakaznik sa usadi { NaVstup = FrontaNaVstupe.Dequeue(); NaVstup.Stav = StavHosta.Usadeny; PocetVolStoly -= NaVstup.PocetStolov; //Dane stoly sa obsadia VRestauraci.Add(NaVstup); //Zakaznik sa usadi do restaurace KalendarRestaurace.Pridaj(this.cas + 3, Osoba.Casnik, StavHosta.Usadeny, NaVstup.Cislo); // Do kalendara: ze o 3 minuty si bude chciet zakaznik objednat KalendarRestaurace.Pridaj(this.cas + 3 + 15, Osoba.Host, StavHosta.Usadeny, NaVstup.Cislo); //Do kalendara: trpezlivost 15 min na cekani na objednani u casnika } } } if (MaxPocStol - PocetVolStoly > MaxPotrebStolov) { MaxPotrebStolov = MaxPocStol - PocetVolStoly; } //udrzujeme si premennu, kolko maximalne bolo sucasne obsadenych stolov }
public void SpracujHotoveJedlo(ref Kalendar kalendar, int cislo, int cas) //Jeden kuchar dovaril jeden chod z objednavky { foreach (ObjednavkaVKuchyni objednavka in ZoznamPripravovanychObjednavok) { //Vyradenie daneho zakaznika z pripravovanych objednavok if (objednavka.CisloObjednavky == cislo) { objednavka.HotoveJedla += 1; //Jedno jedlo z danej objednavky je hotove PocetVolKuchar += 1; //Kuchar, ktory varil dane jedlo sa uvolnil ZamestnajKuchara(ref kalendar, cas); //Uvolneneho kuchara mozeme zas zamestnat if (objednavka.HotoveJedla == objednavka.CelkovoObjednanych) //Objednavka je hotova, moze sa odniest hostom { kalendar.Pridaj(cas, Osoba.Casnik, StavHosta.Objednane, objednavka.CisloObjednavky); //Dame pokyn casnikovy, ze jedlo je hotove a moze ho odniest zakaznikom ZoznamPripravovanychObjednavok.Remove(objednavka); //Hotovu objednavku vyradime z kuchyne } return; // odoberame len prvy vyskyt } } }
public void ZamestnajObsluhu(ref Kalendar KalendarRestaurace, ref List <Zakaznik> VRestauraci, ref Kuchyna kuchyna, int cas) { if (PocetVolObsluha > 0) // Ak je volny casnik, zamestname ho { //Vyhladanie ulohy, ktora sa musi spracovat nejdriv. Ak nemame ziadnu ulohu, nic sa nestane. UlohaPreObsluhu NaSpracovanie = null; foreach (UlohaPreObsluhu uloha in ZoznamUlohPreObsluhu) { if ((NaSpracovanie == null) || (uloha.cas < NaSpracovanie.cas)) { NaSpracovanie = uloha; } } if (NaSpracovanie != null) //Ak sa nasla uloha pre obsluhu, tak ta, ktoru treba spracovat nejdriv { ZoznamUlohPreObsluhu.Remove(NaSpracovanie); //Odstranenie ulohy zo zoznamu uloh int Pozice = NajdiStolSoZakaznikom(NaSpracovanie.cisloHosta, VRestauraci); //Pozice zakaznika v zozname VRestauraci if (Pozice == -1) //Host s danym cislem se nenasel v restauraci { Console.WriteLine("CHYBA. Nenasiel sa host s danym cislom, medzi hostami usadenymi v restauraci, chyba moze byt v zruseni udalosti v kalendari, ak hostovy dojde trpezlivost na cakanie na casnika."); } else //Host s danym cislom sa nasiel v restauraci { KalendarRestaurace.Odober(Osoba.Host, VRestauraci[Pozice].Cislo); //Odoberieme z kalendara zakaznikovu trpezlivost PocetVolObsluha -= 1; int CasNaPripravuNapojov; switch (VRestauraci[Pozice].Stav) { case StavHosta.Usadeny: //Usadeny host si chce objednat, zamestna 1 casnika kuchyna.PridajObjednavkuDoKuchyne(VRestauraci[Pozice].Cislo, VRestauraci[Pozice].jedlo, ref KalendarRestaurace, cas); //Predanie objednavky do kuchyne, to da pokyn kucharom, aby varili VRestauraci[Pozice].Stav = StavHosta.Objednane; //Uvolnenie casnika po tom, co prijme objednavku a donesie zakaznikovi napoje CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi; //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3, Osoba.Casnik, StavHosta.Objednane, -1); //Casnika uvolnime za 3 min (cas na prijatie objednavky) + pol minuty za kazdeho hosta na pripravu napoja //Trpezlivost zakaznika na prinesenie jedla, po objednani a prineseni napojov int CasNaCakanieNaJedlo = VRestauraci[Pozice].PocetStolov * 10 + 15; //Trpezlivost na pripravu jedla bude 15 min + 10 min za kazdy stol daneho zakaznika (viac ludi bude musiet dlhsie cakat na pripravu) KalendarRestaurace.Pridaj(cas + CasNaPripravuNapojov + 3 + CasNaCakanieNaJedlo, Osoba.Host, StavHosta.Objednane, VRestauraci[Pozice].Cislo); break; case StavHosta.Objednane: //Jedlo je hotove, kuchyna dala pokyn na odnesenie VRestauraci[Pozice].Stav = StavHosta.DoneseneJedlo; KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.DoneseneJedlo, -1); //Uvolnenie casnika po 2 min, kedy nosi jedlo na stol KalendarRestaurace.Pridaj(cas + 4 + 15, Osoba.Host, StavHosta.DoneseneJedlo, VRestauraci[Pozice].Cislo); //15 min zakaznik je break; case StavHosta.CakaNaObjednanieNapoja: VRestauraci[Pozice].Stav = StavHosta.DonesenyNapoj; CasNaPripravuNapojov = VRestauraci[Pozice].PocetLudi; //Pre kazdeho zakaznika bude trvat priprava napoja pol minuty KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov, Osoba.Casnik, StavHosta.DonesenyNapoj, -1); //Uvolnenie casnika po 1 min na prijatie objednavky + priprava napojov KalendarRestaurace.Pridaj(cas + 3 + CasNaPripravuNapojov + 15, Osoba.Host, StavHosta.DonesenyNapoj, VRestauraci[Pozice].Cislo); //15 min na vypitie napojov break; case StavHosta.Zaplatim: VRestauraci[Pozice].Spokojnost = 0; VRestauraci[Pozice].Stav = StavHosta.Odchod; KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo); KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1); break; case StavHosta.Odchod: //Odchod nespokojneho zakaznika z restaurace po uklideni KalendarRestaurace.Pridaj(cas + 4, Osoba.Host, StavHosta.Odchod, VRestauraci[Pozice].Cislo); KalendarRestaurace.Pridaj(cas + 4, Osoba.Casnik, StavHosta.Odchod, -1); break; default: break; } } } } }
public void ZamestnajKuchara(ref Kalendar Kalendar, int cas) { int Pom = -1; int i = 0; if (PocetVolKuchar > 0) { // Najprv dokoncime rozpracovanu objednavku. Ak su vsetky jedla z rozpracovanych objednavom uz v priprave, volny kuchar zacne pracovat na novej objednavke for (int j = 0; j < ZoznamPripravovanychObjednavok.Count; j++) //Zistujeme, ci existuje rozpracovana objednavka, ktoru treba dokoncit { if (ZoznamPripravovanychObjednavok[j].jedlo[0] + ZoznamPripravovanychObjednavok[j].jedlo[1] + ZoznamPripravovanychObjednavok[j].jedlo[2] > 0) { Pom = j; } } if (Pom >= 0) { //V zozname pripravovanych objednavok je este objednavka, ktoru treba dokoncit i = 2; while (ZoznamPripravovanychObjednavok[Pom].jedlo[i] == 0) { i -= 1; } ZoznamPripravovanychObjednavok[Pom].jedlo[i] -= 1; switch (i) { //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky case 0: //Jedla na pozicii 0 trva pripravit 4 minuty Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky); break; case 1: //Jedla na pozicii 1 trva pripravit 7 minut Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky); break; case 2: //Jedla na pozicii 2 trva pripravit 10 minut Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, ZoznamPripravovanychObjednavok[Pom].CisloObjednavky); break; default: break; } PocetVolKuchar -= 1; } else //Ziadna objednavka uz nie je rozpracovana, teda vezmeme dalsiu objednavku z fronty a zacneme na nej pracovat { if (FrontaObjednavokVKuchyni.Count > 0) { //Najdeme objednavku, ktora prisla najskor ObjednavkaVKuchyni pomocna = null; foreach (ObjednavkaVKuchyni objednavka in FrontaObjednavokVKuchyni) { if ((pomocna == null) || (objednavka.cas < pomocna.cas)) { pomocna = objednavka; } } FrontaObjednavokVKuchyni.Remove(pomocna); //Odstranime objednavku z fronty na pripravu i = 2; //Najdeme jedlo, ktore treba pripravit, od casovo narocnejich po menej narocne while (pomocna.jedlo[i] == 0) { i -= 1; } pomocna.jedlo[i] -= 1; switch (i) { //podla narocnosti jedla, zamestname jedneho kuchara pripravou jedneho jedla z danej objednavky case 0: //Jedla na pozicii 0 trva pripravit 4 minuty Kalendar.Pridaj(cas + 4, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky); break; case 1: //Jedla na pozicii 1 trva pripravit 7 minut Kalendar.Pridaj(cas + 7, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky); break; case 2: //Jedla na pozicii 2 trva pripravit 10 minut Kalendar.Pridaj(cas + 10, Osoba.Kuchar, StavHosta.Objednane, pomocna.CisloObjednavky); break; default: break; } ZoznamPripravovanychObjednavok.Add(pomocna); //Do zoznamu pridame objednavku, kde uz oznacime, ktore jedlo ide dany kuchar pripravit PocetVolKuchar -= 1; // Jeden kuchar sa zamestna varenim } } } }