diff --git a/SharpPropagation/Population.cs b/SharpPropagation/Population.cs index 5aa71da..a40b2e0 100644 --- a/SharpPropagation/Population.cs +++ b/SharpPropagation/Population.cs @@ -47,7 +47,7 @@ namespace SharpPropagation Dimensions = dimensions; Rnd = rnd; Age = 0; - Humans = new Human[dimensions.Width,dimensions.Height]; + Humans = new Human[dimensions.Width, dimensions.Height]; Generate(); } @@ -122,6 +122,181 @@ namespace SharpPropagation } return result; } + public void Propagate() + { + int test = 0; + int[] stats; + do + { + + test++; + /* + if (test > 100) + { + 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) + { + //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(); + + //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()) + { + peopleToCure.Add(person); + } + else + { + if (wouldDie()) + { + 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) + { + if (wouldBeInfected()) + { + if (potentialInfected.PresentState == Human.State.Normal) + { + peopleToInfect.Add(potentialInfected); + } + } + } + } + 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); + + /// @## + /// ### + /// ### + + /// #@# + /// ### + /// ### + + /// ##@ + /// ### + /// ### + + /// ### + /// @## + /// ### + + /// ### + /// ##@ + /// ### + + /// ### + /// ### + /// @## + + /// ### + /// ### + /// #@# + + /// ### + /// ### + /// ##@ + } + } + } + }//); + 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 (peopleToCure.Count > 0) + { + //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 + } + public bool wouldBeInfected() + { + return Rnd.Next(0, CORRECTED_PERCENTAGE) > Plague.InfectionRate; + } + public bool wouldCure() + { + //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; + } + public bool wouldDie() + { + return Rnd.Next(0, CORRECTED_PERCENTAGE) > Plague.DeathRate; + } public void Display() { int[] stats = GetStats(); @@ -141,27 +316,29 @@ namespace SharpPropagation switch (Humans[x, y].PresentState) { case Human.State.Normal: - Console.BackgroundColor = ConsoleColor.Green; + //Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.Green; break; case Human.State.Infected: - Console.BackgroundColor = ConsoleColor.Red; + //Console.BackgroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.Red; break; case Human.State.Immune: - Console.BackgroundColor = ConsoleColor.Blue; + //Console.BackgroundColor = ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.Blue; break; case Human.State.Dead: - Console.BackgroundColor = ConsoleColor.Gray; - Console.ForegroundColor = ConsoleColor.Gray; + //Console.BackgroundColor = ConsoleColor.Gray; + Console.ForegroundColor = ConsoleColor.Black; break; default: - Console.BackgroundColor = ConsoleColor.Black; - Console.ForegroundColor = ConsoleColor.Black; + //Console.BackgroundColor = ConsoleColor.Black; + Console.ForegroundColor = ConsoleColor.White; break; } Console.Write(sprite); + //We reset to the default + Console.ForegroundColor = ConsoleColor.White; } } } diff --git a/SharpPropagation/Program.cs b/SharpPropagation/Program.cs index 3c3f572..892794a 100644 --- a/SharpPropagation/Program.cs +++ b/SharpPropagation/Program.cs @@ -12,17 +12,16 @@ namespace SharpPropagation static void Main(string[] args) { Console.WriteLine("********** Sharp Propagation (Console) 2022 **********"); - Console.WriteLine("Press any key to start the propagation"); - Console.ReadLine(); - Random random = new Random(); Population peoples = new Population(new Size(30,50),random,10,10,5); peoples.SetDisease(new Disease(random,20,10,5,"Chick Chicken")); + Console.WriteLine("Before Propagation"); + peoples.Display(); + peoples.Propagate(); + Console.WriteLine("After Propagation"); peoples.Display(); - Console.ReadKey(); - } } }