ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.1.8
    TIL 2024. 1. 8. 20:38

    해설 강의를 보고 만든 코드들을 압축해서 만들어봤습니다.

    근데, 오류가 떠서 머가 문제인지 봐야하는데 시간이 부족해서 아직 다 확인은 못했습니다.

     


     

    class Item

    public int BonusAtk { get; set; }
    public int BonusDep { get; set; }
    public bool IsEqu { get; set; }
    public string IsType { get; set; }
    
    if (n < 5)
    {
        IsType = "Dep";
        BonusAtk = 0;
        if (nn < a)
        {
            Name = firstName[idx1] + secondName[idx1];
            int s = random.Next(1, 3);
            BonusDep = s;
            GoldInt = random.Next(1, 5) * 100;
            Gold = GoldInt.ToString() + "G";
        }
    }

    IsEqu는 착용했는지 안했는지 확인용.

    IsType은 같은 종류(방어구, 무기) 아이템을 동시에 착용하지 못하게 하기 위해서 설정.

    BonusAtk, BonusDep는 이전 stats과 동일한 것이지만 무기와 방어구로 나눈 것.

     

    MakeName, MakeStats, MakeGold를 합해서 Make 함수로 합침.

    ->MakeStats과 MakeGold는 name에 따라서 결정되기 때문에.

     

    class State에 있는 LV을 이용해서 스탯과 골드 값을 바꾸려고 했지만 Item에 getClass를 사용하지 않고 하는 방법으로 ItemList를 상속받아서 ItemList에 있는 ClassChain을 사용하려 했다.

    그러나 ItemList에서 getClass가 아닌 new ClassChain을 사용해야지 사용이 가능했다. 그래서 LV를 이용한 값 변환을 ItemList에서 하도록 바꿨다.

     

    class Inventory

    if (inventoryitem[i].IsEqu)
    {
        chain.itemlist.RemoveItem(i);
    }
    else
    {
        for (int j = 0; j < inventoryitem.Count; j++)
        {
            if (inventoryitem[j].IsEqu && inventoryitem[j].IsType == inventoryitem[i].IsType)
            {
                chain.itemlist.RemoveItem(j);
                break;
            }
        }
        chain.itemlist.InstallItem(i);
    }
    InventoryItemManage();

    IsEqu를 이용해서 true라면 착용한 상태이므로 착용해제를 해준다.

    RemoveItem에서는 IsEqu = false와 착용되어서 증가된 스탯을 감소시켜준다.

     

    for문 안에 if 조건은 IsEqu == true라고 해서 착용해제를 시켜서는 안된다. 같은 종류의 아이템일 경우에만 착용해제가 필요하기 때문에 IsType을 이용해서 같은 종류일 경우까지 확인해서 착용해제 시켜준다.

    같은 종류의 아이템이 착용되어 있다면 착용해제를, 착용되어있는게 없다면 InstallItem함수를 이용해서 선택한 아이템을 착용시켜준다.

     

    class ItemList

     public void PrintItemList(bool withNumber = false)
     {
         for (int i = 0; i < items.Length; i++)
         {
             Console.Write("- ");
             if (withNumber)
             {
                 int n = i + 1;
                 textColor.ChangeTextColorDarkMagenta(n);
             }
         }
     }

    숫자가 있는 버전과 숫자가 없는 버전의 함수 두개를 합해서 만들어진 함수.

    withNumber = false로 기본 설정해뒀기 때문에 숫자가 필요없을 경우 ()만 사용해주면 된다.

    숫자가 필요하면 (true) 해주면 된다.

     

    if (inventoryitems[i].IsEqu)
    {
        textColor.HighlightsTextColorYellow("[", "E", "]");
    }

    class ItemList에서 인벤토리에 있는 아이템을 출력하는 함수에서 IsEqu == true이면 [E]를 출력하게 했기 때문에 따로 아이템의 name을 변경해줄 필요가 없어서 더욱 간편해졌다.

     

    static int GetPrintableLength(string str)
    {
        int length = 0;
        foreach (char c in str)
        {
            if (char.GetUnicodeCategory(c) == System.Globalization.UnicodeCategory.OtherLetter)
            {
                length += 2;
            }
            else
            {
                length += 1;
            }
        }
        return length;
    }
    
    static string PadRightForMixedText(string str, int totalLength)
    {
        int currentLength = GetPrintableLength(str);
        int padding = totalLength - currentLength;
        return str.PadRight(str.Length + padding);
    }

    생성되어있는 아이템을 출력할 때 | 로 이름, 스탯, 골드, 설명을 나누는데, 전부 길이가 다르다 보니 일정하지 않게 출력된다. 일정하게 출력되기 위해서 설정해줬다.

     

    한글은 영어와 다르게 자리 크기를 2정도 사용하기 때문에 +2를 해준다.

    출력될 문자열의 크기를 구하고 원하는 크기에서 빼준다. 남은 값만큼 비워줘야하므로 출력될 문자열 + 남은 값을 해준다.

    출력하기 위해서는 Console.WriteLine()에 넣어야지 정상적으로 출력된다.

     


     

    던전이랑 체력회복은 아직 수정하지 않았습니다.

    우선 기본적인 부분을 완성해야 수정했을 때 어떤부분이 오류인지 알기 쉽기 때문에먼저 오류부터 수정하는게 중요할 것 같습니다.

     

    현재 확인된 오류는 상점에서 아이템을 구매했는데 인벤토리에 제대로 들어가지 않는다는게 문제입니다. name과 comment는 잘 들어가는데 스탯부분이 제대로 들어가질 않습니다. 좀 더 코드를 보면서 고쳐야할 것 같습니다.

    inventoryitem을 List<Item>으로 바꾼 것도 이유 중에 하나일 것이라고 예상해봅니다.

    'TIL' 카테고리의 다른 글

    2024.1.10  (1) 2024.01.10
    2024.1.9  (0) 2024.01.09
    2024.1.5  (0) 2024.01.05
    2023.1.4  (2) 2024.01.04
    2024.1.3  (1) 2024.01.03
Designed by Tistory.