2025.02.03 (월)

윤혜진·2025년 2월 3일
0

TIL

목록 보기
17/42

📍오늘의 학습 키워드

  • 텍스트 RPG 만들기 (1)

📍학습 내용

  • 텍스트 RPG 만들기 (1)

    • 아이템의 이름 길이에 따라 선들이 지저분해지는 게 보기 싫어서 SetCursorPosition를 통해 정렬시켜 주었다.
    • 코드:
      public void ShowItemList(bool IsBuyMode)
      {
          int top = Console.CursorTop;  //현재 커서의 y위치를 받아온다.
      
          //아이템 목록 출력
          for (int i = 0; i < Items.Length; i++)
          {
              //만약 아이템 구매로 진입했다면
              if (IsBuyMode)
              {
                  //숫자 표시
                  Console.SetCursorPosition(1, top);
                  Console.Write($"{i + 1}  ");
              }
              //아직 인벤토리라면
              else
              { 
                  //숫자 없음
                  Console.SetCursorPosition(4, top);
              }
      
              Console.Write(Items[i].Name);
      
              Console.SetCursorPosition(23, top);
              Console.Write("| 공격력 +{0}", Items[i].Power);
              Console.SetCursorPosition(35, top);
              Console.Write(" 방어력 +{0} ", Items[i].Defense);
                  
              Console.SetCursorPosition(46, top);
              Console.Write(" | ");
      
              Console.Write(Items[i].ItemInfo);
      
              Console.SetCursorPosition(103, top);
              Console.Write(" | ");
      
              if (Items[i].State != ItemState.HaveNot)
                  Console.WriteLine("구매완료");
              else
              {
                  Console.Write(Items[i].Gold);
                  Console.SetCursorPosition(111, top);
                  Console.WriteLine("G");
              }
      
              if ((i + 1) % 3 == 0) 
              {
                  top++;
              }
      
              top++;
      
          }
      
      }
    • 사실 현재 커서 위치를 받아오는 기능을 모르고 있었는데, 오늘 팀원분께서 알려주셨다.
      int x = Console.CursorLeft;
      int y = Console.CursorTop;

📍겪은 어려움

  • item 배열 초기화 오류

    • 67번째에서 오류가 났다길래 급하게 확인해 봤더니, item 배열에 값을 넣어주는 코드에서 오류가 나고 있었다.
    • 알고 보니 나는 Items = new Item[6];으로 초기화 과정이 끝난 줄 알았는데, 사실은 배열 선언 후에 만들어진 6개의 item 객체들도 하나씩 초기화 과정을 거쳐주어야 했다.
    • 해결: for문으로 item 객체들을 초기화시켜주니 문제없이 돌아감.
  • player의 hp값이 제대로 출력되지 않는 현상 발생

    • 추측: 회복된 HP의 값이 MaxHP를 넘어가면 MaxHP 값으로 초기화해주는 기능을 HP 프로퍼티에 넣어주면서, private타입의 hp 변수public 타입의 Hp 프로퍼티를 나눠주게 되었는데, 그 과정에서 이런 오류가 발생한 것 같음.
    • 설명한 코드의 모습은 아래와 같다:
      private float hp;
      public float Hp
      {
          get { return hp; }
          set
          {
              if (value + hp > MaxHP)
                  hp = MaxHP;
          }
      }
    • 해결: 생성자에서 프로퍼티 Hp값이 아닌 변수 hp값을 초기화해주자 정상적으로 출력되었다.
  • 인벤토리 목록에 있는 아이템을 장착하려는데 장착이 제대로 안되는 현상이 발생

    • 문제가 된 오류:
      • 인벤토리에서 장착/해제를 하려면 목록 옆의 숫자를 보고 원하는 아이템을 선택해야 하는데, 직금까지 내가 선택한 아이템이 아닌, 입력한 숫자값을 배열의 인덱스 값으로 가지고 있는 아이템이 선택되고 있었음.
      • 예를 들어, 내가 items[3], items[4], items[5]에 해당하는 아이템을 구매하고 인벤토리에 들어오면, 인벤토리에서는 내가 보유한 아이템 목록만 출력되므로 1번에 items[3], 2번에 items[4], 3번에 items[5]가 출력됨.
      • 이 상태에서 내가 3번을 입력하면, 3번 자리에 있는 items[5]가 선택되는 것이 아니라, 3번을 인덱스로 가지고 있는 items[3]이 선택되고 있었던 것.
    • 해결한 방식:
      • Item 클래스에 InventoryNum이라는 필드를 새로 만들고, 아이템을 판매/구매할 때마다 InventoryNum를 반복문으로 부여해 주는 메서드를 만들었다.
      • 그리고 for문을 items의 배열 크기만큼 돌리면서, items[i]가 소유한 InventoryNum 필드값과 유저가 입력한 값이 같으면 장착과 해제를 하게 만듦.
      • 내가 인벤토리 배열이나 리스트를 따로 만들었다면 다른 방법으로 해결할 수 있었겠지만, 이제 와서 구조를 바꾸면 시간이 너무 오래 걸릴 것 같아 현재 방식을 고수하며 해결할 수 있는 방식을 찾게 되었다.
      • 추후에 또 인벤토리를 만들게 된다면 그땐 꼭 리스트로 구현할 것… 배열 너무 피곤하다.

📍회고 및 반성

  • 내 게임이 어떤 식으로 돌아가게 될지 크게 생각을 안 하고 만들었더니 기능이 추가될수록 점점 버거워짐을 느낀다… (스노우볼 같은 느낌)
  • 특히 아이템 부분에서 설계 미스를 했다는 생각이 자주 드는데, 구현이 거의 끝나가는 지금에서야 아이템 리스트, 인벤토리 리스트, 장비 아이템 리스트를 따로 만들어서 구현했으면 어땠을까 하는 아쉬움이 듦.

0개의 댓글

관련 채용 정보