절차 지향 TextRPG1(강의복습,기능추가)

using System;

namespace TextRPG_
{
    enum GameOnOff
    {
        None = 0,
        On = 1,
        Off =2,
    }
    enum ClassType
    {
        None = 0,
        Knight  = 1,
        Archer = 2,
        Mage = 3,
    }
    
    enum MonsterType
    {
        None = 0,
        Slime = 1,
        Orc = 2,
        Skeleton = 3, 
    }
    struct Player
    {
        public int hp;
        public int attack;
    }
    struct Monster
    {
        public int hp;
        public int attack;
    }
    internal class Program
    {
        static ClassType ChooseClass() //클래스 선택
        {
            Console.WriteLine("직업을 선택하세요");
            Console.WriteLine("[1]기사");
            Console.WriteLine("[2]궁수");
            Console.WriteLine("[3]법사");
            ClassType choice = ClassType.None;
            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;
        }
        static void CreatePlayer(ClassType choice,out Player player) //클래스 정보
        {
            switch(choice)
            {
                case ClassType.Knight:
                    player.hp = 100;
                    player.attack = 20;
                    break;
                case ClassType.Archer:
                    player.hp = 80;
                    player.attack = 30;
                    break;
                case ClassType.Mage:
                    player.hp = 60;
                    player.attack = 40;
                    break;
                default:
                    player.hp = 0;
                    player.attack = 0;
                    break;
            }

        }
        static void EnterGame(ref Player player) //게임접속
        {
            Console.WriteLine("게임에 접속하셧습니다.");
            Console.WriteLine("[1]필드로 간다");
            Console.WriteLine("[2]로비로 돌아간다");

            string input = Console.ReadLine();
            switch(input)
            {
                case "1":
                    EnterField(ref player);
                    break;
                case "2":
                    return;
            }
        }

        static void CreateMonster(out Monster monster) //몬스터 소환
        {
            Random rand = new Random();
            int randomMonster = rand.Next(1, 4);
            switch(randomMonster)
            {
                case (int)MonsterType.Slime:
                    Console.WriteLine("슬라임이 소환되었습니다");
                    monster.hp = 50;
                    monster.attack = 15;
                    break;
                case (int)MonsterType.Orc:
                    Console.WriteLine("오크가 소환되었습니다");
                    monster.hp = 100;
                    monster.attack = 10;
                    break;
                case (int)MonsterType.Skeleton:
                    Console.WriteLine("스켈레톤이 소환되었습니다");
                    monster.hp = 80;
                    monster.attack = 20;
                    break;
                default:
                    monster.hp = 0;
                    monster.attack = 0;
                    break;
            }
        }
        static void EnterField(ref Player player) //필드접속
        {
            Console.WriteLine("필드에 접속하셨습니다");

            //몬스터 생성
            Monster monster;
            CreateMonster(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 randRun = rand.Next(0, 101);
                if(randRun <=33)
                {
                    Console.WriteLine("도망치는데 성공했습니다");
                    EnterField(ref player);
                }
                else
                {
                    Console.WriteLine("도망치는데 실패했습니다");
                    Fight(ref player, ref monster);
                }
            }
        }
        static void Fight(ref Player player, ref Monster monster) //플레이어전투,재시작
        {
            while (true)
            {
                Console.WriteLine($"Player 공격 {player.attack}");
                Console.WriteLine($"Monster HP = {monster.hp -= player.attack}\n");
                Console.WriteLine($"Monster 공격 {monster.attack}");
                Console.WriteLine($"Player HP = {player.hp -= monster.attack}\n");
                if(monster.hp <= 0)
                {
                    Console.WriteLine("Player가 승리하였습니다");
                    EnterField(ref player);
                    break;
                }
                else if(player.hp <= 0)
                {
                    Console.WriteLine("Player가 패배하였습니다 \n");
                    Console.WriteLine("재시작 하겠습니다? Y(1)/N(2)");
                    while (true)
                    {
                        int input = int.Parse(Console.ReadLine());
                         switch (input)
                         {
                            case 1:
                                return;
                            case 2:
                                Environment.Exit(0);
                                break;
                         }
                    }
                }
            }
        }
        static void Main(string[] args) //메인
        {
            while (true)
            {
                ClassType choice = ChooseClass();
                if (choice != ClassType.None)
                {
                    Player player;
                    CreatePlayer(choice,out player);
                    EnterGame(ref player);
                }
            }
        }
    }
}
채널톡 아이콘