Advertisement
ZhongNi

zoo

Nov 10th, 2024
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.93 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Classes
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main()
  10.         {
  11.             Zoo zoo = new Zoo();
  12.             zoo.Work();
  13.         }
  14.     }
  15.  
  16.     public class Zoo
  17.     {
  18.         private CageManager _manager;
  19.         private string[] _cagesName;
  20.  
  21.         public Zoo()
  22.         {
  23.             _manager = new CageManager();
  24.             _cagesName = new string[_manager.GetCagesCount()];
  25.         }
  26.  
  27.         public void Work()
  28.         {
  29.             bool isWorking = true;
  30.  
  31.             Console.WriteLine("Welcome in Zoo");
  32.  
  33.             while (isWorking)
  34.             {
  35.                 DisplayCages();
  36.                 isWorking = ProcessUserInput();
  37.             }
  38.         }
  39.  
  40.         private bool ProcessUserInput()
  41.         {
  42.             const int CommandExit = 5;
  43.  
  44.             Console.WriteLine($"\nWhich cage do you want to visit? or {CommandExit} for exit..");
  45.  
  46.             int.TryParse(Console.ReadLine(), out int userInput);
  47.  
  48.             if (userInput == CommandExit)
  49.             {
  50.                 return false;
  51.             }
  52.  
  53.             if (_manager.TrySelectCage(userInput - 1))
  54.             {
  55.                 _cagesName[userInput - 1] = "contains " + _manager.GetCageName(userInput - 1);
  56.  
  57.                 return true;
  58.             }
  59.            
  60.             return true;
  61.         }
  62.  
  63.         private void DisplayCages()
  64.         {
  65.             Console.WriteLine($"There are {_manager.GetCagesCount()} cages");
  66.  
  67.             for (int i = 0; i < _cagesName.Length; i++)
  68.             {
  69.                 Console.WriteLine($"Cage {i + 1} {_cagesName[i]}");
  70.             }
  71.         }
  72.     }
  73.  
  74.     public class CageManager
  75.     {
  76.         private List<Animals> _animals;
  77.         private List<Animals>[] _cages;
  78.  
  79.         public CageManager()
  80.         {
  81.             _animals = new List<Animals>
  82.             {
  83.                 new Animal1() ,
  84.                 new Animal2() ,
  85.                 new Animal3() ,
  86.                 new Animal4()
  87.             };
  88.  
  89.             _cages = new List<Animals>[_animals.Count];
  90.  
  91.             foreach (var animal in _animals.OfType<IIncreaseable>())
  92.             {
  93.                 animal.IncreaseRequested += Increase;
  94.             }
  95.  
  96.             foreach (var animal in _animals.OfType<IRenovateable>())
  97.             {
  98.                 animal.RenovateRequested += Renovate;
  99.             }
  100.  
  101.             FillCages();
  102.         }
  103.  
  104.         public bool TrySelectCage(int index)
  105.         {
  106.             if (index >= 0 && index < _cages.Length)
  107.             {
  108.                 ShowCage(index);
  109.                 Interact(index);
  110.  
  111.                 return true;
  112.             }
  113.             else
  114.             {
  115.                 Console.WriteLine("No such cage");
  116.  
  117.                 return false;
  118.             }
  119.         }
  120.  
  121.         public int GetCagesCount() => _cages.Length;
  122.  
  123.         public string GetCageName(int index) => _animals[index].Name;
  124.  
  125.         private void ShowCage(int index)
  126.         {
  127.             Console.WriteLine($"There are {_cages[index].Count} {_animals[index].Name} contains in the cage, " +
  128.                 $"their gender is:\n{GetAnimalsGender(_cages[index])}");
  129.             _animals[index].Speaks();
  130.         }
  131.  
  132.         private string GetAnimalsGender(List<Animals> animals)
  133.         {
  134.             var genders = animals.Select(animal => animal.Gender).Distinct().OrderBy(gender => gender);
  135.  
  136.             string animalsGender = string.Join(", ", genders);
  137.  
  138.             return animalsGender;
  139.         }
  140.  
  141.         private void Interact(int index)
  142.         {
  143.             _animals[index].GoBack(index);
  144.         }
  145.  
  146.         private void FillCages()
  147.         {
  148.             for (int i = 0; i < _cages.Length; i++)
  149.             {
  150.                 _cages[i] = new List<Animals>();
  151.  
  152.                 for (int j = 0; j < UserUtil.GetRandomNumber(_animals[i].MinCountCage, _animals[i].MaxCountCage + 1); j++)
  153.                 {
  154.                     _cages[i].Add(_animals[i].Clone());
  155.                 }
  156.             }
  157.         }
  158.  
  159.         private void Increase(int index)
  160.         {
  161.             _cages[index].Add(_animals[index].Clone());
  162.         }
  163.  
  164.         private void Renovate(int index)
  165.         {
  166.             int numberRemoved = 3;
  167.             int numberAdded = 3;
  168.  
  169.             for (int i = 0; i < UserUtil.GetRandomNumber(numberAdded + 1); i++)
  170.             {
  171.                 if (_cages[index].Count == _animals[index].MaxCountCage)
  172.                 {
  173.                     continue;
  174.                 }
  175.  
  176.                 _cages[index].Add(_animals[index].Clone());
  177.             }
  178.  
  179.             for (int i = 0; i < UserUtil.GetRandomNumber(numberRemoved + 1); i++)
  180.             {
  181.                 if (_cages[index].Count == _animals[index].MinCountCage)
  182.                 {
  183.                     continue;
  184.                 }
  185.  
  186.                 _cages[index].RemoveAt(UserUtil.GetRandomNumber(_cages[index].Count));
  187.             }
  188.         }
  189.     }
  190.  
  191.     public abstract class Animals
  192.     {
  193.         public string Name { get; protected set; }
  194.         public string Gender { get; protected set; }
  195.         public int MaxCountCage { get; protected set; }
  196.         public int MinCountCage { get; protected set; }
  197.  
  198.         public abstract void Speaks();
  199.  
  200.         public abstract string InitiateGender();
  201.  
  202.         public abstract Animals Clone();
  203.  
  204.         public virtual void GoBack(int index)
  205.         {
  206.             Console.WriteLine("You return to the cage selection. Press something..\n");
  207.             Console.ReadKey(true);
  208.         }
  209.     }
  210.  
  211.     public interface IIncreaseable
  212.     {
  213.         event Action<int> IncreaseRequested;
  214.     }
  215.  
  216.     public class Animal1 : Animals, IIncreaseable
  217.     {
  218.         public event Action<int> IncreaseRequested;
  219.  
  220.         public Animal1()
  221.         {
  222.             Name = "Flamibia";
  223.             Gender = InitiateGender();
  224.             MaxCountCage = 100;
  225.             MinCountCage = 70;
  226.         }
  227.  
  228.         public override void Speaks()
  229.         {
  230.             Console.WriteLine($"You can't hear anything from the {Name} cage");
  231.         }
  232.  
  233.         public override string InitiateGender()
  234.         {
  235.             int genderCount = 784;
  236.             Gender = "Gender " + (UserUtil.GetRandomNumber(genderCount) + 1);
  237.  
  238.             return Gender;
  239.         }
  240.  
  241.         public override Animals Clone()
  242.         {
  243.             return new Animal1();
  244.         }
  245.  
  246.         public override void GoBack(int index)
  247.         {
  248.             int maxStep = 3;
  249.  
  250.             for (int i = 0; i < maxStep; i++)
  251.             {
  252.                 Console.WriteLine($"You are coming back. You hear a voice of {Name}. Press something..");
  253.                 Console.ReadKey(true);
  254.             }
  255.  
  256.             Console.WriteLine($"You became {Name}. You understand what {Name} say. Press something..");
  257.             IncreaseRequested?.Invoke(index);
  258.             Console.ReadKey(true);
  259.  
  260.             Console.WriteLine("You were reborn.. Press something..\n");
  261.             Console.ReadKey(true);
  262.         }
  263.     }
  264.  
  265.     public class Animal2 : Animals
  266.     {
  267.         public Animal2()
  268.         {
  269.             Name = "Qoster";
  270.             Gender = InitiateGender();
  271.             MaxCountCage = 12;
  272.             MinCountCage = 8;
  273.         }
  274.  
  275.         public override void Speaks()
  276.         {
  277.             Console.WriteLine($"You can hear: cheepcheepcheepcheepcheepcheep");
  278.         }
  279.  
  280.         public override string InitiateGender()
  281.         {
  282.             string[] genders = { "XX", "XT", "TT", "ZZ" };
  283.             Gender = genders[UserUtil.GetRandomNumber(genders.Length)];
  284.  
  285.             return Gender;
  286.         }
  287.  
  288.         public override Animals Clone()
  289.         {
  290.             return new Animal2();
  291.         }
  292.     }
  293.  
  294.     public interface IRenovateable
  295.     {
  296.         event Action<int> RenovateRequested;
  297.     }
  298.  
  299.     public class Animal3 : Animals, IRenovateable
  300.     {
  301.         public event Action<int> RenovateRequested;
  302.  
  303.         public Animal3()
  304.         {
  305.             Name = "Kedenee";
  306.             Gender = InitiateGender();
  307.             MaxCountCage = 7;
  308.             MinCountCage = 1;
  309.         }
  310.  
  311.         public override void Speaks()
  312.         {
  313.             Console.WriteLine("You hear just quiet music");
  314.         }
  315.  
  316.         public override string InitiateGender()
  317.         {
  318.             Gender = "Genderless";
  319.  
  320.             return Gender;
  321.         }
  322.  
  323.         public override Animals Clone()
  324.         {
  325.             return new Animal3();
  326.         }
  327.  
  328.         public override void GoBack(int index)
  329.         {
  330.             RenovateRequested?.Invoke(index);
  331.             Console.WriteLine("You wanted to come back. But you were eaten. You were reborn.. Press something..\n");
  332.             Console.ReadKey(true);
  333.         }
  334.     }
  335.  
  336.     public class Animal4 : Animals
  337.     {
  338.         public Animal4()
  339.         {
  340.             Name = "Wooni";
  341.             Gender = InitiateGender();
  342.             MaxCountCage = 20;
  343.             MinCountCage = 10;
  344.         }
  345.  
  346.         public override void Speaks()
  347.         {
  348.             string[] sounds =
  349.             {
  350.                 "let's have a drink",
  351.                 "do you have cigarettes!",
  352.                 "have some change!"
  353.             };
  354.  
  355.             Console.WriteLine($"You can hear: {sounds[UserUtil.GetRandomNumber(sounds.Length)]}");
  356.         }
  357.  
  358.         public override string InitiateGender()
  359.         {
  360.             int genderCount = 2;
  361.             Gender = "Parent " + (UserUtil.GetRandomNumber(genderCount) + 1);
  362.  
  363.             return Gender;
  364.         }
  365.  
  366.         public override Animals Clone()
  367.         {
  368.             return new Animal4();
  369.         }
  370.     }
  371.  
  372.     public static class UserUtil
  373.     {
  374.         private static Random s_random = new Random();
  375.  
  376.         public static int GetRandomNumber(int min, int max)
  377.         {
  378.             return s_random.Next(min, max);
  379.         }
  380.  
  381.         public static int GetRandomNumber(int max)
  382.         {
  383.             return s_random.Next(max);
  384.         }
  385.     }
  386. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement