Advertisement
ZhongNi

Aquarium (6)

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