Advertisement
ZhongNi

Aquarium (2)

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