📍오늘의 학습 키워드

  • 텍스트 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 필드값과 유저가 입력한 값이 같으면 장착과 해제를 하게 만듦.
      • 내가 인벤토리 배열이나 리스트를 따로 만들었다면 다른 방법으로 해결할 수 있었겠지만, 이제 와서 구조를 바꾸면 시간이 너무 오래 걸릴 것 같아 현재 방식을 고수하며 해결할 수 있는 방식을 찾게 되었다.
      • 추후에 또 인벤토리를 만들게 된다면 그땐 꼭 리스트로 구현할 것… 배열 너무 피곤하다.

📍회고 및 반성

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

1개의 댓글

comment-user-thumbnail
2025년 4월 10일

아이템 목록을 처음 넣어보는거였으니까 그럴 수 있다고 생각해요.
다음부터 잘 적용하면 되지요. 고생하셨습니당.

답글 달기