C# 문법 종합반 개인 과제 / 던전 게임 만들기 / 아이템 세팅 및 착용 / 오류발생

2023. 8. 21. 20:17C# 문법 종합반

- C# 콘솔을 통해 마을에서 장비를 구하는 게임을 텍스트로 구현한다.

- 상점의 아이템들 중 내가 원하는 장비를 선택해 착용한다.

- 장비는 객체나 구조체를 활용, 여러 데이터를 다루는 부분은 배열을 활용.

 

<제작 프로세스>

1. 기본 화면 세팅

2. 아이템 정보 세팅 (배열 활용)

3. 기본화면 중 인벤토리에 아이템 정보 기입 

4. 인벤토리를 통해 장비 장착 화면에서 아이템을 착용 및 해제할 수 있도록 적용

5. 추가 원하는 작업

 

 

2.

아이템 정보 세팅은 배열을 활용한다.

        static void GameDataSetting()  // 게임 데이터 세팅
        {
            // 캐릭터 정보 세팅
            player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);  // 플레이어 정보 초기화

            Item[] items = new Item[]  // 아이템 정보 배열 활용
            {
                 new Item("무쇠갑옷", "방어", 5),
                 new Item("낡은 검", "공격", 2),
                 new Item("가죽 샌들", "방어", 2),
                 new Item("금 목걸이", "체력", 5)
            };

            // 아이템을 플레이어의 인벤토리에 추가하세요
            player.Inventory.AddRange(items);

        }


        static void DisplayInventory()  // 인벤토리 표시
        {


            Console.Clear();

            Console.WriteLine("인벤토리");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[아이템 목록]");
            int itemIndex = 1;
            foreach (var item in player.Inventory)
            {
                Console.WriteLine($"{itemIndex}. {item.Name} | {item.Type} +{item.StatBonus}");
                itemIndex++;
            }
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요");
            Console.WriteLine("1. 장착 관리");
            Console.WriteLine("0. 나가기");

            int input = CheckValidInput(0, 1);  

            switch (input)
            {
                case 0:
                    DisplayGameIntro();  // 0을 입력하면 게임 인트로를 다시 보여주기
                    break;

                case 1:
                    InventorySetting();
                    break;
            }



        }

 

 

2. 장착 관리

위 아이템 인벤토리 코드에서 1.장착관리 를 선택하면 아래 로직에 따라 아이템을 장착/해제할 수 있다.

        static void InventorySetting()  // 장착관리 표시
        {
            Console.Clear();
            Console.WriteLine("장착 관리");
            Console.WriteLine("장착 혹은 장착 해제할 아이템의 숫자를 입력하세요.");
            Console.WriteLine();
            Console.WriteLine("[아이템 목록]");
            int itemIndex = 1;
            foreach (var item in player.Inventory)
            {
                string equippedText = item.IsEquipped ? "[장착중] " : "";
                Console.WriteLine($"{itemIndex}. {equippedText}{item.Name} | {item.Type} +{item.StatBonus}");
                itemIndex++;
            }
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요");
            Console.WriteLine("1. 장착");
            Console.WriteLine("2. 장착 해제");
            Console.WriteLine("0. 나가기");

            int input = CheckValidInput(0, 2);

            switch (input)
            {
                case 0:
                    DisplayInventory();
                    break;

                case 1:
                    EquipItem();
                    break;

                case 2:
                    UnequipItem();
                    break;
            }
        }






        static void EquipItem()
        {
            Console.WriteLine("장착할 아이템의 번호를 입력해주세요");
            int input = CheckValidInput(1, player.Inventory.Count);
            Item selected = player.Inventory[input - 1];

            // 이미 장착 중인 경우
            if (selected.IsEquipped)
            {
                Console.WriteLine($"{selected.Name}은 이미 장착 중입니다.");
                Console.ReadLine();
            }
            else
            {
                selected.Equip(player); // 아이템 장착
                Console.WriteLine($"{selected.Name}을(를) 장착하였습니다.");
                Console.ReadLine();
            }

            InventorySetting();
        }





        static void UnequipItem()
        {
            Console.WriteLine("장착 해제할 아이템의 번호를 입력해주세요");
            int input = CheckValidInput(1, player.Inventory.Count);
            Item selected = player.Inventory[input - 1];

            // 아직 장착되지 않은 경우
            if (!selected.IsEquipped)
            {
                Console.WriteLine($"{selected.Name}은 장착되어 있지 않습니다.");
                Console.ReadLine();
            }
            else
            {
                selected.Unequip(player); // 아이템 장착 해제
                Console.WriteLine($"{selected.Name}의 장착을 해제하였습니다.");
                Console.ReadLine();
            }

            InventorySetting();
        }

 

 

3. 아이템 정보 캐릭터에 적용

    public class Character  // 캐릭터 정보
    {
        public string Name { get; }
        public string Job { get; }
        public int Level { get; }
        public int Atk { get; set; } // setter를 추가하여 스탯 변경 가능하게
        public int Def { get; set; } // setter를 추가하여 스탯 변경 가능하게
        public int Hp { get; set; }  // setter를 추가하여 스탯 변경 가능하게
        public int Gold { get; }
        public List<Item> Inventory { get; } = new List<Item>(); // 인벤토리 추가


        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 Item
    {
        public string Name { get; }
        public string Type { get; }
        public int StatBonus { get; }
        public bool IsEquipped { get; set; } // 아이템 장착 상태 추가


        public Item(string name, string type, int statBonus)
        {
            Name = name;
            Type = type;
            StatBonus = statBonus;
            IsEquipped = false; // IsEquipped 속성 초기화

        }


        public void Equip(Character player)
        {
            if (Type == "공격")
            {
                player.Atk += StatBonus;
            }
            else if (Type == "방어")
            {
                player.Def += StatBonus;
            }
            else if (Type == "체력")
            {
                player.Hp += StatBonus;

                IsEquipped = true; // 아이템 장착 상태 변경

            }
        }


        public void Unequip(Character player)
        {
            if (Type == "공격")
            {
                player.Atk -= StatBonus;
            }
            else if (Type == "방어")
            {
                player.Def -= StatBonus;
            }
            else if (Type == "체력")
            {
                player.Hp -= StatBonus;

                IsEquipped = false; // 아이템 장착 상태 변경

            }

그런데 오류가 발생했다.

1~3은 장착 시 [장착중]이 나타나지 않고, 그에 따라 장착 해제도 되지 않는다...

1~3은 안되는데 4의 금목걸이는 잘 적용된다...

 

 

일단 이쯤 마무리하고 내일 이를 해결하려고 한다.