コード例 #1
0
ファイル: Stanice.cs プロジェクト: Honzaik/MetroSim
        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);
            }
        }
コード例 #2
0
        //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);
        }
コード例 #3
0
ファイル: Pasazer.cs プロジェクト: Honzaik/MetroSim
 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;
     }
 }
コード例 #4
0
ファイル: SeznamStanic.cs プロジェクト: Honzaik/MetroSim
 //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);
             }
         }
     }
 }
コード例 #5
0
        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
        }
コード例 #6
0
ファイル: Pasazer.cs プロジェクト: Honzaik/MetroSim
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
 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>();
 }
コード例 #9
0
ファイル: Stanice.cs プロジェクト: Honzaik/MetroSim
        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));
            }
        }
コード例 #10
0
ファイル: Stanice.cs プロジェクト: Honzaik/MetroSim
 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);
     }
 }
コード例 #11
0
ファイル: StaniceLoader.cs プロジェクト: Honzaik/MetroSim
        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);
        }
コード例 #12
0
ファイル: Pasazer.cs プロジェクト: Honzaik/MetroSim
        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;
                    }
                }
            }
        }
コード例 #13
0
ファイル: Stanice.cs プロジェクト: Honzaik/MetroSim
 public Boolean jeSoused(Stanice stanice)
 {
     return(sousedi.IndexOf(stanice) > -1);
 }
コード例 #14
0
ファイル: Stanice.cs プロジェクト: Honzaik/MetroSim
 public void pridejSouseda(Stanice soused)
 {
     sousedi.Add(soused);
 }