Esempio n. 1
0
        /// <summary>
        /// what the simulation every day does
        /// </summary>
        public void Simulation()
        {
            if (!Initialized)
            {
                FireAusgabe("Initialisierung noch nicht abgeschlossen! Zuerst müssen alle Personen geladen werden.");
                return;
            }

            try
            {
                this.SaveAktuellerTagToDb();
                foreach (Person person in workingList)
                {
                    //check if person is still alive; if not you have nothing to do here
                    if (!person.Lebend)
                    {
                        continue;
                    }

                    //gets the age of the person and his/her partner when a partner exists
                    //int alter = startDatum.AddDays(vergangeneTage).Year - person.Geburtsdatum.Year;
                    //int alterPartner = 0;
                    int alterDurchschnitt = 0;
                    if (person.MeinPartner != null)
                    {
                        //person.MeinPartner.Alter = startDatum.AddDays(vergangeneTage).Year - person.MeinPartner.Geburtsdatum.Year;
                        alterDurchschnitt = (person.Alter + person.MeinPartner.Alter) / 2;
                    }

                    //after 9 months carrying that little person in you, you feel good to see your baby
                    if (person.IsSchwanger && person.WirdKindGebaerenAnTag == aktuellerTag)
                    {
                        person.GebaereKind();
                    }

                    //celebrate your birthday by sharing it with others
                    if (person.Geburtsdatum.Month == aktuellerTag.Month && person.Geburtsdatum.Day == aktuellerTag.Day && person.Alter == 16)
                    {
                        FireAusgabe(person.Vorname + " " + person.Familienname + " hat Geburtstag und wird " + person.Alter + " Jahre alt.");
                    }

                    //chance of max 19.4% to get the girlfriend pregnant (chance depends on the summed up age of both partners and on the count of children they already have and decreases when the people gets older and get more children)
                    if (person.MeinPartner != null && !person.IsSchwanger && !person.MeinPartner.IsSchwanger)
                    {
                        double x     = 0;
                        int    iNext = rand.Next();
                        if (alterDurchschnitt < 32)
                        {
                            if (person.Partner != 0 && iNext % 10000 < ((200.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 2))))
                            {
                                person.ZeugeKind();
                            }
                        }
                        else if (alterDurchschnitt < 46)
                        {
                            if (person.Partner != 0 && iNext % 10000 < ((350.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 2))))
                            {
                                person.ZeugeKind();
                            }
                        }
                        else if (person.Partner != 0 && iNext % 10000 < (x = (55.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 3))) && x > 0)
                        {
                            person.ZeugeKind();
                        }
                    }

                    //chance of 0.1% to find a partner
                    if (person.DarfPartner && rand.Next() % 1000 < 1)
                    {
                        person.SuchePartner();
                    }


                    //chance of min 0.0001% to kill the person by old age when they reached 80 years (increases the older the person is)
                    if (person.Alter > 80)
                    {
                        int iNext = rand.Next();
                        if (iNext % 10000 < 0.1 * person.Alter)
                        {
                            person.Sterben();
                        }
                    }

                    //zuEntfernende.Enqueue(person);
                    //neuHinzuzufuegende.Enqueue(person);
                }
            }
            finally
            {
                if (ZuEntfernende.Count > 0 || NeuHinzuzufuegende.Count > 0)
                {
                    while (ZuEntfernende.Count > 0)
                    {
                        Person entf = ZuEntfernende.Dequeue();
                        entf.PersonAusgabe -= Person_PersonAusgabe;
                        WorkingList.Remove(entf);
                    }
                    while (NeuHinzuzufuegende.Count > 0)
                    {
                        Person add = NeuHinzuzufuegende.Dequeue();
                        add.PersonAusgabe += Person_PersonAusgabe;
                        WorkingList.Add(add);
                    }
                    WorkingList.Sort(SortTheList);
                    this.ListChanged?.Invoke(this, new EventArgs());
                }
                aktuellerTag = aktuellerTag.AddDays(1);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// create an object for each person in the table and store each object in a list
        /// </summary>
        public void LoadPersons()
        {
            using (Personen personen = new Personen())
            {
                personen.Where   = "Nummer is not null AND Lebend = 1";
                personen.OrderBy = "nummer asc";
                personen.Read();

                //checking if there are some persons
                if (personen.EoF)
                {
                    CreateFirst();
                    LoadPersons();
                    return;
                }

                using (Familien familien = new Familien())
                {
                    using (Vornamen vornamen = new Vornamen())
                    {
                        while (!personen.EoF)
                        {
                            vornamen.Where = "Nummer = " + personen.DbVorname_Nr;
                            vornamen.Read();

                            familien.Where = "Nummer = " + personen.DbFamilie_Nr;
                            familien.Read();

                            //load all persons from database into a cache
                            Person person = new Person(personen.Nummer, vornamen.DbVorname, familien.DbFamilienname, personen.DbGeburtsdatum, personen.DbGeneration ?? 0, personen.DbVater_Nr, personen.DbMutter_Nr, personen.DbPartner_Nr, personen.DbLebend);
                            if (person.Vater != null && person.Vater != 0)
                            {
                                var v = WorkingList.Where(x => x.Nummer == person.Vater);
                                if (v.Count() > 0)
                                {
                                    person.MeinVater = v.First();
                                }
                            }
                            if (person.Mutter != null && person.Mutter != 0)
                            {
                                var m = WorkingList.Where(x => x.Nummer == person.Mutter);
                                if (m.Count() > 0)
                                {
                                    person.MeineMutter = m.First();
                                }
                            }

                            if (personen.DbBekommtKindAnTag != null && personen.DbBekommtKindAnTag != new DateTime(1, 1, 1))
                            {
                                person.IsSchwanger           = true;
                                person.WirdKindGebaerenAnTag = personen.DbBekommtKindAnTag;
                            }
                            person.PersonAusgabe += Person_PersonAusgabe;
                            WorkingList.Add(person);

                            FireAusgabe("loaded '" + person.Vorname + " " + person.Familienname + "'");
                            personen.Skip();
                        }
                    }
                }
            }
        }