Advertisement
ZhongNi

Aquarium (4)

Oct 31st, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.55 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.             Aquarium aquarium = new Aquarium();
  12.             aquarium.Live();
  13.         }
  14.     }
  15.  
  16.     public class Aquarium
  17.     {
  18.         private List<Fish> _fishes;
  19.         private int _size;
  20.         private Manager _manager;
  21.  
  22.         public Aquarium()
  23.         {
  24.             _size = 50;
  25.             _fishes = new List<Fish>();
  26.             _manager = new Manager(new Filler(), new Grower(), new Killer(), new Remover(), new Shower(), new Increaser(), new Decreaser());
  27.             _manager.Filler.Fill(_fishes, _size);
  28.         }
  29.  
  30.         public void Live()
  31.         {
  32.             int turn = 1;
  33.  
  34.             Console.WriteLine("Turn :" + turn++);
  35.             _manager.Shower.ShowAllFishes(_fishes);
  36.  
  37.             bool isRunning = true;
  38.             ConsoleKey menuLaunchKey = ConsoleKey.D0;
  39.             string menuLaunch = "0";
  40.  
  41.             while (isRunning)
  42.             {
  43.                 Console.WriteLine($"\nPress something for next turn... or {menuLaunch} for menu");
  44.  
  45.                 if (Console.ReadKey().Key == menuLaunchKey)
  46.                 {
  47.                     Console.Clear();
  48.                     isRunning = _manager.LaunchMenu(_fishes);
  49.                     continue;
  50.                 }
  51.  
  52.                 Console.Clear();
  53.                 Console.WriteLine("Turn :" + turn++);
  54.  
  55.                 _manager.Grower.GrowOldFishes(_fishes);
  56.                 _manager.Killer.KillFishes(_fishes, _size);
  57.                 _manager.Remover.RemoveFishes(_fishes, _size);
  58.                 _manager.Shower.ShowAllFishes(_fishes);
  59.             }
  60.         }
  61.     }
  62.  
  63.     public class Manager
  64.     {
  65.         private IIncreasable _increaser;
  66.         private IDecreasable _decreaser;
  67.         public IFillable Filler;
  68.         public IGrowable Grower;
  69.         public IKillable Killer;
  70.         public IRemoveable Remover;
  71.         public IShowable Shower;
  72.  
  73.         public Manager(IFillable filler, IGrowable grower, IKillable killer, IRemoveable remover, IShowable shower, IIncreasable increaser, IDecreasable decreaser)
  74.         {
  75.             _increaser = increaser;
  76.             _decreaser = decreaser;
  77.             Filler = filler;
  78.             Grower = grower;
  79.             Killer = killer;
  80.             Remover = remover;
  81.             Shower = shower;
  82.         }
  83.  
  84.         public bool LaunchMenu(List<Fish> fishes)
  85.         {
  86.             const string CommandAddFish = "1";
  87.             const string CommandRemoveFish = "2";
  88.             const string CommandShowFish = "3";
  89.             const string CommandExitMenu = "4";
  90.             const string CommandExit = "5";
  91.  
  92.             bool hasSelected = false;
  93.             bool isRunning = true;
  94.  
  95.             while (hasSelected == false)
  96.             {
  97.                 Console.Clear();
  98.                 Console.WriteLine($"Press {CommandAddFish} for add fish," +
  99.                     $"\n {CommandRemoveFish} for remove," +
  100.                     $"\n {CommandShowFish} for show," +
  101.                     $"\n {CommandExitMenu} for exit the menu" +
  102.                     $"\n or {CommandExit} for close aquarium");
  103.  
  104.                 string userCommand = Console.ReadLine();
  105.  
  106.                 switch (userCommand)
  107.                 {
  108.                     case CommandAddFish:
  109.                         _increaser.IncreaseFishes(fishes);
  110.                         break;
  111.                     case CommandRemoveFish:
  112.                         _decreaser.DecreaseFishes(fishes);
  113.                         break;
  114.                     case CommandShowFish:
  115.                         Console.Clear();
  116.                         Shower.ShowAllFishes(fishes);
  117.                         Console.WriteLine("\nPress something..");
  118.                         Console.ReadKey();
  119.                         break;
  120.                     case CommandExitMenu:
  121.                         hasSelected = true;
  122.                         break;
  123.                     case CommandExit:
  124.                         hasSelected = true;
  125.                         isRunning = false;
  126.                         break;
  127.                     default:
  128.                         Console.WriteLine("Wrong key");
  129.                         break;
  130.                 }
  131.             }
  132.  
  133.             return isRunning;
  134.         }
  135.     }
  136.  
  137.     public interface IFillable
  138.     {
  139.         public void Fill(List<Fish> fishes, int aquariumSize);
  140.     }
  141.  
  142.     public class Filler : IFillable
  143.     {
  144.         public void Fill(List<Fish> fishes, int aquariumSize)
  145.         {
  146.             int fishListCount = Characteristics.PresetCharacteristics.Count;
  147.             int minOccupiedVolume = Characteristics.PresetCharacteristics.Min(fish => fish.OccupiedSize);
  148.  
  149.             for (int size = 0; size < aquariumSize;)
  150.             {
  151.                 Characteristics currentCharacteristic = Characteristics.PresetCharacteristics[UserUtil.GenerateRandomNumber(fishListCount)];
  152.  
  153.                 if (size + currentCharacteristic.OccupiedSize > aquariumSize)
  154.                 {
  155.                     fishListCount = fishListCount > minOccupiedVolume ? fishListCount-- : minOccupiedVolume;
  156.                     continue;
  157.                 }
  158.  
  159.                 fishes.Add(new Fish(currentCharacteristic));
  160.                 size += currentCharacteristic.OccupiedSize;
  161.             }
  162.         }
  163.     }
  164.  
  165.     public interface IShowable
  166.     {
  167.         public void ShowAllFishes(List<Fish> fishes);
  168.     }
  169.  
  170.     public class Shower : IShowable
  171.     {
  172.         public void ShowAllFishes(List<Fish> fishes)
  173.         {
  174.             foreach (var fish in fishes)
  175.             {
  176.                 Console.ForegroundColor = fish.Characteristics.Color;
  177.                 int minLeftPosition = 30;
  178.                 int maxLeftPosition = 110;
  179.                 int minTopPosition = 1;
  180.                 int maxTopPosition = 14;
  181.  
  182.                 Console.SetCursorPosition(UserUtil.GenerateRandomNumber(minLeftPosition, maxLeftPosition + 1), UserUtil.GenerateRandomNumber(minTopPosition, maxTopPosition + 1));
  183.                 Console.WriteLine(fish.Characteristics.Image);
  184.             }
  185.  
  186.             var ordered = fishes.OrderBy(fish => fish.Characteristics.Name).ThenBy(fish => fish.Age);
  187.  
  188.             int leftPosition = 0;
  189.             int topPosition = 4;
  190.             Console.SetCursorPosition(leftPosition, topPosition);
  191.  
  192.             foreach (var fish in ordered)
  193.             {
  194.                 Console.ForegroundColor = fish.Characteristics.Color;
  195.                 Console.WriteLine($"{fish.Characteristics.Name} - {fish.Age}({fish.Characteristics.LifeExpectancy})");
  196.             }
  197.  
  198.             Console.ResetColor();
  199.         }
  200.     }
  201.  
  202.     public interface IGrowable
  203.     {
  204.         public void GrowOldFishes(List<Fish> fishes);
  205.     }
  206.  
  207.     public class Grower : IGrowable
  208.     {
  209.         public void GrowOldFishes(List<Fish> fishes)
  210.         {
  211.             foreach (var fish in fishes)
  212.             {
  213.                 fish.IncreaseAge();
  214.             }
  215.         }
  216.     }
  217.  
  218.     public interface IKillable
  219.     {
  220.         public void KillFishes(List<Fish> fishes, int aquariumSize);
  221.     }
  222.  
  223.     public class Killer : IKillable
  224.     {
  225.         public void KillFishes(List<Fish> fishes, int aquariumSize)
  226.         {
  227.             int fishCount = Characteristics.PresetCharacteristics.Count;
  228.             int quantityPerLiter = 10;
  229.             int maxFishCount = aquariumSize * quantityPerLiter;
  230.             int volumeFish = fishes.Sum(fish => fish.Characteristics.OccupiedSize);
  231.             int fullMultiplier = VerifyFullVolume(volumeFish, aquariumSize);
  232.  
  233.             if (volumeFish >= maxFishCount)
  234.             {
  235.                 foreach (var fish in fishes)
  236.                 {
  237.                     fish.Kill();
  238.                 }
  239.             }
  240.             else
  241.             {
  242.                 foreach (var fish in fishes)
  243.                 {
  244.                     int probabilityDeath = VerifyAge(fish);
  245.  
  246.                     probabilityDeath *= VerifyAlone(fish, fishes);
  247.  
  248.                     probabilityDeath *= fullMultiplier;
  249.  
  250.                     int maxChance = 100;
  251.  
  252.                     if (UserUtil.GenerateRandomNumber(maxChance + 1) < probabilityDeath)
  253.                     {
  254.                         fish.Kill();
  255.                     }
  256.                 }
  257.             }
  258.         }
  259.  
  260.         private int VerifyFullVolume(int volumeFish, int aquariumSize)
  261.         {
  262.             int multiplier = 1;
  263.             int fullMultiplier = 2;
  264.  
  265.             if (volumeFish > aquariumSize)
  266.             {
  267.                 multiplier = fullMultiplier;
  268.             }
  269.  
  270.             return multiplier;
  271.         }
  272.  
  273.         private int VerifyAge(Fish fish)
  274.         {
  275.             int probabilityDeath = 2;
  276.             int firstHalf = 2;
  277.             int secondHalf = 5;
  278.             int longLife = 90;
  279.             int lifePeriod = 2;
  280.  
  281.             if (fish.Age < fish.Characteristics.LifeExpectancy / lifePeriod)
  282.             {
  283.                 probabilityDeath = firstHalf;
  284.             }
  285.             else if (fish.Age < fish.Characteristics.LifeExpectancy)
  286.             {
  287.                 probabilityDeath = secondHalf;
  288.             }
  289.             else if (fish.Age >= fish.Characteristics.LifeExpectancy)
  290.             {
  291.                 probabilityDeath = longLife;
  292.             }
  293.  
  294.             return probabilityDeath;
  295.         }
  296.  
  297.         private int VerifyAlone(Fish fish, List<Fish> fishes)
  298.         {
  299.             string fishName = fish.Characteristics.Name;
  300.             int nameCount = fishes.Count(fish => fish.Characteristics.Name == fishName);
  301.             int multiplier = 1;
  302.             int aloneMultiplier = 2;
  303.  
  304.             if (nameCount == 1)
  305.             {
  306.                 multiplier = aloneMultiplier;
  307.             }
  308.  
  309.             return multiplier;
  310.         }
  311.     }
  312.  
  313.     public interface IRemoveable
  314.     {
  315.         public void RemoveFishes(List<Fish> fishes, int aquariumSize);
  316.  
  317.     }
  318.  
  319.     public class Remover : IRemoveable
  320.     {
  321.         public void RemoveFishes(List<Fish> fishes, int aquariumSize)
  322.         {
  323.             int quantityPerLiter = 10;
  324.             int maxFishCount = aquariumSize * quantityPerLiter;
  325.             int volumeFish = fishes.Sum(fish => fish.Characteristics.OccupiedSize);
  326.  
  327.             if (volumeFish >= maxFishCount)
  328.             {
  329.                 Console.WriteLine("Too many fish. All died.");
  330.             }
  331.  
  332.             int numberDead = 0;
  333.  
  334.             for (int i = fishes.Count - 1; i >= 0; i--)
  335.             {
  336.                 if (fishes[i].IsAlive == false)
  337.                 {
  338.                     fishes.RemoveAt(i);
  339.                     numberDead++;
  340.                 }
  341.             }
  342.  
  343.             int leftPosition = 0;
  344.             int topPosition = 2;
  345.             Console.SetCursorPosition(leftPosition, topPosition);
  346.             Console.WriteLine($"fish died: {numberDead}");
  347.         }
  348.     }
  349.  
  350.     public interface IIncreasable
  351.     {
  352.         public void IncreaseFishes(List<Fish> fishes);
  353.     }
  354.  
  355.     public class Increaser : IIncreasable
  356.     {
  357.         public void IncreaseFishes(List<Fish> fishes)
  358.         {
  359.             Characteristics.ShowListCharacteristics();
  360.             Console.Write("\nChoose type of fish to add: ");
  361.  
  362.             if (int.TryParse(Console.ReadLine(), out int typeNumber) && typeNumber >= 0 && typeNumber < Characteristics.PresetCharacteristics.Count)
  363.             {
  364.                 Console.WriteLine("How many fish to add?");
  365.  
  366.                 if (int.TryParse(Console.ReadLine(), out int amount) && amount > 0)
  367.                 {
  368.                     for (int i = 0; i < amount; i++)
  369.                     {
  370.                         fishes.Add(new Fish(Characteristics.PresetCharacteristics[typeNumber]));
  371.                     }
  372.                 }
  373.                 else
  374.                 {
  375.                     Console.WriteLine("Wrong amount");
  376.                 }
  377.             }
  378.             else
  379.             {
  380.                 Console.WriteLine("Wrong type");
  381.             }
  382.         }
  383.     }
  384.  
  385.     public interface IDecreasable
  386.     {
  387.         public void DecreaseFishes(List<Fish> fishes);
  388.     }
  389.  
  390.     public class Decreaser : IDecreasable
  391.     {
  392.         public void DecreaseFishes(List<Fish> fishes)
  393.         {
  394.             Characteristics.ShowListCharacteristics();
  395.             Console.Write("\nChoose the type of fish to remove: ");
  396.  
  397.             if (int.TryParse(Console.ReadLine(), out int typeNumber) && typeNumber >= 0 && typeNumber < Characteristics.PresetCharacteristics.Count)
  398.             {
  399.                 string fishName = Characteristics.PresetCharacteristics[typeNumber].Name;
  400.                 int nameCount = fishes.Count(fish => fish.Characteristics.Name == fishName);
  401.  
  402.                 Console.WriteLine($"How many fish to remove? There are {nameCount} fish of this type");
  403.  
  404.                 if (int.TryParse(Console.ReadLine(), out int amount) && amount > 0)
  405.                 {
  406.                     if (amount > nameCount)
  407.                     {
  408.                         Console.WriteLine("The entered quantity exceeds the quantity of fish of this type in the aquarium, delete all fish of this type");
  409.                         Console.WriteLine("\nPress something..");
  410.                         Console.ReadKey();
  411.                     }
  412.  
  413.                     amount = Math.Min(amount, nameCount);
  414.  
  415.                     for (int i = fishes.Count - 1; i >= 0; i--)
  416.                     {
  417.                         if (fishes[i].Characteristics.Name == fishName && amount > 0)
  418.                         {
  419.                             fishes.RemoveAt(i);
  420.                             amount--;
  421.                         }
  422.                     }
  423.                 }
  424.                 else
  425.                 {
  426.                     Console.WriteLine("Wrong amount");
  427.                 }
  428.             }
  429.             else
  430.             {
  431.                 Console.WriteLine("Wrong type");
  432.             }
  433.         }
  434.     }
  435.  
  436.     public class Fish
  437.     {
  438.         public Characteristics Characteristics { get; private set; }
  439.  
  440.         public Fish(Characteristics characteristics)
  441.         {
  442.             Characteristics = characteristics;
  443.             IsAlive = true;
  444.  
  445.             InitiateAge();
  446.         }
  447.  
  448.         public int Age { get; private set; }
  449.         public bool IsAlive { get; private set; }
  450.  
  451.         public void IncreaseAge()
  452.         {
  453.             Age++;
  454.         }
  455.  
  456.         public void Kill()
  457.         {
  458.             IsAlive = false;
  459.         }
  460.  
  461.         private void InitiateAge()
  462.         {
  463.             int minAge = 1;
  464.             int minLifeSpan = 10;
  465.             int maxAge = Characteristics.LifeExpectancy > minLifeSpan ? Characteristics.LifeExpectancy - minLifeSpan : 1;
  466.  
  467.             Age = UserUtil.GenerateRandomNumber(minAge, maxAge + 1);
  468.         }
  469.     }
  470.  
  471.     public class Characteristics
  472.     {
  473.         public static List<Characteristics> PresetCharacteristics = new List<Characteristics>()
  474.         {
  475.             new Characteristics("Guppy", 30, 2, ">-->", ConsoleColor.Cyan),
  476.             new Characteristics("Paracheirodon", 48, 2, ">==>",ConsoleColor.Blue),
  477.             new Characteristics("Xiphophorus",60,4 ,"_>=>",ConsoleColor.Red),
  478.             new Characteristics("Yucatan molly",30,4, ">WW>",ConsoleColor.DarkCyan),
  479.             new Characteristics("Catfish", 96,8,">=>_",ConsoleColor.Gray ),
  480.             new Characteristics("Goldfish",120,12,">=@>",ConsoleColor.DarkYellow)
  481.         };
  482.  
  483.         public Characteristics(string name, int lifeExpectancy, int occupiedSize, string image, ConsoleColor color)
  484.         {
  485.             Name = name;
  486.             LifeExpectancy = lifeExpectancy;
  487.             OccupiedSize = occupiedSize;
  488.             Image = image;
  489.             Color = color;
  490.         }
  491.  
  492.         public string Name { get; private set; }
  493.         public int LifeExpectancy { get; private set; }
  494.         public int OccupiedSize { get; private set; }
  495.         public string Image { get; private set; }
  496.         public ConsoleColor Color { get; private set; }
  497.  
  498.         public static void ShowListCharacteristics()
  499.         {
  500.             Console.Write("There is the following fish: ");
  501.  
  502.             for (int i = 0; i < PresetCharacteristics.Count; i++)
  503.             {
  504.                 Console.Write($"{i} - {PresetCharacteristics[i].Name} ");
  505.             }
  506.         }
  507.     }
  508.  
  509.     public class UserUtil
  510.     {
  511.         private static Random s_random = new Random();
  512.  
  513.         public static int GenerateRandomNumber(int min, int max)
  514.         {
  515.             return s_random.Next(min, max);
  516.         }
  517.  
  518.         public static int GenerateRandomNumber(int max)
  519.         {
  520.             return s_random.Next(max);
  521.         }
  522.     }
  523. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement