Advertisement
ZhongNi

zoo (3)

Nov 13th, 2024
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.07 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 List<Cage> _cages;
  19.  
  20.         public Zoo()
  21.         {
  22.             _cages = new List<Cage>();
  23.             CreateCages();
  24.         }
  25.  
  26.         public void Work()
  27.         {
  28.             bool isWorking = true;
  29.  
  30.             Console.WriteLine("Welcome in Zoo");
  31.  
  32.             while (isWorking)
  33.             {
  34.                 DisplayCages();
  35.                 isWorking = ProcessUserInput();
  36.             }
  37.         }
  38.  
  39.         private void CreateCages()
  40.         {
  41.             int cageCount = 4;
  42.  
  43.             for (int i = 0; i < cageCount; i++)
  44.             {
  45.                 _cages.Add(new Cage(i));
  46.             }
  47.         }
  48.  
  49.         private void DisplayCages()
  50.         {
  51.             Console.WriteLine($"\nThere are {_cages.Count} cages");
  52.  
  53.             for (int i = 0; i < _cages.Count; i++)
  54.             {
  55.                 string cageName = _cages[i].Name == null ? null : $"contains " + _cages[i].Name;
  56.                 Console.WriteLine($"Cage {i + 1} {cageName}");
  57.             }
  58.         }
  59.  
  60.         private bool ProcessUserInput()
  61.         {
  62.             const int CommandExit = 5;
  63.  
  64.             Console.WriteLine($"\nWhich cage do you want to visit? or {CommandExit} for exit..");
  65.  
  66.             int.TryParse(Console.ReadLine(), out int userInput);
  67.  
  68.             if (userInput == CommandExit)
  69.             {
  70.                 return false;
  71.             }
  72.  
  73.             if (TrySelectCage(userInput - 1))
  74.             {
  75.                 int index = userInput - 1;
  76.                 _cages[index].ShowCage(index);
  77.                 _cages[index].InteractWithVisitor(index);
  78.                 _cages[index].MakeName(index);
  79.  
  80.                 return true;
  81.             }
  82.  
  83.             return true;
  84.         }
  85.  
  86.         private bool TrySelectCage(int index)
  87.         {
  88.             if (index >= 0 && index < _cages.Count)
  89.             {
  90.                 return true;
  91.             }
  92.             else
  93.             {
  94.                 Console.WriteLine("No such cage");
  95.  
  96.                 return false;
  97.             }
  98.         }
  99.     }
  100.  
  101.     public class Cage
  102.     {
  103.         public event Action<int> IncreaseRequested;
  104.         public event Action<int> RenovateRequested;
  105.  
  106.         private List<Animals> _animals;
  107.         private Characteristic _characteristic;
  108.  
  109.         public Cage(int index)
  110.         {
  111.             _animals = new List<Animals>();
  112.             Fill(index);
  113.  
  114.             IncreaseRequested += Increase;
  115.             RenovateRequested += Renovate;
  116.         }
  117.  
  118.         public string Name { get; private set; }
  119.  
  120.         public int GetCount() => _animals.Count;
  121.  
  122.         public void MakeName(int index)
  123.         {
  124.             Name = MakeColored(AssignAnimalsName(index));
  125.         }
  126.  
  127.         public virtual void InteractWithVisitor(int index)
  128.         {
  129.             if (index == 0)
  130.             {
  131.                 int maxStep = 3;
  132.  
  133.                 for (int i = 0; i < maxStep; i++)
  134.                 {
  135.                     Console.WriteLine($"You are coming back. You hear a voice of {MakeColored(_characteristic.Name)}. Press something..");
  136.                     Console.ReadKey(true);
  137.                 }
  138.  
  139.                 Console.WriteLine($"You became {MakeColored(_characteristic.Name)}. You understand what {MakeColored(_characteristic.Name)} say. Press something..");
  140.                 IncreaseRequested?.Invoke(index);
  141.                 Console.ReadKey(true);
  142.  
  143.                 Console.WriteLine("You were reborn.. Press something..\n");
  144.                 Console.ReadKey(true);
  145.             }
  146.             else if (index == 1 || index == 3)
  147.             {
  148.                 Console.WriteLine("You return to the cage selection. Press something..\n");
  149.                 Console.ReadKey(true);
  150.             }
  151.             else if (index == 2)
  152.             {
  153.                 RenovateRequested?.Invoke(index);
  154.                 Console.WriteLine("You wanted to come back. But you were eaten. You were reborn.. Press something..\n");
  155.                 Console.ReadKey(true);
  156.             }
  157.         }
  158.  
  159.         public void ShowCage(int index)
  160.         {
  161.             Console.WriteLine($"\nThere are {MakeColored(_animals.Count.ToString())} {MakeColored(AssignAnimalsName(index))} in the cage, " +
  162.                 $"their gender is:\n{GetAnimalsGender()}" +
  163.                 $"\n\n{MakeSound(index)}");
  164.         }
  165.  
  166.         private string MakeColored(string line)
  167.         {
  168.             string colorSet = "\u001b[32m";
  169.             string colorReset = "\u001b[0m";
  170.  
  171.             return colorSet + line + colorReset;
  172.         }
  173.  
  174.         private string GetAnimalsGender()
  175.         {
  176.             return string.Join(", ", _animals.Select(animal => animal.Characteristic.Gender).Distinct().OrderBy(gender => gender));
  177.         }
  178.  
  179.         private string MakeSound(int index)
  180.         {
  181.             return index switch
  182.             {
  183.                 0 => $"You hear nothing from the {MakeColored(_characteristic.Name)} cage",
  184.                 1 => "You hear: cheepcheepcheep",
  185.                 2 => "Quiet music is playing",
  186.                 3 => $"You hear: {MakeColored(new[] { "let's have a drink", "got a cigarette?", "hey, any spare change?" }[UserUtil.GetRandomNumber(3)])}",
  187.                _ => ""
  188.            };
  189.        }
  190.  
  191.        private void Fill(int index)
  192.        {
  193.            for (int i = 0; i < UserUtil.GetRandomNumber(AssignMaxCount(index), AssignMinCount(index)); i++)
  194.            {
  195.                Increase(index);
  196.            }
  197.        }
  198.  
  199.        private void Increase(int index)
  200.        {
  201.            _characteristic = new Characteristic(AssignAnimalsName(index), AssignAnimalsGender(index));
  202.            _animals.Add(new Animals(_characteristic));
  203.        }
  204.  
  205.        private void Renovate(int index)
  206.        {
  207.            int numberRemoved = 3;
  208.            int numberAdded = 3;
  209.  
  210.            for (int i = 0; i < UserUtil.GetRandomNumber(numberAdded + 1); i++)
  211.            {
  212.                if (_animals.Count == AssignMaxCount(index))
  213.                {
  214.                    continue;
  215.                }
  216.  
  217.                Increase(index);
  218.            }
  219.  
  220.            for (int i = 0; i < UserUtil.GetRandomNumber(numberRemoved + 1); i++)
  221.            {
  222.                if (_animals.Count == AssignMinCount(index))
  223.                {
  224.                    continue;
  225.                }
  226.  
  227.                _animals.RemoveAt(UserUtil.GetRandomNumber(_animals.Count));
  228.            }
  229.        }
  230.  
  231.        private string AssignAnimalsName(int index) => new[] { "Flamibia", "Qoster", "Kedenee", "Wooni" }[index];
  232.  
  233.        private string AssignAnimalsGender(int index)
  234.        {
  235.            return index switch
  236.            {
  237.                0 => "Gender " + (UserUtil.GetRandomNumber(784) + 1),
  238.                1 => new[] { "XX", "XT", "TT", "ZZ" }[UserUtil.GetRandomNumber(4)],
  239.                2 => "Genderless",
  240.                3 => "Parent " + (UserUtil.GetRandomNumber(2) + 1),
  241.                _ => ""
  242.            };
  243.        }
  244.  
  245.        private int AssignMinCount(int index) => new[] { 70, 8, 1, 10 }[index];
  246.  
  247.        private int AssignMaxCount(int index) => new[] { 100, 12, 7, 20 }[index];
  248.  
  249.    }
  250.  
  251.    public class Characteristic
  252.    {
  253.        public Characteristic(string name, string gender)
  254.        {
  255.            Name = name;
  256.            Gender = gender;
  257.        }
  258.  
  259.        public string Name { get; private set; }
  260.        public string Gender { get; private set; }
  261.    }
  262.  
  263.    public class Animals
  264.    {
  265.        public Animals(Characteristic characteristic)
  266.        {
  267.            Characteristic = characteristic;
  268.        }
  269.  
  270.        public Characteristic Characteristic { get; private set; }
  271.    }
  272.  
  273.    public class UserUtil
  274.    {
  275.        private static Random s_random = new Random();
  276.  
  277.        public static int GetRandomNumber(int max, int min = 0)
  278.        {
  279.            return s_random.Next(min, max);
  280.        }
  281.    }
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement