Unity3D/유니티 공부

[Unity 게임 개발을 위한 C# 공부 일지] TextRPG 기초 제작 - 몬스터 생성

상연 2021. 4. 5. 02:19

목차

    어제는 캐릭터 생성까지 다뤄봤다.

    이번에는 기본적인 몬스터 생성까지 해 봤는데

    몬스터 생성에 덧붙여 이것저것 추가를 좀 더 해봤다.

     

    1. MAX_HP , MAX_MP 추가
    기존에는 그냥 HP, MP만 있어 체력 및 내공의 회복이 불가하였던 점을 개선.

    2. ATT, DEF 추가
    플레이어의 스탯 및 장비를 기반으로 변경되는 스테이터스.
    추후 몬스터와의 전투시 사용

    3. 몬스터 추가
    여우, 토끼, 양아치 몬스터 추가.
    여우와 토끼의 기본 레벨 2
    양아치의 기본 레벨 4
    위의 몬스터들은 랜덤으로 기본레벨 보다 높거나 낮은 수준으로 등장한다.
    레벨에 따라 몬스터의 수준 및 경험치 또한 변경

    4. 새로운 필드 2가지 제작

    4-1. 집
    집은 플레이어의 휴식 공간이자 상태를 점검하는 장소
    휴식을 통해 체력 및 내공을 회복 할 수 있으며, 보유한 여분의 능력치를 부여 가능

    4-2. 숲 초입
    3에서 추가된 몬스터가 등장하는 사냥 필드.
    각 45%의 확률로 여우와 토끼가 등장하며, 10%의 확률로 양아치가 등장한다. 

     

    위의 부분이 추가된 부분이다.

    이래저래 간단하게 실습만 해본다는게 뭔가 재밌어서 자꾸 붙이다보니 코드가 IF 파티가 되어버렸다...

    근데 뭐 어쩔수... 없지!

    캐릭터 생성
    '집' 필드
    휴식 및 능력치 확인
    능력치 부여
    '숲 초입' 몬스터 생성

     

    내일은 이래저래 바빠서 코딩을 할 수 있을진 모르겠지만

    된다면 전투 + 경험치 획득에 따른 레벨업까지 구현 해 봐야겠다!

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TextRPG
    {
        class Program
        {
            enum Forest1_MonsterType
            {
                Fox = 0,
                Rabbit = 1,
                Bully = 2
            }
    
            struct Monster
            {
                // 몬스터 이름
                public string NAME;
                // 몬스터 레벨
                public int LV;
                // 몬스터 타입(0 : 동물형 , 1 : 인간형)
                public byte TYPE;
                // 몬스터 공격력
                public int ATT;
                // 몬스터 방어력
                public int DEF;
                // 몬스터 체력
                public int MAX_HP;
                public int HP;
                // 몬스터 내공
                public int MAX_MP;
                public int MP;
                // 몬스터 사망시 경험치
                public int EXP;
    
            }
    
            static Monster CreateMonster() {
    
                Random rand = new Random();
                int SpawnMonster = rand.Next(10001);
                Monster mon;
                switch (SpawnMonster / 4500)
                {
                    case (int)Forest1_MonsterType.Rabbit:
                        Console.WriteLine("야생의 토끼가 나타났다...!");
                        mon.NAME = "토끼";
                        mon.LV = 2 + rand.Next(-1, 2);
                        mon.TYPE = 0;
                        mon.ATT = 11 + (mon.LV * 2);
                        mon.DEF = 9 + (mon.LV * 2);
                        mon.MAX_HP = 70 + (rand.Next(11) * mon.LV);
                        mon.HP = mon.MAX_HP;
                        mon.MAX_MP = 0;
                        mon.MP = 0;
                        mon.EXP = 125 + (10 * mon.LV);
                        break;
    
                    case (int)Forest1_MonsterType.Bully:
                        Console.WriteLine("뭔가 허접해 보이는 양아치가 나타났다...!");
                        mon.NAME = "양아치";
                        mon.LV = 4 + rand.Next(-1, 2);
                        mon.TYPE = 1;
                        mon.ATT = 16 + (mon.LV * 2);
                        mon.DEF = 16 + (mon.LV * 2);
                        mon.MAX_HP = 150 + (rand.Next(11) * mon.LV);
                        mon.HP = mon.MAX_HP;
                        mon.MAX_MP = 0;
                        mon.MP = 0;
                        mon.EXP = 330 + (10 * mon.LV);
                        break;
                    
                    default:
                        Console.WriteLine("야생의 여우가 나타났다...!");
                        mon.NAME = "여우";
                        mon.LV = 2 + rand.Next(-1, 2);
                        mon.TYPE = 0;
                        mon.ATT = 8 + (mon.LV * 2);
                        mon.DEF = 13 + (mon.LV * 2);
                        mon.MAX_HP = 80 + (rand.Next(11) * mon.LV);
                        mon.HP = mon.MAX_HP;
                        mon.MAX_MP = 0;
                        mon.MP = 0;
                        mon.EXP = 130 + (10 * mon.LV);
                        break;
    
                }
                return mon;
            }
            struct Player
            {
                //플레이어 이름
                public string NAME;
                //플레이어 레벨
                public byte LV;
                //플레이어 체력
                public int MAX_HP;
                public int HP;
                // 플레이어 내공
                public int MAX_MP;
                public int MP;
                // 플레이어 근력
                public int STR;
                // 플레이어 민첩
                public int DEX;
                // 플레이어 오성(레벨 업 포인트로 부여 불가)
                public int INT;
                // 플레이어 행운(레벨 업 포인트로 부여 불가)
                public int LUK;
                // 플레이어 공격력
                public int ATT;
                // 플레이어 방어력
                public int DEF;
                // 추가 능력치
                public int STAT;
                // 레벨업 필요 경험치
                public int EXP;
    
            }
    
            static void ShowStatus(ref Player user)
            {
                Console.WriteLine("-----------------------------");
                Console.WriteLine("* 이름 : " + user.NAME);
                Console.WriteLine("* 레벨 : " + user.LV);
                Console.WriteLine("* 체력 : " + user.HP + "/" + user.MAX_HP);
                Console.WriteLine("* 내공 : " + user.MP + "/" + user.MAX_MP);
                Console.WriteLine("* 근력 : " + user.STR);
                Console.WriteLine("* 민첩 : " + user.DEX);
                Console.WriteLine("* 오성 : " + user.INT);
                Console.WriteLine("* 행운 : " + user.LUK);
                Console.WriteLine("* 잔여 능력치 : " + user.STAT);
                Console.WriteLine("* 다음 레벨 필요 경험치 : " + user.EXP);
                Console.WriteLine("-----------------------------\n");
                if (user.STAT > 0)
                {
                    Console.WriteLine("*능력치를 부여 할 수 있습니다*");
                    Console.WriteLine("[1]. 능력치부여");
    
                    // sel1 능력치 부여 선택
                    string sel1 = "0";
                    // sel2 능력치 부여 종료 선택
                    string sel2 = "0";
                    // sel3 능력치 투자 선택
                    int sel3 = 0;
    
                    sel1 = Console.ReadLine();
                    if (sel1 == "1")
                    {
                        while (sel2 == "0")
                        {
                            Console.WriteLine("현재 " + user.STAT + "개의 능력치가 있습니다.");
    
                            int Plus_Status;
                            do
                            {
                                Console.WriteLine("얼마나 투자하시겠습니까?");
                                Plus_Status = int.Parse(Console.ReadLine());
                            } while (Plus_Status <= 0 || Plus_Status > user.STAT);
    
    
                            Console.WriteLine(Plus_Status + "개의 능력치를 어디에 추가하시겠습니까?");
                            Console.WriteLine("[1]. 근력에 추가");
                            Console.WriteLine("[2]. 민첩에 추가");
                            Console.WriteLine("[3]. 체력에 추가");
                            Console.WriteLine("[4]. 내공에 추가");
                            Console.WriteLine("[-]. 다시");
    
                            sel3 = int.Parse(Console.ReadLine());
    
                            switch (sel3)
                            {
                                case 1:
                                    user.STR += Plus_Status;
                                    user.STAT -= Plus_Status;
                                    break;
                                case 2:
                                    user.DEX += Plus_Status;
                                    user.STAT -= Plus_Status;
                                    break;
                                case 3:
                                    user.MAX_HP += Plus_Status;
                                    user.STAT -= Plus_Status;
                                    break;
                                case 4:
                                    user.MAX_MP += Plus_Status;
                                    user.STAT -= Plus_Status;
                                    break;
                                default:
                                    Console.WriteLine("잘못된 입력. 능력치 부여로 돌아갑니다.");
                                    break;
                            }
                            Console.WriteLine("능력치 부여를 그만하시겠습니까?");
                            Console.WriteLine("[1]. 네");
                            Console.WriteLine("[2]. 아니요 (계속)"); ;
    
                            int sel4 = int.Parse(Console.ReadLine());
    
                            while (sel4 != 1 && sel4 != 2)
                            {
                                Console.WriteLine("다시 입력해주세요...");
                                sel4 = Console.Read();
                            }
    
                            if (sel4 == 1)
                                break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("상태창을 종료합니다.");
                    }
                }
            }
    
            static Player CreatePlayer()
            {
                Random rand = new Random();
                Boolean end_sig = false;
                byte cnt = 4;
    
                Player user;
                Console.WriteLine("무협 온라인에 온 것을 환영합니다.");
                
                Console.WriteLine("당신의 이름은?");
                user.NAME = Console.ReadLine();
    
                Console.Write(user.NAME);
                Console.WriteLine("... 좋은 이름이네요.\n 당신의 육체를 구성합니다...");
                user.STAT = 0;
                user.EXP = 1000;
    
                do
                {
                    user.LV = 1;
                    user.MAX_HP = 100 + rand.Next(-50, 51);
                    user.HP = user.MAX_HP;
                    user.MAX_MP = 100 + rand.Next(-50, 51);
                    user.MP = user.MAX_MP;
                    user.STR = 10 + rand.Next(-5, 6);
                    user.DEX = 10 + rand.Next(-5, 6);
                    user.INT = 10 + rand.Next(-9, 10);
                    user.LUK = 10 + rand.Next(-10, 11);
                    user.ATT = 10 + user.STR;
                    user.DEF = 0;
    
                    Console.WriteLine("완료되었습니다.\n 당신의 육체는 아래와 같습니다...");
                    ShowStatus(ref user);
                    while (cnt > 0)
                    {
                        Console.WriteLine(cnt + "번의 재구성 기회가 남아있습니다. \n[1]. 이대로 하겠습니다.\n[2]. 뭐야, 내 육체 돌려줘요");
                        string temp = Console.ReadLine();
                        if(temp == "1")
                        {
                            end_sig = true;
                            break;
                        }
                        else if(temp == "2")
                        {
                            break;
                        }
                        else
                        {
                            Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.");
                        }
                    }
                    
                } while (end_sig == false && cnt-- > 0);
    
                user.STAT = 10;
                Console.WriteLine("육체 구성이 완료되었습니다... 게임을 시작합니다.");
    
    
                return user;
            }
            static void PlayerHome(ref Player user)
            {
                Console.WriteLine("----------------집----------------");
                Console.WriteLine("|깔끔하게 정돈되어 있는 방이다...|");
                Console.WriteLine("|무엇을 하시겠습니까?            |");
                Console.WriteLine("|[1]. 휴식 (체력/내공 전회복)    |");
                Console.WriteLine("|[2]. 이동 (숲 초입)             |");
                Console.WriteLine("|[3]. 상태창 확인                |");
                Console.WriteLine("----------------------------------");
    
                string sel = "0";
                while(sel == "0")
                {
                    sel = Console.ReadLine();
                    if(sel == "1")
                    {
                        user.HP = user.MAX_HP;
                        user.MP = user.MAX_MP;
                        Console.WriteLine("... 몸의 피로가 모두 회복되었다!");
                        PlayerHome(ref user);
                    }
                    else if(sel == "2")
                    {
                        Console.WriteLine("숲 초입으로 이동합니다...");
                        Forest1(ref user);
                        break;
                    }
                    else if (sel == "3")
                    {
                        ShowStatus(ref user);
                        PlayerHome(ref user);
                        break;
                    }
                    Console.WriteLine("잘못된 입력입니다.");
                }
    
            }
    
            static void Forest1(ref Player user)
            {
                Console.WriteLine("--------------숲 초입--------------");
                Console.WriteLine("|곳곳에 여우와 토끼가 보인다...   |");
                Console.WriteLine("|가끔 양아치가 나타난다고 한다... |");
                Console.WriteLine("|[1]. 사냥하기                    |");
                Console.WriteLine("|[2]. 이동(집)                    |");
                Console.WriteLine("----------------------------------|");
    
                int sel = 0;
    
                while (sel == 0)
                {
                    sel = int.Parse(Console.ReadLine());
                    if (sel == 1)
                    {
                        Monster mon = CreateMonster();
                        Forest1(ref user);
    
                    }
                    else if (sel == 2)
                    {
                        Console.WriteLine("집으로 이동합니다...");
                        PlayerHome(ref user);
                        break;
                    }
                    Console.WriteLine("잘못된 입력입니다.");
                }
                Forest1(ref user);
    
    
                
    
            }
            static void Main(string[] args)
            {
                //캐릭터 생성
                Player User = CreatePlayer();
                PlayerHome(ref User);
    
            }
        }
    }
    

    TextRPG.exe
    0.01MB