전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;

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;
        }
        enum MonsterType
        {
            None = 0,
            Slime = 1,   // 슬라임
            Orc = 2,     // 오크
            Skeleton = 3 // 스켈레톤
        }
        struct Monster
        {
            public int hp;
            public int attack;
            public MonsterType type;
        }
        static void CreateRandomMonster(out Monster monster)
        {
            Random rand = new Random();
            int randMonster = rand.Next(1, 4); // 1 ~ 3 중 랜덤 정수

            switch (randMonster)
            {
                case (int)MonsterType.Slime:
                    Console.WriteLine("슬라임이 스폰 되었습니다!");
                    monster.hp = 20;
                    monster.attack = 2;
                    monster.type = MonsterType.Slime;
                    break;
                case (int)MonsterType.Orc:
                    Console.WriteLine("오크가 스폰 되었습니다!");
                    monster.hp = 40;
                    monster.attack = 4;
                    monster.type = MonsterType.Orc;
                    break;
                case (int)MonsterType.Skeleton:
                    Console.WriteLine("스켈레톤이 스폰 되었습니다!");
                    monster.hp = 30;
                    monster.attack = 3;
                    monster.type = MonsterType.Skeleton;
                    break;
                default:
                    monster.hp = 0;
                    monster.attack = 0;
                    monster.type = MonsterType.None;
                    break;
            }
        }
        static void Fight(ref Player player, ref Monster monster)
        {
            while (true)
            {
                // 플레이어 공격
                monster.hp -= player.attack;
                if (monster.hp <= 0)
                {
                    Console.WriteLine("승리했습니다!");
                    Console.WriteLine($"남은 체력: {player.hp}");
                    break;
                }

                // 몬스터 반격
                player.hp -= monster.attack;
                if (player.hp <= 0)
                {
                    Console.WriteLine("패배했습니다!");
                    break;
                }
            }
        }
        static void EnterField(ref Player player)
        {
            Console.WriteLine("필드에 접속했습니다!");

            Monster monster;
            CreateRandomMonster(out monster);

            Console.WriteLine("[1] 전투 모드로 돌입");
            Console.WriteLine("[2] 일정 확률로 마을로 도망");

            string input = Console.ReadLine();

            if (input == "1")
            {
                Fight(ref player, ref monster);
            }
            else if (input == "2")
            {
                Random rand = new Random();
                int randValue = rand.Next(0, 101);

                if (randValue <= 33)
                {
                    Console.WriteLine("도망치는데 성공했습니다!");
                }
                else
                {
                    Fight(ref player, ref monster);
                }
            }
        }
        static void EnterGame(ref Player player)
        {
            while (true)
            {
                Console.WriteLine("마을에 접속했습니다.");
                Console.WriteLine("[1] 필드로 나가기");
                Console.WriteLine("[2] 로비로 돌아가기");

                string input = Console.ReadLine();

                switch (input)
                {
                    case "1":
                        EnterField(ref player);
                        break;
                    case "2":
                        return;
                }
            }
        }
        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 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;
            }
        }

        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;
            //    }
            //}
            while (true)
            {
                ClassType choice = ChooseClass();
                if (choice == ClassType.None)
                    continue;

                Player player;
                CreatePlayer(choice, out player);

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

                EnterGame(ref player);

            }
        }

    }
}

1️⃣ 프로그램 개요

✅ 주요 기능

  1. 플레이어 직업 선택 (기사, 궁수, 법사)
  2. 플레이어 능력치 설정 (체력, 공격력)
  3. 랜덤 몬스터 생성 (슬라임, 오크, 스켈레톤)
  4. 전투 시스템 (플레이어 vs 몬스터)
  5. 도망 기능 (33% 확률로 성공)

2️⃣ 코드 분석 (상세 설명)

📌 1) Fight 메서드 - 전투 시스템

        static void Fight(ref Player player, ref Monster monster)
        {
            while (true)
            {
                // 플레이어 공격
                monster.hp -= player.attack;
                if (monster.hp <= 0)
                {
                    Console.WriteLine("승리했습니다!");
                    Console.WriteLine($"남은 체력: {player.hp}");
                    break;
                }

                // 몬스터 반격
                player.hp -= monster.attack;
                if (player.hp <= 0)
                {
                    Console.WriteLine("패배했습니다!");
                    break;
                }
            }
        }

전투 흐름
1. 플레이어가 몬스터를 공격 → 몬스터 체력이 0 이하이면 승리.
2. 몬스터가 반격 → 플레이어 체력이 0 이하이면 패배.

ref를 사용한 이유

  • 참조 전달(Call by Reference)로 원본 playermonster 데이터를 직접 수정.
  • 사본을 만들지 않고, 메모리 사용 최적화.

📌 2) 도망 확률 설정

                Random rand = new Random();
                int randValue = rand.Next(0, 101);

                if (randValue <= 33)
                {
                    Console.WriteLine("도망치는데 성공했습니다!");
                }
                else
                {
                    Fight(ref player, ref monster);
                }

33% 확률로 도망 성공
실패 시 강제 전투


profile
李家네_공부방

0개의 댓글