Advertisement
ZhongNi

zoo (4)

Nov 14th, 2024
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.79 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.         private ICount _provider;
  20.  
  21.         public Zoo()
  22.         {
  23.             _cages = new List<Cage>();
  24.             _provider = new AnimalProvider();
  25.             CreateCages();
  26.         }
  27.  
  28.         public void Work()
  29.         {
  30.             bool isWorking = true;
  31.  
  32.             Console.WriteLine("Welcome in Zoo");
  33.  
  34.             while (isWorking)
  35.             {
  36.                 DisplayCages();
  37.                 isWorking = ProcessUserInput();
  38.             }
  39.         }
  40.  
  41.         private void CreateCages()
  42.         {
  43.             for (int i = 0; i < _provider.GetCount(); 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<Animal> _animals;
  107.         private AnimalProvider _animalProvider;
  108.  
  109.         public Cage(int index)
  110.         {
  111.             _animals = new List<Animal>();
  112.             _animalProvider = new AnimalProvider();
  113.  
  114.             Fill(index);
  115.  
  116.             IncreaseRequested += Increase;
  117.             RenovateRequested += Renovate;
  118.         }
  119.  
  120.         public string Name { get; private set; }
  121.  
  122.         public void MakeName(int index)
  123.         {
  124.             Name = UserUtil.MakeColored(_animalProvider.GetCharacteristic(index).Name);
  125.         }
  126.  
  127.         public void InteractWithVisitor(int index)
  128.         {
  129.             int increaseableCageIndex = 0;
  130.             int renovateableCageIndex = 2;
  131.  
  132.             if (index == increaseableCageIndex)
  133.             {
  134.                 int maxStep = 3;
  135.  
  136.                 for (int i = 0; i < maxStep; i++)
  137.                 {
  138.                     Console.WriteLine($"You are coming back. You hear a voice of {UserUtil.MakeColored(_animalProvider.GetCharacteristic(index).Name)}. Press something..");
  139.                     Console.ReadKey(true);
  140.                 }
  141.  
  142.                 Console.WriteLine($"You became {UserUtil.MakeColored(_animalProvider.GetCharacteristic(index).Name)}. You understand what {UserUtil.MakeColored(_animalProvider.GetCharacteristic(index).Name)} say. Press something..");
  143.                 IncreaseRequested?.Invoke(index);
  144.                 Console.ReadKey(true);
  145.  
  146.                 Console.WriteLine("You were reborn.. Press something..\n");
  147.                 Console.ReadKey(true);
  148.             }
  149.             else if (index == renovateableCageIndex)
  150.             {
  151.                 RenovateRequested?.Invoke(index);
  152.                 Console.WriteLine("You wanted to come back. But you were eaten. You were reborn.. Press something..\n");
  153.                 Console.ReadKey(true);
  154.             }
  155.             else
  156.             {
  157.                 Console.WriteLine("You return to the cage selection. Press something..\n");
  158.                 Console.ReadKey(true);
  159.             }
  160.         }
  161.  
  162.         public void ShowCage(int index)
  163.         {
  164.             Console.WriteLine($"\nThere are {UserUtil.MakeColored(_animals.Count.ToString())} {UserUtil.MakeColored(_animalProvider.GetCharacteristic(index).Name)} in the cage, " +
  165.                 $"their gender is:\n{GetAnimalsGender()}" +
  166.                 $"\n\n{_animalProvider.MakeSound(index)}");
  167.         }
  168.  
  169.         private string GetAnimalsGender()
  170.         {
  171.             return string.Join(", ", _animals.Select(animal => animal.Gender).Distinct().OrderBy(gender => gender));
  172.         }
  173.  
  174.         private void Fill(int index)
  175.         {
  176.             for (int j = 0; j < UserUtil.GetRandomNumber(_animalProvider.GetCharacteristic(index).MaxCount, _animalProvider.GetCharacteristic(index).MinCount); j++)
  177.             {
  178.                 Increase(index);
  179.             }
  180.         }
  181.  
  182.         private void Increase(int index)
  183.         {
  184.             string name = _animalProvider.GetCharacteristic(index).Name;
  185.             string gender = _animalProvider.GetCharacteristic(index).Genders != null ?
  186.                 _animalProvider.GetCharacteristic(index).Genders[UserUtil.GetRandomNumber(_animalProvider.GetCharacteristic(index).Genders.Length)] :
  187.                 string.Format(_animalProvider.GetCharacteristic(index).GenderFormat, UserUtil.GetRandomNumber(_animalProvider.GetCharacteristic(index).GenderVariantCount + 1));
  188.  
  189.             _animals.Add(new Animal(name, gender));
  190.         }
  191.  
  192.         private void Renovate(int index)
  193.         {
  194.             int numberRemoved = 3;
  195.             int numberAdded = 3;
  196.  
  197.             for (int i = 0; i < UserUtil.GetRandomNumber(numberAdded + 1); i++)
  198.             {
  199.                 if (_animals.Count < _animalProvider.GetCharacteristic(index).MaxCount)
  200.                 {
  201.                     Increase(index);
  202.                 }
  203.             }
  204.  
  205.             for (int i = 0; i < UserUtil.GetRandomNumber(numberRemoved + 1); i++)
  206.             {
  207.                 if (_animals.Count > _animalProvider.GetCharacteristic(index).MinCount)
  208.                 {
  209.                     _animals.RemoveAt(UserUtil.GetRandomNumber(_animals.Count));
  210.                 }
  211.             }
  212.         }
  213.     }
  214.  
  215.     interface ICount
  216.     {
  217.         public int GetCount();
  218.     }
  219.  
  220.     public class AnimalProvider : ICount
  221.     {
  222.         private List<AnimalCharacteristic> _animalsCharacteristic;
  223.  
  224.         public AnimalProvider()
  225.         {
  226.             _animalsCharacteristic = new List<AnimalCharacteristic>()
  227.             {
  228.                 new AnimalCharacteristic("Flamibia", 70, 100, "Gender {0}", 784),
  229.                 new AnimalCharacteristic("Qoster", 8, 12, new string[] { "XX", "XT", "TT", "ZZ" }),
  230.                 new AnimalCharacteristic ("Kedenee", 1, 7, "Genderless"),
  231.                 new AnimalCharacteristic("Wooni", 10, 20, "Parent {0}", 2)
  232.             };
  233.         }
  234.  
  235.         public int GetCount() => _animalsCharacteristic.Count;
  236.  
  237.         public AnimalCharacteristic GetCharacteristic(int index)
  238.         {
  239.             return _animalsCharacteristic[index];
  240.         }
  241.  
  242.         public string MakeSound(int index)
  243.         {
  244.             string[] wooniReplicks = new[] { "let's have a drink", "got a cigarette?", "hey, any spare change?" };
  245.  
  246.             return index switch
  247.             {
  248.                 0 => $"You hear nothing from the {UserUtil.MakeColored(GetCharacteristic(index).Name)} cage",
  249.                 1 => "You hear: cheepcheepcheep",
  250.                 2 => "Quiet music is playing",
  251.                 3 => $"You hear: {UserUtil.MakeColored(wooniReplicks[UserUtil.GetRandomNumber(wooniReplicks.Length)])}",
  252.                 _ => ""
  253.             };
  254.         }
  255.     }
  256.  
  257.     public class AnimalCharacteristic
  258.     {
  259.         public AnimalCharacteristic(string name, int minCount, int maxCount, string genderFormat, int genderVariantCount = 0)
  260.         {
  261.             Name = name;
  262.             MinCount = minCount;
  263.             MaxCount = maxCount;
  264.             GenderFormat = genderFormat;
  265.             GenderVariantCount = genderVariantCount;
  266.         }
  267.  
  268.         public AnimalCharacteristic(string name, int minCount, int maxCount, string[] genders)
  269.         {
  270.             Name = name;
  271.             MinCount = minCount;
  272.             MaxCount = maxCount;
  273.             Genders = genders;
  274.         }
  275.  
  276.         public string Name { get; private set; }
  277.         public int MinCount { get; private set; }
  278.         public int MaxCount { get; private set; }
  279.         public string GenderFormat { get; private set; }
  280.         public int GenderVariantCount { get; private set; }
  281.         public string[] Genders { get; private set; }
  282.     }
  283.  
  284.     public class Animal
  285.     {
  286.         public Animal(string name, string gender)
  287.         {
  288.             Name = name;
  289.             Gender = gender;
  290.         }
  291.  
  292.         public string Name { get; private set; }
  293.         public string Gender { get; private set; }
  294.     }
  295.  
  296.     public class UserUtil
  297.     {
  298.         private static Random s_random = new Random();
  299.  
  300.         public static int GetRandomNumber(int max, int min = 0)
  301.         {
  302.             return s_random.Next(min, max);
  303.         }
  304.  
  305.         public static string MakeColored(string line)
  306.         {
  307.             string colorSet = "\u001b[32m";
  308.             string colorReset = "\u001b[0m";
  309.  
  310.             return colorSet + line + colorReset;
  311.         }
  312.     }
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement