using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public interface Udalost { void vykonajSa(Park p); } public class Atrakce : Udalost { private List fronta; private string nazov; private int dlzkaJazdy; private int maxLudi; private int cena; //statistiky private int pocetNavstevnikov; private int maxFronta; public Atrakce(string nazov, int dlzkaJazdy, int maxLudi, int cena) { this.nazov = nazov; this.dlzkaJazdy = dlzkaJazdy; this.maxLudi = maxLudi; this.cena = cena; fronta = new List(); pocetNavstevnikov = 0; maxFronta = 0; } public string dajNazov() { return nazov; } public int dajCenu() { return cena; } public void vypisStatistiku() { Console.WriteLine(nazov + " " + pocetNavstevnikov + " " + maxFronta); } public void pridajDoFronty(Clovek c) { fronta.Add(c); pocetNavstevnikov++; if (fronta.Count > maxFronta) maxFronta = fronta.Count; } public void vykonajSa(Park p) { int aktualnyCas = p.dajAktualnyCas(); for (int i = 0; i < maxLudi; i++) { if (fronta.Count == 0) break; Clovek c = fronta[0]; fronta.RemoveAt(0); p.naplanuj(c, aktualnyCas + dlzkaJazdy); } p.naplanuj(this, aktualnyCas + dlzkaJazdy); } } public class Clovek : Udalost { private int mojePeniaze; public Clovek(int peniaze) { mojePeniaze = peniaze; } public void vykonajSa(Park p) { // vyber nahodnu atrakci Atrakce a = p.dajAtrakce()[p.r.Next(p.dajAtrakce().Count)]; if (a.dajCenu() > mojePeniaze) { p.odisielClovek(); Console.WriteLine("Idem domov, caute"); } else { mojePeniaze = mojePeniaze - a.dajCenu(); a.pridajDoFronty(this); Console.WriteLine("Idem na atrakciu " + a.dajNazov()); } } } public class Park { private List atrakce; private int navstevnici; SortedList> kalendar; private int aktualnyCas; public Random r; public Park(List atrakce, int navstevnici) { this.atrakce = atrakce; this.navstevnici = navstevnici; aktualnyCas = 0; kalendar = new SortedList>(); r = new Random(); } public int dajAktualnyCas() { return aktualnyCas; } public List dajAtrakce() { return atrakce; } public int dajPocetNavstevnikov() { return navstevnici; } public void odisielClovek() { navstevnici--; } public void naplanuj(Udalost u, int cas) { if (kalendar.ContainsKey(cas)) // ak uz je nejaka udalost v tom case kalendar[cas].Add(u); else kalendar.Add(cas, new List() { u }); } public Udalost vratNajblizsiuUdalost() { List najblizsieUdalosti = kalendar.First().Value; aktualnyCas = kalendar.First().Key; Udalost vybranaUdalost = null; foreach (Udalost u in najblizsieUdalosti) { if (u is Clovek) { vybranaUdalost = u; break; } } if (vybranaUdalost == null) vybranaUdalost = najblizsieUdalosti[0]; najblizsieUdalosti.Remove(vybranaUdalost); if (najblizsieUdalosti.Count == 0) kalendar.Remove(aktualnyCas); return vybranaUdalost; } } class Program { static void Main(string[] args) { List at = new List(); at.Add(new Atrakce("ahoj", 12, 5, 120)); at.Add(new Atrakce("cau", 15, 10, 200)); at.Add(new Atrakce("nazdar", 7, 7, 70)); List l = new List(); l.Add(new Clovek(430)); l.Add(new Clovek(530)); l.Add(new Clovek(430)); l.Add(new Clovek(460)); l.Add(new Clovek(830)); l.Add(new Clovek(230)); l.Add(new Clovek(130)); Park p = new Park(at, l.Count); foreach (Clovek c in l) p.naplanuj(c, 0); foreach (Atrakce a in at) p.naplanuj(a, 0); while (p.dajPocetNavstevnikov() > 0) p.vratNajblizsiuUdalost().vykonajSa(p); foreach (Atrakce a in at) a.vypisStatistiku(); } } }