Difference between revisions of "CSharp Skeleton Code"

From TRCCompSci - AQA Computer Science
Jump to: navigation, search
(Created page with "=c# code= I'm having trouble uploading the actual .cs file, so you can copy it from here and paste it into your project .cs file. <syntaxhighlight lang="csharp" line> // Sk...")
 
(c# code)
Line 1: Line 1:
=c# code=
+
 
 
I'm having trouble uploading the actual .cs file, so you can copy it from here and paste it into your project .cs file.
 
I'm having trouble uploading the actual .cs file, so you can copy it from here and paste it into your project .cs file.
  

Revision as of 23:32, 28 November 2016

I'm having trouble uploading the actual .cs file, so you can copy it from here and paste it into your project .cs file.


  1 // Skeleton Program code for the AQA A Level Paper 1 2017 examination
  2 // this code whould be used in conjunction with the Preliminary Material
  3 // written by the AQA Programmer Team
  4 // developed in the Visual Studio 2008 programming environment
  5 
  6 
  7 using System;
  8 
  9 namespace PredatorPrey
 10 {
 11   class Program
 12   {
 13     static void Main(string[] args)
 14     {
 15       Simulation Sim;
 16       int MenuOption;
 17       int LandscapeSize;
 18       int InitialWarrenCount;
 19       int InitialFoxCount;
 20       int Variability;
 21       bool FixedInitialLocations;
 22       do
 23       {
 24         Console.WriteLine("Predator Prey Simulation Main Menu");
 25         Console.WriteLine();
 26         Console.WriteLine("1. Run simulation with default settings");
 27         Console.WriteLine("2. Run simulation with custom settings");
 28         Console.WriteLine("3. Exit");
 29         Console.WriteLine();
 30         Console.Write("Select option: ");
 31         MenuOption = Convert.ToInt32(Console.ReadLine());
 32         if ((MenuOption == 1) || (MenuOption == 2))
 33         {
 34           if (MenuOption == 1)
 35           {
 36             LandscapeSize = 15;
 37             InitialWarrenCount = 5;
 38             InitialFoxCount = 5;
 39             Variability = 0;
 40             FixedInitialLocations = true;
 41           }
 42           else
 43           {
 44             Console.Write("Landscape Size: ");
 45             LandscapeSize = Convert.ToInt32(Console.ReadLine());
 46             Console.Write("Initial number of warrens: ");
 47             InitialWarrenCount = Convert.ToInt32(Console.ReadLine());
 48             Console.Write("Initial number of foxes: ");
 49             InitialFoxCount = Convert.ToInt32(Console.ReadLine());
 50             Console.Write("Randomness variability (percent): ");
 51             Variability = Convert.ToInt32(Console.ReadLine());
 52             FixedInitialLocations = false;
 53           }
 54           Sim = new Simulation(LandscapeSize, InitialWarrenCount, InitialFoxCount, Variability, FixedInitialLocations);
 55         }
 56       } while (MenuOption != 3);
 57       Console.ReadKey();
 58     }
 59   }
 60 
 61   class Location
 62   {
 63     public Fox Fox;
 64     public Warren Warren;
 65 
 66     public Location()
 67     {
 68       Fox = null;
 69       Warren = null;
 70     }
 71   }
 72 
 73   class Simulation
 74   {
 75     private Location[,] Landscape;
 76     private int TimePeriod = 0;
 77     private int WarrenCount = 0;
 78     private int FoxCount = 0;
 79     private bool ShowDetail = false;
 80     private int LandscapeSize;
 81     private int Variability;
 82     private static Random Rnd = new Random();
 83 
 84     public Simulation(int LandscapeSize, int InitialWarrenCount, int InitialFoxCount, int Variability, bool FixedInitialLocations)
 85     {
 86       int menuOption;
 87       int x;
 88       int y;
 89       string viewRabbits;
 90       this.LandscapeSize = LandscapeSize;
 91       this.Variability = Variability;
 92       Landscape = new Location[LandscapeSize, LandscapeSize];
 93       CreateLandscapeAndAnimals(InitialWarrenCount, InitialFoxCount, FixedInitialLocations);
 94       DrawLandscape();
 95       do
 96       {
 97         Console.WriteLine();
 98         Console.WriteLine("1. Advance to next time period showing detail");
 99         Console.WriteLine("2. Advance to next time period hiding detail");
100         Console.WriteLine("3. Inspect fox");
101         Console.WriteLine("4. Inspect warren");
102         Console.WriteLine("5. Exit");
103         Console.WriteLine();
104         Console.Write("Select option: ");
105         menuOption = Convert.ToInt32(Console.ReadLine());
106         if (menuOption == 1)
107         {
108           TimePeriod++;
109           ShowDetail = true;
110           AdvanceTimePeriod();
111         }
112         if (menuOption == 2)
113         {
114           TimePeriod++;
115           ShowDetail = false;
116           AdvanceTimePeriod();
117         }
118         if (menuOption == 3)
119         {
120           x = InputCoordinate('x');
121           y = InputCoordinate('y');
122           if (Landscape[x, y].Fox != null)
123           {
124             Landscape[x, y].Fox.Inspect();
125           }
126         }
127         if (menuOption == 4)
128         {
129           x = InputCoordinate('x');
130           y = InputCoordinate('y');
131           if (Landscape[x, y].Warren != null)
132           {
133             Landscape[x, y].Warren.Inspect();
134             Console.Write("View individual rabbits (y/n)?");
135             viewRabbits = Console.ReadLine();
136             if (viewRabbits == "y") {
137               Landscape[x, y].Warren.ListRabbits();
138             }
139           }
140         }
141       } while (((WarrenCount > 0) || (FoxCount > 0)) && (menuOption != 5));
142       Console.ReadKey();
143     }
144 
145     private int InputCoordinate(char Coordinatename)
146     {
147       int Coordinate;
148       Console.Write("  Input " + Coordinatename + " coordinate: ");
149       Coordinate = Convert.ToInt32(Console.ReadLine());
150       return Coordinate;
151     }
152 
153     private void AdvanceTimePeriod()
154     {
155       int NewFoxCount = 0;
156       if (ShowDetail)
157       {
158         Console.WriteLine();
159       }
160       for (int x = 0; x < LandscapeSize; x++)
161       {
162         for (int y = 0; y < LandscapeSize; y++)
163         {
164           if (Landscape[x, y].Warren != null)
165           {
166             if (ShowDetail)
167             {
168               Console.WriteLine("Warren at (" + x + "," + y + "):");
169               Console.Write("  Period Start: ");
170               Landscape[x, y].Warren.Inspect();
171             }
172             if (FoxCount > 0)
173             {
174               FoxesEatRabbitsInWarren(x, y);
175             }
176             if (Landscape[x, y].Warren.NeedToCreateNewWarren())
177             {
178               CreateNewWarren();
179             }
180             Landscape[x, y].Warren.AdvanceGeneration(ShowDetail);
181             if (ShowDetail)
182             {
183               Console.Write("  Period End: ");
184               Landscape[x, y].Warren.Inspect();
185               Console.ReadKey();
186             }
187             if (Landscape[x, y].Warren.WarrenHasDiedOut())
188             {
189               Landscape[x, y].Warren = null;
190               WarrenCount--;
191             }
192           }
193         }
194       }
195       for (int x = 0; x < LandscapeSize; x++)
196       {
197         for (int y = 0; y < LandscapeSize; y++)
198         {
199           if (Landscape[x, y].Fox != null)
200           {
201             if (ShowDetail)
202             {
203               Console.WriteLine("Fox at (" + x + "," + y + "): ");
204             }
205             Landscape[x, y].Fox.AdvanceGeneration(ShowDetail);
206             if (Landscape[x, y].Fox.CheckIfDead())
207             {
208               Landscape[x, y].Fox = null;
209               FoxCount--;
210             }
211             else
212             {
213               if (Landscape[x, y].Fox.ReproduceThisPeriod())
214               {
215                 if (ShowDetail) {
216                   Console.WriteLine("  Fox has reproduced. ");
217                 }
218                 NewFoxCount++;
219               }
220               if (ShowDetail) {
221                 Landscape[x, y].Fox.Inspect();
222               }
223               Landscape[x, y].Fox.ResetFoodConsumed();
224             }
225           }
226         }
227       }
228       if (NewFoxCount > 0)
229       {
230         if (ShowDetail)
231         { 
232           Console.WriteLine("New foxes born: ");
233         }
234         for (int f = 0; f < NewFoxCount; f++) {
235           CreateNewFox();
236         }
237       }
238       if (ShowDetail) {
239         Console.ReadKey();
240       }
241       DrawLandscape();
242       Console.WriteLine();
243     }
244 
245     private void CreateLandscapeAndAnimals(int InitialWarrenCount, int InitialFoxCount, bool FixedInitialLocations)
246     {
247       for (int x = 0; x < LandscapeSize; x++)
248       {
249         for (int y = 0; y < LandscapeSize; y++)
250         {
251           Landscape[x, y] = new Location();
252         }
253       }
254       if (FixedInitialLocations)
255       { 
256         Landscape[1, 1].Warren = new Warren(Variability, 38);
257         Landscape[2, 8].Warren = new Warren(Variability, 80);
258         Landscape[9, 7].Warren = new Warren(Variability, 20);
259         Landscape[10, 3].Warren = new Warren(Variability, 52);
260         Landscape[13, 4].Warren = new Warren(Variability, 67);
261         WarrenCount = 5;
262         Landscape[2, 10].Fox = new Fox(Variability);
263         Landscape[6, 1].Fox = new Fox(Variability);
264         Landscape[8, 6].Fox = new Fox(Variability);
265         Landscape[11, 13].Fox = new Fox(Variability);
266         Landscape[12, 4].Fox = new Fox(Variability);
267         FoxCount = 5;
268       }
269       else
270       {
271         for (int w = 0; w < InitialWarrenCount; w++)
272         {
273           CreateNewWarren();
274         }
275         for (int f = 0; f < InitialFoxCount; f++)
276         {
277           CreateNewFox();
278         }
279       }
280     }
281 
282     private void CreateNewWarren()
283     {
284       int x, y;
285       do
286       {
287         x = Rnd.Next(0, LandscapeSize);
288         y = Rnd.Next(0, LandscapeSize);
289       } while (Landscape[x, y].Warren != null);
290       if (ShowDetail)
291       {
292         Console.WriteLine("New Warren at (" + x + "," + y + ")");
293       }
294       Landscape[x, y].Warren = new Warren(Variability);
295       WarrenCount++;
296     }
297 
298     private void CreateNewFox()
299     {
300       int x, y;
301       do
302       {
303         x = Rnd.Next(0, LandscapeSize);
304         y = Rnd.Next(0, LandscapeSize);
305       } while (Landscape[x, y].Fox != null);
306       if (ShowDetail) {
307         Console.WriteLine("  New Fox at (" + x + "," + y + ")");
308       }
309       Landscape[x, y].Fox = new Fox(Variability);
310       FoxCount++;
311     }
312     
313     private void FoxesEatRabbitsInWarren(int WarrenX, int WarrenY)
314     {
315       int FoodConsumed;
316       int PercentToEat;
317       double Dist;
318       int RabbitsToEat;
319       int RabbitCountAtStartOfPeriod = Landscape[WarrenX, WarrenY].Warren.GetRabbitCount();
320       for (int FoxX = 0; FoxX < LandscapeSize; FoxX++)
321       {
322         for (int FoxY = 0; FoxY < LandscapeSize; FoxY++)
323         {
324           if (Landscape[FoxX, FoxY].Fox != null)
325           {
326             Dist = DistanceBetween(FoxX, FoxY, WarrenX, WarrenY);
327             if (Dist <= 3.5)
328             {
329               PercentToEat = 20;
330             }
331             else if (Dist <= 7)
332             {
333               PercentToEat = 10;
334             }
335             else
336             {
337               PercentToEat = 0;
338             }
339             RabbitsToEat = (int)Math.Round((double)(PercentToEat * RabbitCountAtStartOfPeriod / 100.0));
340             FoodConsumed = Landscape[WarrenX, WarrenY].Warren.EatRabbits(RabbitsToEat);
341             Landscape[FoxX, FoxY].Fox.GiveFood(FoodConsumed);
342             if (ShowDetail)
343             {
344               Console.WriteLine("  " + FoodConsumed + " rabbits eaten by fox at (" + FoxX + "," + FoxY + ").");
345             }
346           }
347         }
348       }
349     }
350 
351     private double DistanceBetween(int x1, int y1, int x2, int y2)
352     {
353       return Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));
354     }
355 
356     private void DrawLandscape()
357     {
358       Console.WriteLine();
359       Console.WriteLine("TIME PERIOD: " + TimePeriod);
360       Console.WriteLine();
361       Console.Write("    ");
362       for (int x = 0; x < LandscapeSize; x++)
363       {
364         if (x < 10)
365         {
366           Console.Write(" ");
367         }
368         Console.Write(x + " |");
369       }
370       Console.WriteLine();
371       for (int x = 0; x <= LandscapeSize * 4 + 3; x++)
372       {
373         Console.Write("-");
374       }
375       Console.WriteLine();
376       for (int y = 0; y < LandscapeSize; y++)
377       {
378         if (y < 10) {
379           Console.Write(" ");
380         }
381         Console.Write(" " + y + "|");
382         for (int x = 0; x < LandscapeSize; x++)
383         {
384           if (Landscape[x, y].Warren != null)
385           {
386             if (Landscape[x, y].Warren.GetRabbitCount() < 10)
387             {
388               Console.Write(" ");
389             }
390             Console.Write(Landscape[x, y].Warren.GetRabbitCount());
391           }
392           else
393           {
394             Console.Write("  ");
395           }
396           if (Landscape[x, y].Fox != null)
397           {
398             Console.Write("F");
399           }
400           else
401           {
402             Console.Write(" ");
403           }
404           Console.Write("|");
405         }
406         Console.WriteLine();
407       }
408     }
409   }
410 
411   class Warren
412   {
413     private const int MaxRabbitsInWarren = 99;
414     private Rabbit[] Rabbits;
415     private int RabbitCount = 0;
416     private int PeriodsRun = 0;
417     private bool AlreadySpread = false;
418     private int Variability;
419     private static Random Rnd = new Random();
420 
421     public Warren(int Variability)
422     {
423       this.Variability = Variability;
424       Rabbits = new Rabbit[MaxRabbitsInWarren];
425       RabbitCount = (int)(CalculateRandomValue((int)(MaxRabbitsInWarren / 4), this.Variability));
426       for (int r = 0; r < RabbitCount; r++)
427       {
428         Rabbits[r] = new Rabbit(Variability);
429       }
430     }
431 
432     public Warren(int Variability, int rabbitCount)
433     {
434       this.Variability = Variability;
435       this.RabbitCount = rabbitCount;
436       Rabbits = new Rabbit[MaxRabbitsInWarren];
437       for (int r = 0; r < RabbitCount; r++)
438       {
439         Rabbits[r] = new Rabbit(Variability);
440       }
441     }
442 
443     private double CalculateRandomValue(int BaseValue, int Variability)
444     {
445       return BaseValue - (BaseValue * Variability / 100) + (BaseValue * Rnd.Next(0, (Variability * 2) + 1) / 100);
446     }
447 
448     public int GetRabbitCount()
449     {
450       return RabbitCount;
451     }
452 
453     public bool NeedToCreateNewWarren()
454     {
455       if ((RabbitCount == MaxRabbitsInWarren) && (!AlreadySpread))
456       {
457         AlreadySpread = true;
458         return true;
459       }
460       else
461       {
462         return false;
463       }
464     }
465 
466     public bool WarrenHasDiedOut()
467     {
468       if (RabbitCount == 0)
469       {
470         return true;
471       }
472       else
473       {
474         return false;
475       }
476     }
477 
478     public void AdvanceGeneration(bool ShowDetail)
479     {
480       PeriodsRun++;
481       if (RabbitCount > 0)
482       {
483         KillByOtherFactors(ShowDetail);
484       }
485       if (RabbitCount > 0)
486       {
487         AgeRabbits(ShowDetail);
488       }
489       if ((RabbitCount > 0) && (RabbitCount <= MaxRabbitsInWarren))
490       {
491         if (ContainsMales())
492         {
493           MateRabbits(ShowDetail);
494         }
495       }
496       if ((RabbitCount == 0) && (ShowDetail))
497       {
498         Console.WriteLine("  All rabbits in warren are dead");
499       }
500     }
501 
502     public int EatRabbits(int RabbitsToEat)
503     {
504       int DeathCount = 0;
505       int RabbitNumber;
506       if (RabbitsToEat > RabbitCount)
507       {
508         RabbitsToEat = RabbitCount;
509       }
510       while (DeathCount < RabbitsToEat)
511       {
512         RabbitNumber = Rnd.Next(0, RabbitCount);
513         if (Rabbits[RabbitNumber] != null)
514         {
515           Rabbits[RabbitNumber] = null;
516           DeathCount++;
517         }
518       }
519       CompressRabbitList(DeathCount);
520       return RabbitsToEat;
521     }
522 
523     private void KillByOtherFactors(bool ShowDetail)
524     {
525       int DeathCount = 0;
526       for (int r = 0; r < RabbitCount; r++)
527       {
528         if (Rabbits[r].CheckIfKilledByOtherFactor())
529         {
530           Rabbits[r] = null;
531           DeathCount++;
532         }
533       }
534       CompressRabbitList(DeathCount);
535       if (ShowDetail)
536       {
537         Console.WriteLine("  " + DeathCount + " rabbits killed by other factors.");
538       }
539     }
540 
541     private void AgeRabbits(bool ShowDetail)
542     {
543       int DeathCount = 0;
544       for (int r = 0; r < RabbitCount; r++)
545       {
546         Rabbits[r].CalculateNewAge();
547         if (Rabbits[r].CheckIfDead())
548         {
549           Rabbits[r] = null;
550           DeathCount++;
551         }
552       }
553       CompressRabbitList(DeathCount);
554       if (ShowDetail)
555       {
556         Console.WriteLine("  " + DeathCount + " rabbits die of old age.");
557       }
558     }
559 
560     private void MateRabbits(bool ShowDetail)
561     {
562       int Mate = 0;
563       int Babies = 0;
564       double CombinedReproductionRate;
565       for (int r = 0; r < RabbitCount; r++)
566       {
567         if ((Rabbits[r].IsFemale()) && (RabbitCount + Babies < MaxRabbitsInWarren))
568         {
569           do
570           {
571             Mate = Rnd.Next(0, RabbitCount);
572           } while ((Mate == r) || (Rabbits[Mate].IsFemale()));
573           CombinedReproductionRate = (Rabbits[r].GetReproductionRate() + Rabbits[Mate].GetReproductionRate()) / 2;
574           if (CombinedReproductionRate >= 1)
575           {
576             Rabbits[RabbitCount + Babies] = new Rabbit(Variability, CombinedReproductionRate);
577             Babies++;
578           }
579         }
580       }
581       RabbitCount = RabbitCount + Babies;
582       if (ShowDetail)
583       {
584         Console.WriteLine("  " + Babies + " baby rabbits born.");
585       }
586     }
587 
588     private void CompressRabbitList(int DeathCount)
589     {
590       if (DeathCount > 0)
591       {
592         int ShiftTo = 0;
593         int ShiftFrom = 0;
594         while (ShiftTo < RabbitCount - DeathCount)
595         {
596           while (Rabbits[ShiftFrom] == null)
597           {
598             ShiftFrom++;
599           }
600           if (ShiftTo != ShiftFrom)
601           {
602             Rabbits[ShiftTo] = Rabbits[ShiftFrom];
603           }
604           ShiftTo++;
605           ShiftFrom++;
606         }
607         RabbitCount = RabbitCount - DeathCount;
608       }
609     }
610 
611     private bool ContainsMales()
612     {
613       bool Males = false;
614       for (int r = 0; r < RabbitCount; r++)
615       {
616         if (!Rabbits[r].IsFemale())
617         {
618           Males = true;
619         }
620       }
621       return Males;
622     }
623 
624     public void Inspect()
625     {
626       Console.WriteLine("Periods Run " + PeriodsRun + " Size " + RabbitCount);
627     }
628 
629     public void ListRabbits()
630     {
631       if (RabbitCount > 0)
632       {
633         for (int r = 0; r < RabbitCount; r++)
634         {
635           Rabbits[r].Inspect();
636         }
637       }
638     }
639   }
640 
641   class Animal
642   {
643     protected double NaturalLifespan;
644     protected int ID;
645     protected static int NextID = 1;
646     protected int Age = 0;
647     protected double ProbabilityOfDeathOtherCauses;
648     protected bool IsAlive;
649     protected static Random Rnd = new Random();
650 
651     public Animal(int AvgLifespan, double AvgProbabilityOfDeathOtherCauses, int Variability)
652     {
653       NaturalLifespan = AvgLifespan * CalculateRandomValue(100, Variability) / 100;
654       ProbabilityOfDeathOtherCauses = AvgProbabilityOfDeathOtherCauses * CalculateRandomValue(100, Variability) / 100;
655       IsAlive = true;
656       ID = NextID;
657       NextID++;
658     }
659 
660     public virtual void CalculateNewAge()
661     {
662       Age++;
663       if (Age >= NaturalLifespan)
664       {
665         IsAlive = false;
666       }
667     }
668 
669     public virtual bool CheckIfDead()
670     {
671       return !IsAlive;
672     }
673 
674     public virtual void Inspect()
675     {
676       Console.Write("  ID " + ID + " ");
677       Console.Write("Age " + Age + " ");
678       Console.Write("LS " + NaturalLifespan + " ");
679       Console.Write("Pr dth " + Math.Round(ProbabilityOfDeathOtherCauses, 2) + " ");
680     }
681 
682     public virtual bool CheckIfKilledByOtherFactor()
683     {
684       if (Rnd.Next(0, 100) < ProbabilityOfDeathOtherCauses * 100)
685       {
686         IsAlive = false;
687         return true;
688       }
689       else
690       {
691         return false;
692       }
693     }
694 
695     protected virtual double CalculateRandomValue(int BaseValue, int Variability)
696     {
697       return BaseValue - (BaseValue * Variability / 100) + (BaseValue * Rnd.Next(0, (Variability * 2) + 1) / 100);
698     }
699   }
700 
701   class Fox : Animal
702   {
703     private int FoodUnitsNeeded = 10;
704     private int FoodUnitsConsumedThisPeriod = 0;
705     private const int DefaultLifespan = 7;
706     private const double DefaultProbabilityDeathOtherCauses = 0.1;
707 
708     public Fox(int Variability)
709         : base(DefaultLifespan, DefaultProbabilityDeathOtherCauses, Variability)
710     {
711       FoodUnitsNeeded = (int)(10 * base.CalculateRandomValue(100, Variability) / 100);
712     }
713 
714     public void AdvanceGeneration(bool ShowDetail)
715     {
716       if (FoodUnitsConsumedThisPeriod == 0)
717       {
718         IsAlive = false;
719         if (ShowDetail)
720         {
721           Console.WriteLine("  Fox dies as has eaten no food this period.");
722         }
723       }
724       else
725       {
726         if (CheckIfKilledByOtherFactor())
727         {
728           IsAlive = false;
729           if (ShowDetail)
730           {
731             Console.WriteLine("  Fox killed by other factor.");
732           }
733         }
734         else
735         {
736           if (FoodUnitsConsumedThisPeriod < FoodUnitsNeeded)
737           {
738             CalculateNewAge();
739             if (ShowDetail)
740             {
741               Console.WriteLine("  Fox ages further due to lack of food.");
742             }
743           }
744           CalculateNewAge();
745           if (!IsAlive)
746           {
747             if (ShowDetail)
748             {
749               Console.WriteLine("  Fox has died of old age.");
750             }
751           }
752         }
753       }
754     }
755 
756     public void ResetFoodConsumed()
757     {
758       FoodUnitsConsumedThisPeriod = 0;
759     }
760 
761     public bool ReproduceThisPeriod()
762     {
763       const double ReproductionProbability = 0.25;
764       if (Rnd.Next(0, 100) < ReproductionProbability * 100)
765       {
766         return true;
767       }
768       else
769       {
770         return false;
771       }
772     }
773 
774     public void GiveFood(int FoodUnits)
775     {
776       FoodUnitsConsumedThisPeriod = FoodUnitsConsumedThisPeriod + FoodUnits;
777     }
778 
779     public override void Inspect()
780     {
781       base.Inspect();
782       Console.Write("Food needed " + FoodUnitsNeeded + " ");
783       Console.Write("Food eaten " + FoodUnitsConsumedThisPeriod + " ");
784       Console.WriteLine();
785     }
786   }
787 
788   class Rabbit : Animal
789   {
790     enum Genders
791     {
792       Male,
793       Female
794     }
795     private double ReproductionRate;
796     private const double DefaultReproductionRate = 1.2;
797     private const int DefaultLifespan = 4;
798     private const double DefaultProbabilityDeathOtherCauses = 0.05;
799     private Genders Gender;
800 
801     public Rabbit(int Variability)
802         : base(DefaultLifespan, DefaultProbabilityDeathOtherCauses, Variability)
803     {
804       ReproductionRate = DefaultReproductionRate * CalculateRandomValue(100, Variability) / 100;
805       if (Rnd.Next(0, 100) < 50)
806       {
807         Gender = Genders.Male;
808       }
809       else
810       {
811         Gender = Genders.Female;
812       }
813     }
814 
815     public Rabbit(int Variability, double ParentsReproductionRate)
816         : base(DefaultLifespan, DefaultProbabilityDeathOtherCauses, Variability)
817     {
818       ReproductionRate = ParentsReproductionRate * CalculateRandomValue(100, Variability) / 100;
819       if (Rnd.Next(0, 100) < 50)
820       {
821         Gender = Genders.Male;
822       }
823       else
824       {
825         Gender = Genders.Female;
826       }
827     }
828 
829     public override void Inspect()
830     {
831       base.Inspect();
832       Console.Write("Rep rate " + Math.Round(ReproductionRate, 1) + " ");
833       Console.WriteLine("Gender " + Gender + " ");
834     }
835 
836     public bool IsFemale()
837     {
838       if (Gender == Genders.Female)
839       {
840         return true;
841       }
842       else
843       {
844         return false;
845       }
846     }
847 
848     public double GetReproductionRate()
849     {
850       return ReproductionRate;
851     }
852   }
853 }