Simulation

From TRCCompSci - AQA Computer Science
Revision as of 10:41, 2 December 2016 by Admin (talk | contribs) (Explanation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

The Code

  1   class Simulation
  2   {
  3     private Location[,] Landscape;
  4     private int TimePeriod = 0;
  5     private int WarrenCount = 0;
  6     private int FoxCount = 0;
  7     private bool ShowDetail = false;
  8     private int LandscapeSize;
  9     private int Variability;
 10     private static Random Rnd = new Random();
 11 
 12     public Simulation(int LandscapeSize, int InitialWarrenCount, int InitialFoxCount, int Variability, bool FixedInitialLocations)
 13     {
 14       int menuOption;
 15       int x;
 16       int y;
 17       string viewRabbits;
 18       this.LandscapeSize = LandscapeSize;
 19       this.Variability = Variability;
 20       Landscape = new Location[LandscapeSize, LandscapeSize];
 21       CreateLandscapeAndAnimals(InitialWarrenCount, InitialFoxCount, FixedInitialLocations);
 22       DrawLandscape();
 23       do
 24       {
 25         Console.WriteLine();
 26         Console.WriteLine("1. Advance to next time period showing detail");
 27         Console.WriteLine("2. Advance to next time period hiding detail");
 28         Console.WriteLine("3. Inspect fox");
 29         Console.WriteLine("4. Inspect warren");
 30         Console.WriteLine("5. Exit");
 31         Console.WriteLine();
 32         Console.Write("Select option: ");
 33         menuOption = Convert.ToInt32(Console.ReadLine());
 34         if (menuOption == 1)
 35         {
 36           TimePeriod++;
 37           ShowDetail = true;
 38           AdvanceTimePeriod();
 39         }
 40         if (menuOption == 2)
 41         {
 42           TimePeriod++;
 43           ShowDetail = false;
 44           AdvanceTimePeriod();
 45         }
 46         if (menuOption == 3)
 47         {
 48           x = InputCoordinate('x');
 49           y = InputCoordinate('y');
 50           if (Landscape[x, y].Fox != null)
 51           {
 52             Landscape[x, y].Fox.Inspect();
 53           }
 54         }
 55         if (menuOption == 4)
 56         {
 57           x = InputCoordinate('x');
 58           y = InputCoordinate('y');
 59           if (Landscape[x, y].Warren != null)
 60           {
 61             Landscape[x, y].Warren.Inspect();
 62             Console.Write("View individual rabbits (y/n)?");
 63             viewRabbits = Console.ReadLine();
 64             if (viewRabbits == "y") {
 65               Landscape[x, y].Warren.ListRabbits();
 66             }
 67           }
 68         }
 69       } while (((WarrenCount > 0) || (FoxCount > 0)) && (menuOption != 5));
 70       Console.ReadKey();
 71     }
 72 
 73     private int InputCoordinate(char Coordinatename)
 74     {
 75       int Coordinate;
 76       Console.Write("  Input " + Coordinatename + " coordinate: ");
 77       Coordinate = Convert.ToInt32(Console.ReadLine());
 78       return Coordinate;
 79     }
 80 
 81     private void AdvanceTimePeriod()
 82     {
 83       int NewFoxCount = 0;
 84       if (ShowDetail)
 85       {
 86         Console.WriteLine();
 87       }
 88       for (int x = 0; x < LandscapeSize; x++)
 89       {
 90         for (int y = 0; y < LandscapeSize; y++)
 91         {
 92           if (Landscape[x, y].Warren != null)
 93           {
 94             if (ShowDetail)
 95             {
 96               Console.WriteLine("Warren at (" + x + "," + y + "):");
 97               Console.Write("  Period Start: ");
 98               Landscape[x, y].Warren.Inspect();
 99             }
100             if (FoxCount > 0)
101             {
102               FoxesEatRabbitsInWarren(x, y);
103             }
104             if (Landscape[x, y].Warren.NeedToCreateNewWarren())
105             {
106               CreateNewWarren();
107             }
108             Landscape[x, y].Warren.AdvanceGeneration(ShowDetail);
109             if (ShowDetail)
110             {
111               Console.Write("  Period End: ");
112               Landscape[x, y].Warren.Inspect();
113               Console.ReadKey();
114             }
115             if (Landscape[x, y].Warren.WarrenHasDiedOut())
116             {
117               Landscape[x, y].Warren = null;
118               WarrenCount--;
119             }
120           }
121         }
122       }
123       for (int x = 0; x < LandscapeSize; x++)
124       {
125         for (int y = 0; y < LandscapeSize; y++)
126         {
127           if (Landscape[x, y].Fox != null)
128           {
129             if (ShowDetail)
130             {
131               Console.WriteLine("Fox at (" + x + "," + y + "): ");
132             }
133             Landscape[x, y].Fox.AdvanceGeneration(ShowDetail);
134             if (Landscape[x, y].Fox.CheckIfDead())
135             {
136               Landscape[x, y].Fox = null;
137               FoxCount--;
138             }
139             else
140             {
141               if (Landscape[x, y].Fox.ReproduceThisPeriod())
142               {
143                 if (ShowDetail) {
144                   Console.WriteLine("  Fox has reproduced. ");
145                 }
146                 NewFoxCount++;
147               }
148               if (ShowDetail) {
149                 Landscape[x, y].Fox.Inspect();
150               }
151               Landscape[x, y].Fox.ResetFoodConsumed();
152             }
153           }
154         }
155       }
156       if (NewFoxCount > 0)
157       {
158         if (ShowDetail)
159         { 
160           Console.WriteLine("New foxes born: ");
161         }
162         for (int f = 0; f < NewFoxCount; f++) {
163           CreateNewFox();
164         }
165       }
166       if (ShowDetail) {
167         Console.ReadKey();
168       }
169       DrawLandscape();
170       Console.WriteLine();
171     }
172 
173     private void CreateLandscapeAndAnimals(int InitialWarrenCount, int InitialFoxCount, bool FixedInitialLocations)
174     {
175       for (int x = 0; x < LandscapeSize; x++)
176       {
177         for (int y = 0; y < LandscapeSize; y++)
178         {
179           Landscape[x, y] = new Location();
180         }
181       }
182       if (FixedInitialLocations)
183       { 
184         Landscape[1, 1].Warren = new Warren(Variability, 38);
185         Landscape[2, 8].Warren = new Warren(Variability, 80);
186         Landscape[9, 7].Warren = new Warren(Variability, 20);
187         Landscape[10, 3].Warren = new Warren(Variability, 52);
188         Landscape[13, 4].Warren = new Warren(Variability, 67);
189         WarrenCount = 5;
190         Landscape[2, 10].Fox = new Fox(Variability);
191         Landscape[6, 1].Fox = new Fox(Variability);
192         Landscape[8, 6].Fox = new Fox(Variability);
193         Landscape[11, 13].Fox = new Fox(Variability);
194         Landscape[12, 4].Fox = new Fox(Variability);
195         FoxCount = 5;
196       }
197       else
198       {
199         for (int w = 0; w < InitialWarrenCount; w++)
200         {
201           CreateNewWarren();
202         }
203         for (int f = 0; f < InitialFoxCount; f++)
204         {
205           CreateNewFox();
206         }
207       }
208     }
209 
210     private void CreateNewWarren()
211     {
212       int x, y;
213       do
214       {
215         x = Rnd.Next(0, LandscapeSize);
216         y = Rnd.Next(0, LandscapeSize);
217       } while (Landscape[x, y].Warren != null);
218       if (ShowDetail)
219       {
220         Console.WriteLine("New Warren at (" + x + "," + y + ")");
221       }
222       Landscape[x, y].Warren = new Warren(Variability);
223       WarrenCount++;
224     }
225 
226     private void CreateNewFox()
227     {
228       int x, y;
229       do
230       {
231         x = Rnd.Next(0, LandscapeSize);
232         y = Rnd.Next(0, LandscapeSize);
233       } while (Landscape[x, y].Fox != null);
234       if (ShowDetail) {
235         Console.WriteLine("  New Fox at (" + x + "," + y + ")");
236       }
237       Landscape[x, y].Fox = new Fox(Variability);
238       FoxCount++;
239     }
240     
241     private void FoxesEatRabbitsInWarren(int WarrenX, int WarrenY)
242     {
243       int FoodConsumed;
244       int PercentToEat;
245       double Dist;
246       int RabbitsToEat;
247       int RabbitCountAtStartOfPeriod = Landscape[WarrenX, WarrenY].Warren.GetRabbitCount();
248       for (int FoxX = 0; FoxX < LandscapeSize; FoxX++)
249       {
250         for (int FoxY = 0; FoxY < LandscapeSize; FoxY++)
251         {
252           if (Landscape[FoxX, FoxY].Fox != null)
253           {
254             Dist = DistanceBetween(FoxX, FoxY, WarrenX, WarrenY);
255             if (Dist <= 3.5)
256             {
257               PercentToEat = 20;
258             }
259             else if (Dist <= 7)
260             {
261               PercentToEat = 10;
262             }
263             else
264             {
265               PercentToEat = 0;
266             }
267             RabbitsToEat = (int)Math.Round((double)(PercentToEat * RabbitCountAtStartOfPeriod / 100.0));
268             FoodConsumed = Landscape[WarrenX, WarrenY].Warren.EatRabbits(RabbitsToEat);
269             Landscape[FoxX, FoxY].Fox.GiveFood(FoodConsumed);
270             if (ShowDetail)
271             {
272               Console.WriteLine("  " + FoodConsumed + " rabbits eaten by fox at (" + FoxX + "," + FoxY + ").");
273             }
274           }
275         }
276       }
277     }
278 
279     private double DistanceBetween(int x1, int y1, int x2, int y2)
280     {
281       return Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));
282     }
283 
284     private void DrawLandscape()
285     {
286       Console.WriteLine();
287       Console.WriteLine("TIME PERIOD: " + TimePeriod);
288       Console.WriteLine();
289       Console.Write("    ");
290       for (int x = 0; x < LandscapeSize; x++)
291       {
292         if (x < 10)
293         {
294           Console.Write(" ");
295         }
296         Console.Write(x + " |");
297       }
298       Console.WriteLine();
299       for (int x = 0; x <= LandscapeSize * 4 + 3; x++)
300       {
301         Console.Write("-");
302       }
303       Console.WriteLine();
304       for (int y = 0; y < LandscapeSize; y++)
305       {
306         if (y < 10) {
307           Console.Write(" ");
308         }
309         Console.Write(" " + y + "|");
310         for (int x = 0; x < LandscapeSize; x++)
311         {
312           if (Landscape[x, y].Warren != null)
313           {
314             if (Landscape[x, y].Warren.GetRabbitCount() < 10)
315             {
316               Console.Write(" ");
317             }
318             Console.Write(Landscape[x, y].Warren.GetRabbitCount());
319           }
320           else
321           {
322             Console.Write("  ");
323           }
324           if (Landscape[x, y].Fox != null)
325           {
326             Console.Write("F");
327           }
328           else
329           {
330             Console.Write(" ");
331           }
332           Console.Write("|");
333         }
334         Console.WriteLine();
335       }
336     }
337   }

Explanation

Lines 3 to 10 create the variables used by the class, and the declaration for Landscape is a 2D array of Locations.

The method with the same name as the class will be run when the class is instantiated. this method receives the values passed from the main section.

Landscape is created with the size passed (line 20).

The CreateLandscapeAndAminals method is called (line21) which sets up each location and adds the appropriate number of warrens and foxes. This can either use the fixed locations or randomly generated ones.

The Landscape is then drawn onto the screen (line 22). This will draw each location and the contents of it.

You are then inside of the simulation loop starting on line 23 & 24.

Options 1 & 2 will both advance the time period by incrementing TimePeriod and then calling the AdvanceTimePeriod method.