김김김의 게임개발
  • C# #10 TextRPG 2
    2023년 08월 20일 23시 21분 30초에 업로드 된 글입니다.
    작성자: noun06

    변경점

    • 사용자 입력 처리를 개선하였다. 입력값 검사 메서드는 유효한 입력값의 범위를 두 매개변수를 통해 외부에서 지정할 수있다. 게임 내에서는 정수형 입력값만을 받기 때문에 사용자가 실제 입력한 값을 정수로 변환한다. 그리고, 입력된 문자열이 정수로 변환되면, 프로그램은 이 숫자를 사용하여 조건문을 실행한다. 입력값이 정수로 변환될 수 있는지를 확인하고 변환이 가능한 경우에만 유효한 입력으로 판단한다. 또한, 매개변수에서 지정한 범위 내에서의 정수만 유효한 입력으로 판단한다.
    • 아이템 정보와 장착 시스템을 관리하는 인벤토리 클래스를 만들었다. 아이템들을 저장하는 문자열 리스트 items와 아이템 장착 상태를 저장하는 bool 리스트 equip을 선언하였고 값을 추가하였다. 아이템을 출력하는 루프마다 equip 리스트 equippedSign은 해당 아이템이 장착되어 있는 경우 [E]를  할당받는다. ChageEquip 메서드에서는 특정 인덱스의 아이템의 장착 상태를 변경한다. 장착 관리 창에서 호출되며 장착 상태를 변경하는 경우 장착 상태에 따라 새로 업데이트된 창을 표시한다. 

     

    문제점과 계획

    • 다음 단계인 장착 상태에 따라 캐릭터 스탯 수치 변화를 하려면, 인벤토리 클래스의 수정작업이 필요할 것 같다. 사실, 인벤토리 클래스의 내용들을 따로 저장하는 것도 중요하지만 각 아이템마다의 정보들(효과 증가 수치, 설명 등)을 새로운 클래스에서 저장하여야한다. 그리고 이 정보들은  캐릭터 클래스처럼 생성자를 통해 외부에서 지정할 수 있도록해야할 것이다. 특히, 추가 수치를 변수로 두어 캐릭터 클래스에서 이 추가 수치를 장착 상태에 따라 더하고 빼주는 메서드를 만들어야 한다.  

     

    코드

    internal class GameManager
    {
        private static Character player; //캐릭터 객체
        private static Inventory inventory; //인벤토리 객체
    
        static void Main(string[] args)
        {
            GameDataSetting(); //게임 데이터 세팅
            DisplayGameIntro(); //게임 인트로 표시
        }
    
        static void GameDataSetting()
        {
            // 캐릭터 정보 세팅
            player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);
            
            // 아이템 정보 세팅
            inventory = new Inventory();
    
        }
    
        //게임 인트로 창 표시
        static void DisplayGameIntro()
        {
            Console.Clear();
    
            Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.");
            Console.WriteLine("이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("1.상태보기");
            Console.WriteLine("2.인벤토리");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");
            Console.Write(">> ");
    
            int input = CheckValidInput(1, 2);
            switch (input)
            {
                case 1:
                    DisplayMyInfo();
                    break;
    
                case 2:
                    DisplayInventory();
                    break;
            }
        }
    
        //상태보기 창 표시
        static void DisplayMyInfo()
        {
            Console.Clear();
    
            Console.WriteLine("상태보기");
            Console.WriteLine("캐릭터의 정보를 표시합니다.");
            Console.WriteLine();
            Console.WriteLine($"Lv.{player.Level}");
            Console.WriteLine($"{player.Name}({player.Job})");
            Console.WriteLine($"공격력 :{player.Atk}");
            Console.WriteLine($"방어력 : {player.Def}");
            Console.WriteLine($"체력 : {player.Hp}");
            Console.WriteLine($"Gold : {player.Gold} G");
            Console.WriteLine();
            Console.WriteLine("0.나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");
            Console.Write(">> ");
    
            int input = CheckValidInput(0, 0);
            switch (input)
            {
                case 0:
                    DisplayGameIntro();
                    break;
            }
        }
    
        //인벤토리 창 표시
        static void DisplayInventory()
        {
            Console.Clear();
    
            Console.WriteLine("인벤토리");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
    
            inventory.DisplayItems();
    
            Console.WriteLine("1.장착 관리");
            Console.WriteLine("0.나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");
            Console.Write(">> ");
    
            int input = CheckValidInput(0, 1);
            switch (input)
            {
                case 0:
                    DisplayGameIntro();
                    break;
    
                case 1:
                    DisplayEquipInventory();
                    break;
            }
        }
    
        //장착 관리 창 표시
        static void DisplayEquipInventory()
        {
            Console.Clear();
    
            Console.WriteLine("인벤토리 - 장착 관리");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
    
            inventory.DisplayItemsEquip();
    
            Console.WriteLine("0.나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");
            Console.Write(">> ");
    
            int input = CheckValidInput(0, inventory.items.Count);
            if (input == 0)
            {
                DisplayInventory();
                return;
            }
    
            inventory.ChangeEquip(input - 1); // 장착 상태 변경
            DisplayEquipInventory(); // 장착 상태에 따라 새로 업데이트된 창 표시
        }
    
        //입력값 검사 메서드, min과 max는 유효한 입력값의 범위
        static int CheckValidInput(int min, int max)
        {
            while (true)
            {
                string input = Console.ReadLine();
    
                //string 변수인 input을 int형으로 변환하려고 시도, 성공시, 변환된 int값을 ret에 할당.
                bool parseSuccess = int.TryParse(input, out var ret);
                
                //지정된 범위 내에 변환된 int값(ret)이 있는지 확인 후, 반환
                if (parseSuccess)
                {
                    if (ret >= min && ret <= max)
                        return ret;
                }
    
                //입력이 정수가 아니거나 범위를 벗어난 경우 실행
                Console.WriteLine("잘못된 입력입니다.\n");
                Console.WriteLine("원하시는 행동을 입력해주세요.");
                Console.Write(">> ");
            }
        }
    }
    
    
    public class Character
    {
        public string Name { get; }
        public string Job { get; }
        public int Level { get; }
        public int Atk { get; }
        public int Def { get; }
        public int Hp { get; }
        public int Gold { get; }
    
        public Character(string name, string job, int level, int atk, int def, int hp, int gold)
        {
            Name = name;
            Job = job;
            Level = level;
            Atk = atk;
            Def = def;
            Hp = hp;
            Gold = gold;
        }
    }
    
    
    
    public class Inventory
    {
        public List<string> items; // 아이템 리스트
        private List<bool> equip; // 아이템 장착 상태 리스트
    
        public Inventory()
        {
            items = new List<string>();
            items.Add("검 | 공격력 +2 | 그냥 검이다.");
            items.Add("갑옷 | 방어력 +5 | 그냥 갑옷이다");
    
            equip = new List<bool>();
            equip.Add(false);
            equip.Add(false);
        }
    
        //인벤토리 아이템 리스트 출력
        public void DisplayItems()
        {
            Console.WriteLine("[아이템 목록]");
            for (int i = 0; i < items.Count; i++)
            {
                string equippedSign = equip[i] ? "[E]" : "";
                Console.WriteLine($"- {equippedSign}{items[i]}");
            }
    
            Console.WriteLine();
        }
    
        //인벤토리-장착관리 아이템 리스트 출력, 위 메서드에서 번호만 추가한 버전
        public void DisplayItemsEquip()
        {
            Console.WriteLine("[아이템 목록]");
            for (int i = 0; i < items.Count; i++)
            {
                string equippedSign = equip[i] ? "[E]" : "";
                Console.WriteLine($"- {i + 1}.{equippedSign}{items[i]}");
            }
    
            Console.WriteLine();
        }
    
        //특정 인덱스의 아이템의 장착 상태 변경
        public void ChangeEquip(int index)
        {
            equip[index] = !equip[index];
        }
    }

     

     

    'C#' 카테고리의 다른 글

    C# #12 TextRPG 4  (0) 2023.08.22
    C# #11 TextRPG 3  (0) 2023.08.21
    C# #9 알고리즘 기초 2  (0) 2023.08.19
    C# #8 TextRPG 1  (0) 2023.08.18
    C# #7 스네이크 게임  (1) 2023.08.18
    댓글