public void najdiSousedy(SortedList <string, Stanice> seznamStanic) { Stanice novySoused = null; if (jeKonecna) //hledam pouze jednu nejblizsi stanici { foreach (KeyValuePair <string, Stanice> k in seznamStanic) { //je na stejné lince && není to ona sama && ještě jsem jí nenašel && (ještě jsem žádného kandidáta nenašel || našel jsem blížší než je aktualne novySoused) if ((k.Value.pismeno.Equals(pismeno)) && (!k.Value.id.Equals(id)) && (!jeSoused(k.Value)) && (novySoused == null || (Math.Abs(kilometr - k.Value.kilometr) < Math.Abs(kilometr - novySoused.kilometr)))) { novySoused = k.Value; } } pridejSouseda(novySoused); } else { //"normální stanice" má 2 sousedy - 2x foreach, jelikož jeden dělal problémy a toto není až taková žátěž novySoused = null; //hledam souseda na index 0, to je ten s nejmensim kladnym rozdilem foreach (KeyValuePair <string, Stanice> k in seznamStanic) { float novyRozdil = k.Value.kilometr - kilometr; if (novyRozdil > 0 && (k.Value.pismeno.Equals(pismeno)) && (!k.Value.id.Equals(id)) && (!jeSoused(k.Value)) && (novySoused == null || (novyRozdil < (novySoused.kilometr - kilometr)))) { novySoused = k.Value; } } pridejSouseda(novySoused); novySoused = null; //hledam souseda na index 1, to je ten s nejmensim zapornym rozdilem foreach (KeyValuePair <string, Stanice> k in seznamStanic) { float novyRozdil = kilometr - k.Value.kilometr; if (novyRozdil > 0 && (k.Value.pismeno.Equals(pismeno)) && (!k.Value.id.Equals(id)) && (!jeSoused(k.Value)) && (novySoused == null || (novyRozdil < (kilometr - novySoused.kilometr)))) { novySoused = k.Value; } } pridejSouseda(novySoused); } if (jePrestupni) //stanice je přestupní tak ještě najdeme její adékvátní stanici na druhé lince (předpokládá se, že z jedné stanice jde pouze přestoupit na jednu linku) { novySoused = null; foreach (KeyValuePair <string, Stanice> k in seznamStanic) { if ((!k.Value.id.Equals(id)) && k.Value.jmeno.Equals(jmeno)) { novySoused = k.Value; } } pridejSouseda(novySoused); } }
//najde příští stanici a naplánuje příjezd public void jedDoDalsiStanice() { float vzdalenostPristiStanice = 0f; int pristiStaniceIndex = 0; if (aktualniStanice.pocetSousedu() > 1 && !smerVice) //aktuální stanice není konečná a jedu směrem níže -> soused níže je na indexu 1, soused výše je na 0 { pristiStaniceIndex = 1; } vzdalenostPristiStanice = aktualniStanice.vzdalenostOdSouseda(pristiStaniceIndex); float casPrijezdu = model.getCas() + (vzdalenostPristiStanice / rychlost); model.pridejDoKalendare(new Udalost(casPrijezdu, this, TypUdalosti.prijezdDoStanice)); if (aktualniStanice.jeKonecna) { bool oldSmer = smerVice; if (aktualniStanice.kilometr > 0) { smerVice = false; } else { smerVice = true; } if (oldSmer ^ smerVice) { //pokud se mění směr tak se souprava otáčí v konečné stanici //Console.WriteLine("OTACIM SE " + id); } } aktualniStanice = aktualniStanice.vratSouseda(pristiStaniceIndex); }
public override void zpracuj(Udalost udalost) { switch (udalost.co) { case TypUdalosti.prichodDoStanice: if (this.id.Equals("0")) //log hlavního pasažéra (má id 0) { Console.WriteLine("pasazer " + id + " prisel do stanice " + aktualniStanice.id + " v " + udalost.kdy); } if (aktualniStanice == sKonec) //daný pasažér dorazil do své konečné stanice { //Console.WriteLine("PASAZER " + id + " DORAZIL DO KONCE " + aktualniStanice.id + " v " + u.kdy); if (this.id.Equals("0")) //hlavni pasazer { model.jeKonec = true; } model.removePasazer(this); break; } setPristiStanice(); if (aktualniStanice.jePrestupni && aktualniStanice.jmeno.Equals(pristiStanice.jmeno)) //prestoupeni v přestupní stanici { model.pridejDoKalendare(new Udalost(udalost.kdy + aktualniStanice.dobaPrestupu, this, TypUdalosti.prichodDoStanice)); } else { model.getSeznamStanic().stanice[aktualniStanice.id].zaradNaNastupiste(this, pristiStanice); } aktualniStanice = pristiStanice; break; } }
//najde všechny konečné stanice private void setKonecneStanice() { konecneStanice = new SortedList <string, Stanice[]>(); foreach (KeyValuePair <string, Stanice> k in stanice) { if (k.Value.jeKonecna) { if (konecneStanice.ContainsKey(k.Value.pismeno)) //uz je najita jedna konecna stanice { Stanice[] stanice = konecneStanice[k.Value.pismeno]; if (stanice[0] == null) { stanice[0] = k.Value; } else { stanice[1] = k.Value; } } else { Stanice[] stanice = new Stanice[2]; if (k.Value.kilometr == 0) { stanice[0] = k.Value; } else { stanice[1] = k.Value; } konecneStanice.Add(k.Value.pismeno, stanice); } } } }
public int frekvenceLidi; //kolik lidí se má spawnout za 1 min public Nastaveni() { pocatecniStanice = null; konecnaStanice = null; casPrichodu = 0; nastaveniLinek = new SortedList <string, NastaveniLinky>(); frekvenceLidi = 1; //tyto hodnoty se stejne updatuji z GUI, jen inicializace }
public float start; //kdy přišel do metra public Pasazer(Model model, string id, Stanice sZacatek, Stanice sKonec, float start) { this.model = model; this.id = id; this.sZacatek = sZacatek; this.sKonec = sKonec; this.start = start; this.aktualniStanice = sZacatek; //Console.WriteLine("vytvoren pasazer " + id + ", jede z " + sZacatek.getComboBoxName() + " do " + sKonec.getComboBoxName() + ", vyrazi v case " + start); }
public void pridejHlavnihoPasazera(Stanice zacatek, Stanice konec, float start) { Pasazer hlavni = new Pasazer(this, "0", zacatek, konec, start); seznamPasazeru.Add(pocetVygenerovanychPasazeru, hlavni); pocetVygenerovanychPasazeru++; Udalost prichodPrvnihoPasazera = new Udalost(start, hlavni, TypUdalosti.prichodDoStanice); kalendar.pridejUdalost(prichodPrvnihoPasazera); }
public Souprava(Model model, string id, string pismeno, bool smerVice, float rychlost, int kapacita, float dobaCekaniVeStanici, Stanice pocatecniStanice) { this.model = model; this.id = id; this.pismeno = pismeno; this.smerVice = smerVice; this.rychlost = rychlost; this.kapacita = kapacita; this.dobaCekaniVeStanici = dobaCekaniVeStanici; aktualniStanice = pocatecniStanice; seznamPasazeru = new List <Pasazer>(); }
public float vzdalenostOdSouseda(int index) // index = 0 - pravy soused (vetsi km); index = 1 - levy soused, index = 2 - prestupni { Stanice soused = sousedi.ElementAt(index); if (soused.jmeno.Equals(jmeno)) { return(0); } else { return((float)Math.Round(Math.Abs(soused.kilometr - kilometr), 1)); } }
public void zaradNaNastupiste(Pasazer p, Stanice pristi) { if (pismeno.Equals(pristi.pismeno)) { if (pristi.kilometr > kilometr) { nastupisteVice.Enqueue(p); //Console.WriteLine("pasazer " + p.id + " zařazen do fronty VICE (" + id + "), jede do stanice " + pristi.id); } else { nastupisteMene.Enqueue(p); //Console.WriteLine("pasazer " + p.id + " zařazen do fronty MENE (" + id + "), jede do stanice " + pristi.id); } } else { Console.WriteLine("CHYBAAA"); System.Environment.Exit(1); } }
public static SortedList <string, Stanice> nactiStanice(string path) { SortedList <string, Stanice> seznam = new SortedList <string, Stanice>(); StreamReader sr = new StreamReader(path); string line; while ((line = sr.ReadLine()) != null) { if (line.Length > 0 && line[0] != '#') // není prázdný řádek ani komentář { string[] data = line.Split(','); string pismeno = data[0].Trim(); string jmeno = data[1].Trim(); float kilometr = float.Parse(data[2], CultureInfo.InvariantCulture); bool jePrestupni = false; bool jeKonecna = false; string prestupniPismeno = "x"; if (data.Length > 3) { try { jeKonecna = (Int32.Parse(data[3]) == 1); if (data.Length == 6) { jePrestupni = (Int32.Parse(data[4]) == 1); prestupniPismeno = data[5].Trim(); } } catch (FormatException) { Console.Error.WriteLine("chybný vstup: '" + line + "'"); } } string id = pismeno + jmeno.Substring(0, 3); Stanice stanice = new Stanice(id, pismeno, jmeno, kilometr, jeKonecna, jePrestupni, prestupniPismeno, DOBA_PRESTUPU); seznam.Add(id, stanice); } } return(seznam); }
public void setPristiStanice() { if (aktualniStanice.jePrestupni && aktualniStanice.prestupniPismeno.Equals(sKonec.pismeno)) //jsem v prestupni stanici a chci prestupit { pristiStanice = model.getSeznamStanic().stanice[sKonec.pismeno + aktualniStanice.jmeno.Substring(0, 3)]; return; } if (aktualniStanice.pismeno.Equals(sKonec.pismeno)) //jsou j*z na stejne lince { pristiStanice = sKonec; } else { foreach (KeyValuePair <string, Stanice> k in model.getSeznamStanic().stanice) //najdi prestupni stanici ktera je { if (k.Value.jePrestupni && k.Value.pismeno.Equals(aktualniStanice.pismeno) && k.Value.prestupniPismeno.Equals(sKonec.pismeno)) { pristiStanice = k.Value; } } } }
public Boolean jeSoused(Stanice stanice) { return(sousedi.IndexOf(stanice) > -1); }
public void pridejSouseda(Stanice soused) { sousedi.Add(soused); }