본문 바로가기
프로그래밍 이야기/GameDev

C#코딩연습 - 클래스 연습

by Mulder5 2020. 11. 18.
반응형

오늘은 클래스의 상속과 인스턴스 관리에 대한 연습을 해봤습니다. Babarian, Giant, Healer의 인스턴스들을 관리하는 UnitControl 클래스와 이에 대한 구현이 본 내용의 핵심입니다. 오늘까지 강의 수강 진행률이 거의 40%. 화이팅~!

class Army
    {
        protected int _HP;
        protected int _MP;
        protected int _Speed;
        protected int _Attack;

        public virtual void Run()
        {
            Console.Write("Speed : {0}, ", _Speed);
        }

        public virtual void Attack()
        {
            // 줄내림
            Console.WriteLine();

            // 
            Console.Write("Att : {0}, ");
        }
    }

    class Babarian : Army
    {
        // 생성자, 기본값 설정
        public Babarian()
        {
            _HP = 100;
            _MP = 10;
            _Speed = 3;
            _Attack = 100;
            Console.WriteLine("Babarian Created.");
        }

        public override void Run()
        {
            base.Run();
            Console.WriteLine(" Babarian is running.");
        }
        public override void Attack()
        {
            base.Attack();
            Console.WriteLine(" Babarian attacks using Sword");
        }
    }

    class Giant : Army
    {
        public Giant()
        {
            _HP = 500;
            _MP = 5;
            _Speed = 1;
            _Attack = 200;
            Console.WriteLine("Giant Created.");
        }

        public override void Run()
        {
            base.Run();
            Console.WriteLine(" Giant is running.");
        }
        public override void Attack()
        {
            base.Attack();
            Console.WriteLine(" Giant punching!");
        }
    }

    class Healer : Army
    {
        public Healer()
        {
            _HP = 50;
            _MP = 100;
            _Speed = 5;
            _Attack = 20;
            Console.WriteLine("Healer Created.");
        }

        public override void Run()
        {
            base.Run();
            Console.WriteLine(" Healer is Flying.");
        }

        public override void Attack()
        {
            base.Attack();
            Console.WriteLine(" Healer shoots fireball.");
        }
    }

    class UnitControl
    {
        public enum UNIT
        {
            NONE,
            BABARIAN,
            GIANT,
            HEALER
        }

        const int MAX = 10;
        Army[] arrArmy;

        int indexCount;
        public UnitControl()
        {
            indexCount = 0;
            arrArmy = new Army[MAX];

        }

        public string Menu()
        {
            Console.WriteLine(" ++ Unit management system ++");
            Console.WriteLine(" (1)Create (2)Run (3)Attack (0)Quit");

            // Menu에 대한 사용자 입력
            return Console.ReadLine();
        }

        public void CreateUnitMenu()
        {
            Console.Clear();
            Console.WriteLine(" ++ Unit Create ++");
            Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (0)Back");

            // Unit Create 메뉴에 대한 사용자 입력
            UNIT selectedUnit = UNIT.NONE;
            string inputString = Console.ReadLine();

            if(indexCount >= MAX)
            {
                Console.WriteLine(" ++ Unit Creation Failed ++ {0}/{1}", indexCount, MAX);
                Console.WriteLine();
                return;
            }

            if(inputString.Equals("1") || inputString.Equals("2") || inputString.Equals("3"))
            {
                selectedUnit = (UNIT)int.Parse(inputString);
            }

            switch (selectedUnit)
            {
                case UNIT.NONE: // BACK
                    indexCount--;   // 뒤에서 ++ 수행하므로 먼저 반대로 
                    break;
                case UNIT.BABARIAN:
                    arrArmy[indexCount] = new Babarian();
                    break;
                case UNIT.GIANT:
                    arrArmy[indexCount] = new Giant();
                    break;
                case UNIT.HEALER:
                    arrArmy[indexCount] = new Healer();
                    break;
                default:
                    break;
            }

            indexCount++;
        }

        public void UnitRunMenu()
        {
            Console.Clear();
            Console.WriteLine(" >> Unit Run >>");
            Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (4)All (0)Back");
            // UnitRunMenu에 대한 사용자 입력
            UNIT selectedUnit = UNIT.NONE;
            string inputString = Console.ReadLine();
            if(inputString.Equals("1") || inputString.Equals("2")|| inputString.Equals("3"))
            {
                selectedUnit = (UNIT)int.Parse(inputString);

                UnitRun(selectedUnit);
            }
            else if(inputString.Equals("4"))
            {
                UnitRun();
            }
            else
            {
                Console.Clear();
            }
            
        }

        private void UnitRun()
        {
            for (int i = 0; i < indexCount; i++)
            {
                arrArmy[i].Run();
            }
        }

        private void UnitRun(UNIT unit)
        {
            switch (unit)
            {
                case UNIT.NONE:
                    break;
                case UNIT.BABARIAN:
                    for(int i = 0; i< indexCount; i++)
                    {
                        if (arrArmy[i] is Babarian)
                            arrArmy[i].Run();
                    }
                    break;
                case UNIT.GIANT:
                    for (int i = 0; i < indexCount; i++)
                    {
                        if (arrArmy[i] is Giant)
                            arrArmy[i].Run();
                    }
                    break;
                case UNIT.HEALER:
                    for (int i = 0; i < indexCount; i++)
                    {
                        if (arrArmy[i] is Healer)
                            arrArmy[i].Run();
                    }
                    break;
                default:
                    break;
            }
        }

        public void UnitAttackMenu()
        {
            Console.Clear();
            Console.WriteLine(" !! Unit Attack !!");
            Console.WriteLine(" (1)Babarian (2)Giant (3)Healer (4)All (0)Back");
            // UnitRunMenu에 대한 사용자 입력
            UNIT selectedUnit = UNIT.NONE;
            string inputString = Console.ReadLine();
            if (inputString.Equals("1") || inputString.Equals("2") || inputString.Equals("3"))
            {
                selectedUnit = (UNIT)int.Parse(inputString);

                // 선택된 유닛 달리기
                UnitRun(selectedUnit);
            }
            else if (inputString.Equals("4"))
            {
                // 전체 달리기
                UnitRun();
            }
            else
            {
                Console.Clear();
            }
        }

        private void UnitAttack()
        {
            for (int i = 0; i < indexCount; i++)
            {
                arrArmy[i].Attack();
            }
        }

        private void UnitAttack(UNIT unit)
        {
            switch (unit)
            {
                case UNIT.NONE:
                    break;
                case UNIT.BABARIAN:
                    for (int i = 0; i < indexCount; i++)
                    {
                        if (arrArmy[i] is Babarian)
                            arrArmy[i].Attack();
                    }
                    break;
                case UNIT.GIANT:
                    for (int i = 0; i < indexCount; i++)
                    {
                        if (arrArmy[i] is Giant)
                            arrArmy[i].Attack();
                    }
                    break;
                case UNIT.HEALER:
                    for (int i = 0; i < indexCount; i++)
                    {
                        if (arrArmy[i] is Healer)
                            arrArmy[i].Attack();
                    }
                    break;
                default:
                    break;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            UnitControl control = new UnitControl();
            string selectedMenu;
            bool isLoop = true;

            while(isLoop)
            {
                selectedMenu = control.Menu();

                switch(selectedMenu)
                {
                    case "1": // Creation
                        control.CreateUnitMenu();
                        break;
                    case "2": // Run
                        control.UnitRunMenu();
                        break;
                    case "3": // Attack
                        control.UnitAttackMenu();
                        break;

                    default:
                        isLoop = false;
                        break;
                }

            }
        }
    }
반응형