diff --git a/SharpPropagation/Population.cs b/SharpPropagation/Population.cs index 81b4cdd..17765ce 100644 --- a/SharpPropagation/Population.cs +++ b/SharpPropagation/Population.cs @@ -124,185 +124,167 @@ namespace SharpPropagation } public void Propagate() { - int test = 0; - int[] stats; - do + List peopleToCheck = new List(); + + //Parallel.For(0, Dimensions.Width,x => + for (int x = 0; x < Dimensions.Width; x++) { - //REMOVE THIS WHEN RELEASE - test++; - - if (test > 100) + //Parallel.For(0, Dimensions.Width,y => + for (int y = 0; y < Dimensions.Height; y++) { - //Display(); - test = 0; - } - - stats = GetStats(); - List peopleToCheck = new List(); - - //Parallel.For(0, Dimensions.Width,x => - for (int x = 0; x < Dimensions.Width; x++) - { - //Parallel.For(0, Dimensions.Width,y => - for (int y = 0; y < Dimensions.Width; y++) + switch (Humans[x, y].PresentState) { - switch (Humans[x, y].PresentState) - { - //for now only infected peoples are interesting - case Human.State.Infected: - peopleToCheck.Add(Humans[x, y]); - break; - default: - //do nothing - break; - } - }//); + //for now only infected peoples are interesting + case Human.State.Infected: + peopleToCheck.Add(Humans[x, y]); + break; + default: + //do nothing + break; + } }//); + }//); - List peopleToInfect = new List(); - List peopleToCure = new List(); - List peopleToKill = new List(); + List peopleToInfect = new List(); + List peopleToCure = new List(); + List peopleToKill = new List(); - //Parallel.ForEach(peopleToCheck, person => - foreach (Human person in peopleToCheck) + //Parallel.ForEach(peopleToCheck, person => + foreach (Human person in peopleToCheck) + { + //I am assuming that if the Human is Curing or dying on this tick, he cant infect anyone + if (wouldCure(Rnd)) { - //I am assuming that if the Human is Curing or dying on this tick, he cant infect anyone - if (wouldCure()) + peopleToCure.Add(person); + } + else + { + if (wouldDie(Rnd)) { - peopleToCure.Add(person); + peopleToKill.Add(person); } else { - if (wouldDie()) + //now we can start to check if people would be infected or not + if (person.Position.X > 0 && person.Position.X < Dimensions.Width -1 && person.Position.Y > 0 && person.Position.Y < Dimensions.Height -1) { - peopleToKill.Add(person); - } - else - { - //now we can start to check if people would be infected or not - if (person.Position.X > 0 && person.Position.X < Dimensions.Width - 1 && person.Position.Y > 0 && person.Position.Y < Dimensions.Height - 1) + /// ### + /// #@# + /// ### + + List potentialInfections = new List(); + //potentialInfections.Add(Humans[person.Position.X,person.Position.Y]); + + potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y - 1]); //Top Left + potentialInfections.Add(Humans[person.Position.X, person.Position.Y - 1]); //Top + potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y - 1]); //Top Right + + potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y]); //Left + potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y]); //Right + + potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y + 1]); //Bottom Left + potentialInfections.Add(Humans[person.Position.X, person.Position.Y + 1]); //Bottom + potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y + 1]); //Bottom Right + + foreach (Human potentialInfected in potentialInfections) { - /// ### - /// #@# - /// ### - - List potentialInfections = new List(); - //potentialInfections.Add(Humans[person.Position.X,person.Position.Y]); - - potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y - 1]); //Top Left - potentialInfections.Add(Humans[person.Position.X, person.Position.Y - 1]); //Top - potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y - 1]); //Top Right - - potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y]); //Left - potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y]); //Right - - potentialInfections.Add(Humans[person.Position.X - 1, person.Position.Y + 1]); //Bottom Left - potentialInfections.Add(Humans[person.Position.X, person.Position.Y + 1]); //Bottom - potentialInfections.Add(Humans[person.Position.X + 1, person.Position.Y + 1]); //Bottom Right - - foreach (Human potentialInfected in potentialInfections) + if (wouldBeInfected(Rnd)) { - if (wouldBeInfected()) + if (potentialInfected.PresentState == Human.State.Normal) { - if (potentialInfected.PresentState == Human.State.Normal) - { - peopleToInfect.Add(potentialInfected); - } + peopleToInfect.Add(potentialInfected); } } } - else - { - //TODO - //Check every special cases (corners sides etc..) + } + else + { + //TODO + //Check every special cases (corners sides etc..) - //REMOVE WHEN IMPLEMENTED - //It is here to prevent an infected in the borders to keep the programm running as he thinks there are still people to simulate - peopleToKill.Add(person); + //REMOVE WHEN IMPLEMENTED + //It is here to prevent an infected in the borders to keep the programm running as he thinks there are still people to simulate + peopleToKill.Add(person); - /// @## - /// ### - /// ### + /// @## + /// ### + /// ### - /// #@# - /// ### - /// ### + /// #@# + /// ### + /// ### - /// ##@ - /// ### - /// ### + /// ##@ + /// ### + /// ### - /// ### - /// @## - /// ### + /// ### + /// @## + /// ### - /// ### - /// ##@ - /// ### + /// ### + /// ##@ + /// ### - /// ### - /// ### - /// @## + /// ### + /// ### + /// @## - /// ### - /// ### - /// #@# + /// ### + /// ### + /// #@# - /// ### - /// ### - /// ##@ - } + /// ### + /// ### + /// ##@ } } + } + }//); + if (peopleToInfect.Count > 0) + { + //Parallel.ForEach(peopleToInfect, infected => + foreach (Human infected in peopleToInfect) + { + Humans[infected.Position.X, infected.Position.Y].PresentState = Human.State.Infected; }//); - if (peopleToInfect.Count > 0) + } + if (peopleToCure.Count > 0) + { + //Parallel.ForEach(peopleToCure, cured => + foreach (Human cured in peopleToCure) { - //Parallel.ForEach(peopleToInfect, infected => - foreach (Human infected in peopleToInfect) - { - Humans[infected.Position.X, infected.Position.Y].PresentState = Human.State.Infected; - }//); - } - if (peopleToCure.Count > 0) + Humans[cured.Position.X, cured.Position.Y].PresentState = Human.State.Immune; + }//); + } + if (peopleToKill.Count > 0) + { + //Parallel.ForEach(peopleToKill, dead => + foreach (Human dead in peopleToKill) { - //Parallel.ForEach(peopleToCure, cured => - foreach (Human cured in peopleToCure) - { - Humans[cured.Position.X, cured.Position.Y].PresentState = Human.State.Immune; - }//); - } - if (peopleToKill.Count > 0) - { - //Parallel.ForEach(peopleToKill, dead => - foreach (Human dead in peopleToKill) - { - Humans[dead.Position.X, dead.Position.Y].PresentState = Human.State.Dead; - }//); - } - - }while (stats[1] > 0); /*while (test < 1000);*/ - // It will run until the last infected man either dies or cures + Humans[dead.Position.X, dead.Position.Y].PresentState = Human.State.Dead; + }//); + } } - public bool wouldBeInfected() + public bool wouldBeInfected(Random rnd) { - return Rnd.Next(0, CORRECTED_PERCENTAGE) > Plague.InfectionRate; + return rnd.Next(0, CORRECTED_PERCENTAGE) < Plague.InfectionRate; } - public bool wouldCure() + public bool wouldCure(Random rnd) { //You could add a modifier that increases the curing chance with the age of the disease in the Human //Like after 2 weeks with it it would be at least 5 times more likely for him to cure - return Rnd.Next(0, CORRECTED_PERCENTAGE) > Plague.CuringRate; + return rnd.Next(0, CORRECTED_PERCENTAGE) < Plague.CuringRate; } - public bool wouldDie() + public bool wouldDie(Random rnd) { - return Rnd.Next(0, CORRECTED_PERCENTAGE) > Plague.DeathRate; + return rnd.Next(0, CORRECTED_PERCENTAGE) < Plague.DeathRate; } public void Display() { int[] stats = GetStats(); char sprite = '#'; - - Console.Clear(); + //Console.Clear(); Console.WriteLine(String.Format("Population aged {0}", Age)); Console.WriteLine(String.Format("Population : {0} Normals : {1} Infecteds : {2} Immunes : {3} Deads : {4}", Humans.Length, stats[0], stats[1], stats[2], stats[3])); if (Plague != null) @@ -341,6 +323,7 @@ namespace SharpPropagation Console.ForegroundColor = ConsoleColor.White; } } + Console.Write(Environment.NewLine); } } } diff --git a/SharpPropagation/Program.cs b/SharpPropagation/Program.cs index 892794a..6246847 100644 --- a/SharpPropagation/Program.cs +++ b/SharpPropagation/Program.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Threading; namespace SharpPropagation { @@ -18,9 +19,19 @@ namespace SharpPropagation peoples.SetDisease(new Disease(random,20,10,5,"Chick Chicken")); Console.WriteLine("Before Propagation"); peoples.Display(); - peoples.Propagate(); - Console.WriteLine("After Propagation"); - peoples.Display(); + + int[] stats = peoples.GetStats(); + // 0:normal 1:infected + int test = 1; + while (stats[1] > 5 && test < 60) + { + Console.Clear(); + peoples.Propagate(); + peoples.Display(); + test++; + //Thread.Sleep(200); + } + Console.ReadKey(); } }