Advertisement
ZhongNi

Aquarium

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