TIL

25.02.03 TIL

gaon99 2025. 2. 3. 20:41

부트캠프 8일차

1. 오늘 학습 키워드

TRPG 프로젝트


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

오늘은 좀 편하게 작성할 예정이다.

 

우선 Lobby와 setup 메서드가 포함되어있던 Program 클래스를 메인 함수만 사용할 수 있도록 분리했다.

    internal class Program
    {
        static void Main(string[] args)
        {
            Setup setup = new Setup();
            Player player = new Player();
            Store store = new Store();
            setup._Setup(player);
            Lobby._Lobby(player);
        }
    }

Setup Class

class Setup
{
    bool IsSelected = false;
    public void _Setup(Player player)
    {
        Console.WriteLine("원하시는 캐릭터의 이름을 입력해주세요");
        string name = Console.ReadLine();
        player.Name = name;
        Console.Clear();
        while (!IsSelected)
        {
            Console.WriteLine("원하시는 직업을 선택해주세요\n");
            Console.WriteLine("1. 전사\n2. 마법사\n3. 궁수\n4. 도적");
            string choice = Console.ReadLine();
            if (int.TryParse(choice, out int Value) && Enum.IsDefined(typeof(Classes), Value))
            {
                Classes classes = (Classes)Value;
                player.Class = classes.ToString();
                IsSelected = true;
                //생략
            }
        }
    }
}

 Setup에서 변화한 부분만 가져왔다.

직업 선택을 다른 문자를 입력해도 다음 화면으로 넘어가는 이슈를 발견했고,

이를 해결하기 위해, bool을 사용해 if(!IsSelected) 이기에 False 로 초기화한 IsSelected가 While 반복문을 타고
조건문을 통해, 해당 enum에 들어가는 문자일 경우, 조건문을 타서, IsSelected를 true로 변환하며

반복문을 다시 못타게 설정했다.


 

⊙Lobby Class

    static class Lobby
    {
        public static void _Lobby(Player player)
        {
            Window window = new Window(player);
        }
    }

로비도 바꾼 부분만 가져왔다.

우선 Lobby는 자주 사용할 클래스 일것같아서, static을 붙여 클래스를 만들었다.

그리고 매개 변수를 통해 화면이 전환이 되더라도, player를 계속 유지하도록 했다.


⊙Window Class

 class Window
 {
     public Player player;
     public Store store;

     public Window(Player player)
     {
         this.player = player;
         this.store = new Store();
     }
     
     public void ShowStatus()
     {
         player.Display_Status();
     }
     
     public void ShowInventory()
     {
         player.Display_Inventory();

     }
     
     public void ShowStore(Player player)
     {
         store.Show_Store(player);
     }
 }

Window Class는 Status, Inventory, Store의 창을 로드하는 클래스로 만들었다


⊙Player Class

class Player
{
    public string Name { get; set; }
    public string Class { get; set; }
    public int Level { get; private set; } = 1;
    public int Stat_Offense { get; private set; } = 10;
    public int Stat_Defense { get; private set; } = 5;
    public float HP { get; private set; } = 100;
    public int Gold { get; set; } = 1500;
    public Inventory Inventory { get; set; } = new Inventory();
    
    public void Display_Status()
    {
        while (true)
        {
            Console.Clear();
            Console.WriteLine("상태 보기");
            Console.WriteLine("캐릭터의 정보가 표시됩니다.\n");
            Console.WriteLine("Lv. " + Level);
            Console.WriteLine(Name + " " + Class);
            Console.WriteLine("공격력 : " + Stat_Offense);
            Console.WriteLine("방어력 : " + Stat_Defense);
            Console.WriteLine("체 력 : " + HP);
            Console.WriteLine("Gold : " + Gold + "\n");
            Console.WriteLine("0. 나가기\n");
            Console.Write("원하시는 행동을 입력해주세요.\n>> ");
            string Choice = Console.ReadLine();
            if (Choice == "0")
            {
                break;
            }
            else
            {
                Console.WriteLine("잘못된 값을 입력했습니다");
            }
        }
        Lobby._Lobby(this);
    }
    
    public void Display_Inventory()
    {
        Console.WriteLine("인벤토리");
        Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
        Console.WriteLine("[아이템 목록]\n");
        Inventory.Display();
        Console.WriteLine("1. 장착 관리");
        Console.WriteLine("0. 나가기");
        Console.Write("원하시는 행동을 입력해주세요.\n>> ");
        string choice = Console.ReadLine();
        if (choice == "0")
        {
            Lobby._Lobby(this);
        }
        else if (choice == "1")
        {
            Inventory.Manage_Equip();
        }
    }
}

 우선 코드 상단에 플레이어가 가질 능력치를 먼저 선언했다.

그리고 능력치와 인벤토리를 볼 수 있도록 하는 메서드들도 만들어서 Player에서 관리했다.

그리고 모든 작업이 끝나고 0을 선택할시에 로비로 다시 돌아가도록 했다.


⊙Inventory Class

class Inventory
{
    private List<Item> items = new List<Item>();

    public void Add_Item(Item item)
    {
        items.Add(item);
    }

    public void Display()
    {
        if (items.Count == 0)
        {
            Console.WriteLine();
        }
        else
        {
            for (int i = 0; i < items.Count; i++)
            {
                Console.WriteLine($" - {i + 1}. {items[i].Item_Name} : {items[i].Item_Info}");
            }
        }
    }
}

 Add_item을 통해 인벤토리에 아이템을 넣고, for 반복문을 통해 현재 가진 아이템을 표시할 수 있도록 작성했다.

Inventory에는 장착관리와 추가 기능으로 던전을 넣을시, 랜덤 확률로 아이템 드랍도 고민중이기에, 아직 미완 상태이다.

그리고 추가적으로 아이템 구매 혹은 획득 시, 능력치 증가도 추가해야한다.


⊙Store Class

 class Store
 {
     private List<Item> Store_Items = new List<Item>()
 {
     new Item { Item_Name = "수련자 갑옷", Stat_Defense = 5, Item_Info = "수련에 도움을 주는 갑옷입니다.", Price = 1000, IsPurchased = false,IsArmor = true, IsUsable=false },
     new Item { Item_Name = "무쇠갑옷",Stat_Defense = 9, Item_Info = "무쇠로 만들어져 튼튼한 갑옷입니다.", Price = 2000, IsPurchased = false ,IsArmor = true, IsUsable=false },
     new Item { Item_Name = "스파르타의 갑옷", Stat_Defense = 15, Item_Info = "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.", Price = 3500, IsPurchased = false ,IsArmor = true, IsUsable = false},
     new Item { Item_Name = "낡은 검", Stat_Offense = 2, Item_Info = "쉽게 볼 수 있는 낡은 검입니다.", Price = 600, IsPurchased = false ,IsArmor = false, IsUsable=false },
     new Item { Item_Name = "청동 도끼", Stat_Offense = 5, Item_Info = "어디선가 사용됐던 도끼입니다.", Price = 1500, IsPurchased = false ,IsArmor = false, IsUsable=false },
     new Item { Item_Name = "스파르타의 창", Stat_Offense = 7, Item_Info = "스파르타의 전사들이 사용했다는 전설의 창입니다.\t", Price = 2500, IsPurchased = false,IsArmor = false, IsUsable=false }
 };
     public void Show_Store(Player player)
     {
         while (true)
         {
             Console.Clear();
             Console.WriteLine("상점에 오신 것을 환영합니다!");
             Console.WriteLine($"[보유 골드] {player.Gold} G\n");
             Console.WriteLine("[아이템 목록]");

             for (int i = 0; i < Store_Items.Count; i++)
             {
                 var item = Store_Items[i];
                 string _Purchase = item.IsPurchased ? "구매 완료" : $"{item.Price}";
                 if(item.IsArmor)
                 Console.WriteLine($"{i + 1}. {item.Item_Name} | 방어력 {item.Stat_Defense} | {item.Item_Info} | {_Purchase}");
                 else
                 Console.WriteLine($"{i + 1}. {item.Item_Name} | 공격력 {item.Stat_Offense} | {item.Item_Info} | {_Purchase}");
             }

             Console.WriteLine("\n1. 아이템 구매");
             Console.WriteLine("0. 나가기");

             Console.Write("원하시는 행동을 입력해주세요.\n>> ");
             string choice = Console.ReadLine();

             if (choice == "1")
             {
                 Buy_Item(player);
             }
             else if (choice == "0")
             {
                 Lobby._Lobby(player);
             }

             else
             {
                 Console.WriteLine("잘못된 선택입니다.");
             }
         }
     }
     private void Buy_Item(Player player)
     {
         Console.Write("구매할 아이템 번호를 선택해주세요.\n>> ");
         string Selection = Console.ReadLine();
         if (int.TryParse(Selection, out int index) && index > 0 && index <= Store_Items.Count)
         {
             Item selectedItem = Store_Items[index - 1];
             if (selectedItem.IsPurchased)
             {
                 Console.WriteLine("이미 구매한 아이템입니다.");
                 Console.WriteLine("아무 키를 눌려 계속");
                 Console.ReadKey();
             }
             else if (player.Gold >= selectedItem.Price)
             {
                 player.Gold -= selectedItem.Price;
                 player.Inventory.Add_Item(selectedItem);
                 selectedItem.IsPurchased = true;
                 Console.WriteLine($"{selectedItem.Item_Name}을(를) 구매했습니다.");
                 Console.WriteLine("아무 키를 눌려 계속");
                 Console.ReadKey();
             }
             else
             {
                 Console.WriteLine("보유 중인 골드가 부족합니다.");
                 Console.WriteLine("아무 키를 눌려 계속");
                 Console.ReadKey();
             }
         }
         else
         {
             Console.WriteLine("잘못된 선택입니다.");
             Console.WriteLine("아무 키를 눌려 계속");
             Console.ReadKey();
         }
     }
 }

구매에 대한 기능만 구현하였고, List를 사용하여, Store에 item들을 추가하였다.

그리고 보유 골드에 따라 아이템 구매, 구매 시에 아이템 구매 완료 처리 등을 구현하였다.


3. 학습하며 겪었던 문제점 & 에러

Player 클래스가 계속 Null로 변해서, 매개 변수로 받은 로비가 작동을 안하는 오류가 있어서, 그 부분을 고치는데 시간을 많이 썼다.

클래스 내부에서 Lobby._lobby()를 사용하기위해 매개 변수로 player를 넣기 위해, Player player로 선언했고, 그 때문인지 계속 오류가 나서 Null이 되어버렸다,

이를 고친 방법은 그냥 단순하게, Player player를 통해 사용하는 것이 아니라, Lobby_lobby(this)로 매개 변수를 this를 사용해

그냥 해당 클래스를 사용하면 되는거였다...


4. 내일 학습 할 것은 무엇인지

구현하고 코딩을 작성하는데 조금 오래 걸리는 편이라고 생각한다.

추가 기능들을 전부 구현을 해야 내 실력이 금방 증가 하고, 학습 성취도가 높지만, 느리다,,

현재 필수 구현의 80-90프로는 한 상태이기에, 내일은 필수 구현 마무리에, 추가 구현으로 손을 뻗는 것을 목표로 잡고 계속 작업할 예정이다.

'TIL' 카테고리의 다른 글

25.02.05 TIL  (0) 2025.02.05
25.02.04 TIL  (0) 2025.02.04
인터페이스, TRPG 초안  (0) 2025.02.03
if(today == 25.01.27) for (int i = today; i<25.01.28;i++) Class TIL  (0) 2025.01.27
Unity Anim , Console.Write("Today is 25.01.24");  (0) 2025.01.25