Advertisement
ZhongNi

Aquarium (3)

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