Избавьтесь от дублирующегося кода “Босс атакует”

Вам дан следующий код. Необходимо избавиться от дублирующегося кода, а также, где это возможно, упростить понимание программы.

using System;
using System.Threading;

namespace Boss
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleColor oldColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Босс может атаковать в двух режимах: все атаки по очереди и случайной атакой");
            Console.ForegroundColor = oldColor;

            int Health = 1000;
            int Armor = 20;

            bool isRandomAttack = (DateTime.Now.Millisecond % 2) == 0;

            oldColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Босс будет атаковать: " + (isRandomAttack ? "случайно" : "все атаки по очереди"));
            Console.ForegroundColor = oldColor;

            oldColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Нажмите enter для начала боя");
            Console.ForegroundColor = oldColor;
            Console.ReadLine();

            int attackNumber = 0;
            while (Health > 0)
            {
                Console.Clear();
                oldColor = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("У вас здоровья: " + Health);
                Console.ForegroundColor = oldColor;

                if (isRandomAttack)
                {
                    int rand = DateTime.Now.Millisecond % 3;
                    if(rand == 0)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.WriteLine("Босс атаковал с немыслимой яростью своими руками");
                        Console.ForegroundColor = oldColor;

                        Health = Health - (100 - Armor);
                    }
                    else if(rand == 1)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.WriteLine("Босс исполнил новый альбом Ольги бузовой");
                        Console.ForegroundColor = oldColor;
                        Health = Health - (140 - Armor);
                    }
                    else if(rand == 2)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkGray;
                        Console.WriteLine("Босс приуныл и рассказал вам о своём долгом пути и дал пару советов, после выпил ритуальный стопарь боярки");
                        Console.ForegroundColor = oldColor;
                        Health = Health - (80 - Armor);
                    }
                }
                else
                {
                    if (attackNumber == 0)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.WriteLine("Босс атаковал с немыслимой яростью своими руками");
                        Console.ForegroundColor = oldColor;

                        Health = Health - (100 - Armor);
                    }
                    else if (attackNumber == 1)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.WriteLine("Босс исполнил новый альбом Ольги бузовой");
                        Console.ForegroundColor = oldColor;
                        Health = Health - (140 - Armor);
                    }
                    else if (attackNumber == 2)
                    {
                        oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.DarkGray;
                        Console.WriteLine("Босс паник и рассказал вам о своём долгом пути и дал пару советов, после выпил ритуальный стопарь боярки");
                        Console.ForegroundColor = oldColor;
                        Health = Health - (80 - Armor);
                    }

                    attackNumber += 1;
                    if (attackNumber > 2)
                    {
                        attackNumber = 0;
                    }
                }

                Thread.Sleep(4000);
            }

            oldColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.DarkGray;
            Console.WriteLine("Бой закончен, вы погибли");
            Console.ForegroundColor = oldColor;

        }

    }
}

Решение:

using System;
using System.Threading;

namespace Boss
{
    class Program
    {
        private static int Health = 1000;
        private static int Armor = 20;

        static void Main(string[] args)
        {
            WriteColoredLine("Босс может атаковать в двух режимах: все атаки по очереди и случайной атакой", ConsoleColor.Yellow);

            bool isRandomAttack = GetRandomFromZeroTo(2) == 0;

            WriteColoredLine("Босс будет атаковать: " + (isRandomAttack ? "случайно" : "все атаки по очереди"), ConsoleColor.Yellow);
            WriteColoredLine("Нажмите enter для начала боя", ConsoleColor.Green);

            Console.ReadLine();

            int attackNumber = 0;
            while (Health > 0)
            {
                Console.Clear();
                WriteColoredLine("У вас здоровья: " + Health, ConsoleColor.Red);

                if (isRandomAttack)
                {
                    Attack(GetRandomFromZeroTo(3));
                }
                else
                {
                    Attack(attackNumber);

                    attackNumber += 1;
                    if (attackNumber > 2)
                    {
                        attackNumber = 0;
                    }
                }

                Thread.Sleep(4000);
            }

            WriteColoredLine("Бой закончен, вы погибли", ConsoleColor.DarkGray);
        }

        private static int GetRandomFromZeroTo(int max)
        {
            return DateTime.Now.Millisecond % 3;
        }

        private static void WriteColoredLine(string message, ConsoleColor color)
        {
            var oldColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            Console.WriteLine(message);
            Console.ForegroundColor = oldColor;
        }

        private static void Attack(int attackId)
        {
            if (attackId == 0)
            {
                WriteColoredLine("Босс атаковал с немыслимой яростью своими руками", ConsoleColor.DarkRed);

                Health = Health - (100 - Armor);
            }
            else if (attackId == 1)
            {
                WriteColoredLine("Босс исполнил новый альбом Ольги бузовой", ConsoleColor.DarkMagenta);

                Health = Health - (140 - Armor);
            }
            else if (attackId == 2)
            {
                WriteColoredLine("Босс приуныл и рассказал вам о своём долгом пути и дал пару советов, после выпил ритуальный стопарь боярки" ConsoleColor.DarkGray);

                Health = Health - (80 - Armor);
            }
        }
    }
}

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *