코드 전체

using System.ComponentModel;
using System.Numerics;

namespace CSharp
{
    internal class Program
    {

        // 작은것을 만들어 보는 연습
        // TextRPG
        enum ClassType
        {
            None = 0,
            Knight = 1,
            Archer = 2,
            Mage = 3
        }
        struct Player
        {
            public int hp;       
            public int attack;   
            public ClassType type; 
        }
        static ClassType ChooseClass()
        {
            ClassType choice = ClassType.None;
           
            Console.WriteLine("직업을 선택하세요");
            Console.WriteLine("[1] 기사");
            Console.WriteLine("[2] 궁수");
            Console.WriteLine("[3] 법사");

            string input = Console.ReadLine();

            // 수업
            switch (input)
            {
                case "1": choice = ClassType.Knight; break;
                case "2": choice = ClassType.Archer; break;
                case "3": choice = ClassType.Mage; break;
            }

            return choice;

            //switch (input)
            //{
            //    case "1": return ClassType.Knight;
            //    case "2": return ClassType.Archer;
            //    case "3": return ClassType.Mage;
            //    default:
            //        Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
            //        break;
            //}
            
        }
        static void Main(string[] args)
        {
            //// 함수로 묶어서 사용하고 싶다
            //ClassType choice = ClassType.None;
            //while (choice != ClassType.None) // 유효한 입력이 들어올 때까지 반복
            //{
            //    Console.WriteLine("직업을 선택하세요");
            //    Console.WriteLine("[1] 기사");
            //    Console.WriteLine("[2] 궁수");
            //    Console.WriteLine("[3] 법사");

            //    // enum으로 가지고 있을것
            //    string input = Console.ReadLine();

            //    //if(input == "1" || input == "2" || input == "3")
            //    //{

            //    //}

            //    switch(input)
            //    {
            //        case "1": choice = ClassType.Knight; break;
            //        case "2": choice =  ClassType.Archer; break;
            //        case "3": choice = ClassType.Mage; break;
            //        default:
            //            Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
            //            break;
            //    }
            //    //if(choice != ClassType.None)
            //    //{
            //    //    break;
            //    //}
            //}
            //static void CreatePlayer(ClassType choice, out int hp, out int attack)
            //{
            //    switch(choice)
            //    {
            //        case ClassType.Knight:
            //            hp = 100;
            //            attack = 100;
            //            break;
            //        case ClassType.Archer:
            //            hp = 75;
            //            attack = 12;
            //            break;
            //        case ClassType.Mage:
            //            hp = 50;
            //            attack = 15;
            //            break;
            //        default:
            //            hp = 0;
            //            attack = 0;
            //            break;
            //    }
            //}
            
            static void CreatePlayer(ClassType choice, out Player player)
            {
                player.type = choice;  // 선택한 직업 저장

                // 직업별 능력치 설정
                switch (choice)
                {
                    case ClassType.Knight:
                        player.hp = 100;
                        player.attack = 10;
                        break;
                    case ClassType.Archer:
                        player.hp = 75;
                        player.attack = 12;
                        break;
                    case ClassType.Mage:
                        player.hp = 50;
                        player.attack = 15;
                        break;
                    default:
                        player.hp = 0;
                        player.attack = 0;
                        break;
                }
            }
            while (true)
            {
               ClassType choice = ChooseClass();
                if (choice != ClassType.None)
                {
                    break;
                    //int hp;
                    //int attack;
                    //// 캐릭터 생성
                    //// 기사(100/10) 궁수 (75/12) 법사(50/15)
                    //CreatePlayer(choice, out hp, out attack);

                    Player player;
                    CreatePlayer(choice, out player);

                    Console.WriteLine($"당신의 직업: {player.type}");
                    Console.WriteLine($"체력(HP): {player.hp}, 공격력(Attack): {player.attack}");
                }
            }
            

        }

    }
}

1️⃣ 프로그램 개요

✅ 기능 요약

  • 사용자가 직업(ClassType)을 선택하면,
  • 해당 직업에 맞는 플레이어(Player) 캐릭터를 생성하고,
  • 각 직업에 따른 능력치(HP, Attack)를 설정 후 출력.

## **3️⃣ 코드 분석 (상세 설명)**
### **📌 1) 직업(Enum) 정의**
```csharp
        enum ClassType
        {
            None = 0,
            Knight = 1,
            Archer = 2,
            Mage = 3
        }
  • 열거형(enum)을 사용하여 직업을 숫자로 관리
    • None = 0 → 기본값 (선택되지 않음)
    • Knight = 1 → 기사
    • Archer = 2 → 궁수
    • Mage = 3 → 마법사

📌 enum을 사용하면?

  • 직업을 숫자로 표현할 수 있어 가독성이 높아짐
  • 코드에서 if (choice == ClassType.Knight) 같은 비교가 직관적

📌 2) 플레이어 특성을 담는 구조체 (Struct)

        struct Player
        {
            public int hp;
            public int attack;
            public ClassType type;
        }
  • struct를 사용하여 플레이어 정보를 하나의 데이터 구조로 관리
  • 체력(hp), 공격력(attack), 직업(type) 정보를 포함
  • struct값 타입(value type) 이므로 스택(stack)에 저장됨 → 메모리 효율적

📌 ✅ 구조체(Struct) 특징

  • 값 타입 (stack 메모리 사용) → 빠르고 메모리 효율적
  • 간단한 데이터 묶음 표현 시 유용
  • 상속이 불가능하므로 단순한 구조 유지

📌 3) 직업 선택 함수

        static ClassType ChooseClass()
        {
            while (true)
            {
                Console.WriteLine("직업을 선택하세요");
                Console.WriteLine("[1] 기사");
                Console.WriteLine("[2] 궁수");
                Console.WriteLine("[3] 법사");

                string input = Console.ReadLine();

                switch (input)
                {
                    case "1": return ClassType.Knight;
                    case "2": return ClassType.Archer;
                    case "3": return ClassType.Mage;
                    default:
                        Console.WriteLine("잘못된 입력입니다. 다시 입력하세요.");
                        break;
                }
            }
        }

📌 ✅ 개선된 점

  • 입력이 올바를 때까지 while (true) 반복
  • 잘못된 입력 시 "잘못된 입력입니다." 메시지를 출력 후 다시 입력 요청
  • switch 문에서 직접 return하여 깔끔한 코드 유지

📌 4) 플레이어 생성 함수

        static void CreatePlayer(ClassType choice, out Player player)
        {
            player.type = choice;

            switch (choice)
            {
                case ClassType.Knight:
                    player.hp = 100;
                    player.attack = 10;
                    break;
                case ClassType.Archer:
                    player.hp = 75;
                    player.attack = 12;
                    break;
                case ClassType.Mage:
                    player.hp = 50;
                    player.attack = 15;
                    break;
                default:
                    player.hp = 0;
                    player.attack = 0;
                    break;
            }
        }

📌 out 키워드 활용

  • out을 사용하면 함수 내부에서 값을 반드시 설정해야 하므로 안정성 증가
  • 함수 호출 후 player 구조체가 완전히 초기화됨

📌 ✅ 직업별 능력치 설정

  • 기사(Knight) → 체력 100, 공격력 10
  • 궁수(Archer) → 체력 75, 공격력 12
  • 법사(Mage) → 체력 50, 공격력 15

📌 5) 메인 함수

        static void Main(string[] args)
        {
            while (true)
            {
                ClassType choice = ChooseClass(); // 직업 선택

                if (choice != ClassType.None)
                {
                    Player player;
                    CreatePlayer(choice, out player); // 플레이어 생성

                    Console.WriteLine($"당신의 직업: {player.type}");
                    Console.WriteLine($"체력(HP): {player.hp}, 공격력(Attack): {player.attack}");
                }
            }
        }

📌 while (true) 활용

  • 직업을 계속 선택할 수 있도록 반복
  • ClassType.None이 아닐 경우 플레이어 정보 출력

📌 Console.WriteLine을 활용한 직업 정보 출력

  • 선택한 직업과 능력치를 직관적으로 출력하여 피드백 제공

profile
李家네_공부방

0개의 댓글