TIL

25.02.04 TIL

gaon99 2025. 2. 4. 21:30

부트캠프 9일차

1. 오늘 학습 키워드

TRPG 프로젝트


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

 

오늘도 어제와 마찬가지로, Text RPG 개인 프로젝트를 하였다.

 

우선 직업마다의 세부 스텟을 설정했다.

 switch (classes)
 {
     case Classes.전사:
         player.HP = 100;
         player.Stat_Offense = 10;
         player.Stat_Defense = 5;
         break;
     case Classes.마법사:
         player.HP = 80;
         player.Stat_Offense = 15;
         player.Stat_Defense = 3;
         break;
     case Classes.궁수:
         player.HP = 90;
         player.Stat_Offense = 13;
         player.Stat_Defense = 4;
         break;
     case Classes.도적:
         player.HP = 95;
         player.Stat_Offense = 12;
         player.Stat_Defense = 4;
         break;
 }

 

그리고 마찬가지로 window 클래스를 통해, Dungeon과 Rest 창을 띄우게 했다.

 class Window
 {
     public Player player;
     public Store store;
     public Dungeon dungeon;
     Rest rest = new Rest();
     
        public void ShowDungeon()
        {

        }
        public void ShowRest(Player player)
        {
            rest.Display_Rest(player);
        }
    }

 

 

Player Class는 아이템 장착 기능 구현 메서드를 추가했다.

무기와 방어구 둘다 Item Class에 있는 bool 인 IsEquipped을 사용해서, true 일 경우에는 장착중이기에, 해제를

else로 장착중이 아닐때, 아이템의 설정값에 따라 공격 아이템이라면 장착중인 공격 아이템 해제와 해당 아이템 장착 그리고 스탯 변화, 방어 아이템도 마찬가지로 구현했다.

    class Player
    {
        private Item EquippedWeapon { get; set; }
        private Item EquippedArmor { get; set; }
        
        public void EquipItem(Item item)
        {
            if (item == null) return;

            if (item.IsEquipped)
            {
                if (item == EquippedWeapon)
                {
                    item.IsEquipped = false;
                    Stat_Offense -= item.Stat_Offense;
                }
                else if (item == EquippedArmor)
                {
                    item.IsEquipped = false;
                    Stat_Defense -= item.Stat_Defense;
                }
            }
            else
            {
                if (item.Stat_Offense > 0)
                {
                    if (EquippedWeapon != null)
                    {
                        EquippedWeapon.IsEquipped = false;
                        Stat_Offense -= EquippedWeapon.Stat_Offense;
                    }
                    EquippedWeapon = item;
                    Stat_Offense += EquippedWeapon.Stat_Offense;
                }
                else if (item.Stat_Defense > 0)
                {
                    if (EquippedArmor != null)
                    {
                        EquippedArmor.IsEquipped = false;
                        Stat_Defense -= EquippedArmor.Stat_Defense;
                    }
                    EquippedArmor = item;
                    Stat_Defense += EquippedArmor.Stat_Defense;
            }
            item.IsEquipped = true;
        }
    }
}

 

Store Class

우선 판매 창을 만들어, 해당 아이템 가격의 80프로 가격으로 팔 수 있는 창을 만들었다.

public void Display_Sell(Player player)
{
    while (true)
    {
        Console.Clear();
        Console.WriteLine("상점 - 아이템 판매\n");
        Console.WriteLine("필요한 아이템을 얻을수 있는 상점입니다.\n");
        Console.WriteLine("[보유 골드]\n");
        Console.WriteLine("[아이템 목록]");
        Console.WriteLine($"{player.Gold} G\n");
        for (int i = 0; i < player.Inventory.items.Count; i++)
        {
            Console.WriteLine($"{i + 1}. {player.Inventory.items[i].Item_Name} - {player.Inventory.items[i].Price} G");
        }
        Console.WriteLine("\n0. 나가기");
        Console.Write("원하시는 행동을 입력해주세요.\n>> ");
        string choice = Console.ReadLine();
        if (int.TryParse(choice, out int index) && index > 0 && index <= player.Inventory.items.Count)
        {
            sell_item(player, choice);
        }
        else if (choice == "0")
        {
            Show_Store(player);
        }
        else
        {
            Console.WriteLine("잘못된 값을 입력했습니다.");
            Console.ReadKey();
        }
    }

 

아이템 판매에 관한 메서드 선택을 index로 받아, 판매를 했다.

코드는 구매 메서드를 조금 변화해서, 제작했다.

public void sell_item(Player player, string Selection)
{
    if (int.TryParse(Selection, out int index) && index > 0 && index <= player.Inventory.items.Count)
    {
        Item selectedItem = player.Inventory.items[index - 1];
        if(selectedItem.Stat_Defense > 0)
        {
            player.Stat_Defense -= selectedItem.Stat_Defense;
            selectedItem.IsEquipped = false;
        }
        else if(selectedItem.Stat_Offense>0)
        {
            player.Stat_Offense -= selectedItem.Stat_Offense;
            selectedItem.IsEquipped = false;
        }
        int Sell_Price = (int)(selectedItem.Price * 0.8);
        player.Gold += Sell_Price;
        player.Inventory.Remove_item(selectedItem);
        selectedItem.IsPurchased = false;
        Console.WriteLine("해당 아이템을 {0}G 에 판매하였습니다", Sell_Price);
        Console.WriteLine("아무 키를 눌려 계속");
        Console.ReadKey();

    }
}

 

 

Rest Class

 

Rest 클래스를 만들어, 500G로 휴식을 취할 경우, 플레이어의 체력을 풀로 회복시켜주는 메서드를 만들었다.

class Rest
{

    public void Display_Rest(Player player)
    {
        while (true)
        {
            Console.Clear();
            Console.WriteLine("휴식하기");
            Console.WriteLine("500 G 를 내면 체력을 회복할 수 있습니다.\n");
            Console.WriteLine("[보유 골드]");
            Console.WriteLine("{0} G\n", player.Gold);
            Console.WriteLine("1. 휴식하기");
            Console.WriteLine("0. 나가기\n");
            Console.Write("원하시는 행동을 입력해주세요.\n>> ");
            string Choice = Console.ReadLine();
            if (Choice == "0")
            {
                Lobby._Lobby(player);
            }
            else if (Choice == "1")
            {
                _Rest(player);
                Console.WriteLine("체력이 모두 회복되었습니다.");
                Console.WriteLine("아무 키를 눌려 계속");
                Console.ReadKey();
            }
        }
    }
    public void _Rest(Player player)
    {
        if (player.Gold >= 500)
        {

            switch (player.Class)
            {
                case "전사": player.HP = ((player.Level - 1) * 10) + 100; break;
                case "마법사": player.HP = ((player.Level - 1) * 10) + 80; break;
                case "궁수": player.HP = ((player.Level - 1) * 10) + 90; break;
                case "도적": player.HP = ((player.Level - 1) * 10) + 95; break;
            }
            player.Gold -= 500;
        }

        else
        {
            Console.WriteLine("보유 골드가 부족합니다.");
        }
    }
}

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

오늘의 작업은 어제만큼 에러가 많진 않았고, 크게 생각나는건

Rest Class의 인스턴스를 만드는데, 이를 메인에서 했었다. 근데, Rest Class는 메인을 거치지않기에,

객체가 생성이 되지않아, rest가 null이 되는 오류 정도였다.


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

내일은 제작한 프로젝트 제출 날 이기에, 최소한 던전까지는 작업을 하고,

이 클래스들을 좀 다른 스크립트로 좀 옮겨보고싶다.

이게 너무 많으니까.. 너무 지저분해보인다.

그리고 시간이 남으면 데이터 기록하는 것도 도전해보고싶다.

'TIL' 카테고리의 다른 글

25.02.06 TIL  (0) 2025.02.06
25.02.05 TIL  (0) 2025.02.05
25.02.03 TIL  (0) 2025.02.03
인터페이스, 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