내일배움캠프 10일차 TIL <C# TextRPG> 마무리 04/18

정광훈(Unity_9기)·2025년 4월 18일

TIL (Today I Learned)

목록 보기
22/110
post-thumbnail

If 조건문

● 오늘 있었던 일

<도전과제 - 아이템 장착 개선>을 하다 해결하지 못하고 마무리하게 되었다.

같은 타입의 아이템이 중복 착용이 안되게 하는 것이었는데

무기 또는 방어구를 착용하면 착용 중인 아이템 전체가 해제되는 현상이 발생했다.
(그 때 코드를 어떻게 작성했는지 기억이 안 남)

조건에 조건을 달거나 조건 안에 &&을 달아서 복잡해져서 보기가 좀 힘들었다.

결국 튜터님에게 찾아갔다.

알려주신대로 하고 그 자리에서 실행하려 했더니 예상치 못한 콘솔 창 버그(?) (콘솔 창 중간 쯤에 커서가 깜빡임)

바로 해결 못할 거 같아서 자리에서 해보겠다고 했는데 콘솔 창 고치고 실행했는데 제대로 작동되지 않았다.

시간이 없어서 급하게 제출하느라 해결하지 못하고 제출했다.

● 해결책 (알려주신 방법)

제출 이후에 혼자 고쳐보다가 코드 변형이 좀 많이 되어서 어떤 느낌인지만 설명함

    if (selectedItem.itemEquip == false) // 선택한 아이템 미장착 중인 경우
    {
        player.E(selectedItem); // 장착
        Message($"{selectedItem.itemName} 을(를) 장착했습니다.\n");
    }
    else // 선택한 아이템 장착 중인 경우
    {
        for (int i = 0; i < player.InvenItem.Count; i++) // 인벤토리 불러오기
        {
            if (player.InvenItem[i].itemEquip == false) // i번째 인벤 아이템이 미장착일 때
            {
                continue; // 다음 문장으로 이동
            }

            if (player.InvenItem[i].itemType == selectedItem.itemType) // 내가 선택한 아이템 타입과 i번째 인벤 아이템이 타입이 같을 경우
            {
                player.UnE(player.InvenItem[i]); // 기존에 장착한 아이템 해제
                player.E(selectedItem); // 장착하기 원하는 아이템
                Message($"{selectedItem.itemName} 을(를) 장착했습니다.\n");
                break;
            }
            else
            {
                player.UnE(selectedItem); // 장착 해제
                Message($"{selectedItem.itemName} 을(를) 해제했습니다.\n");
                break;
            }
        }
    }
}

(정상적으로 작동 하는 코드가 아님 / 어떤 느낌인지만 알기)

여기서 알려주신 부분은

            if (player.InvenItem[i].itemEquip == false) // i번째 인벤 아이템이 미장착일 때
            {
                continue; // 다음 문장으로 이동
            }

이 부분인데

필터 역할처럼 작동한다.

내가 선택한 아이템이 현재 장착 중이고

i번째 소지 아이템이 미장착인 경우에만 다음 반복문으로 이동하게 되어있다.
(ex. i = 0 반복문에서 continue 이후 바로 i = 1로 넘어간다.)

for문의 영향을 받아 계속 반복하여 인벤토리에 장착 중인 아이템만 남도록 조건이 설계된 것이다.

if문을 이런 식으로 쓸 수 있다는 것을 배운 하루였다.


23:15) 결국 해결했다.

            if (int.TryParse(input, out int input2)) // input2에 input의 값을 int형으로 변환
            {
                input2--; // 인덱스는 0부터 시작. 아이템 선택은 1부터 시작

                if (input != "0" && (input2 >= 0 && input2 < player.InvenItem.Count)) // input이 "0"이 아니고, 인덱스 [0] <= input2 <= [lnvenItem 개수]
                {
                    Item selectedItem = player.InvenItem[input2]; // 내가 가진 아이템을 selcetedItem에 저장

                    if (selectedItem.itemEquip == true) // 선택한 아이템 장착 중인 경우
                    {
                        player.UnE(selectedItem); // 장착 해제
                        Message($"{selectedItem.itemName} 을(를) 해제했습니다.\n");
                    }
                    else // 선택한 아이템 미장착 중인 경우
                    {
                        for (int i = 0; i < player.InvenItem.Count; i++) // 인벤토리 불러오기
                        {
                            if (player.InvenItem[i].itemType == selectedItem.itemType) // 내가 선택한 아이템 타입 == i번째 인벤 아이템이 타입
                            {
                                if (player.InvenItem[i].itemName != selectedItem.itemName) // 내가 선택한 아이템 이름 != i번째 인벤 아이템 이름
                                {
                                    player.UnE(player.InvenItem[i]); // 기존에 장착한 아이템 해제
                                    player.E(selectedItem); // 장착하기 원하는 아이템
                                    Message($"{selectedItem.itemName} 을(를) 장착했습니다.\n");
                                }
                            }
                            else
                            {
                                player.E(selectedItem); // 장착하기 원하는 아이템
                                Message($"{selectedItem.itemName} 을(를) 장착했습니다.\n");
                            }
                        }
                    }
                }

완성하고 보니 복잡하지 않아보이고 코드 내용이 오히려 쉬워보인다.

입력하는 과정은 동일하고 그 이후의 조건들을 수정해줬다.

if (player.InvenItem[i].itemType == selectedItem.itemType)

이 조건만 있으면 반복문에 의해 장착 출력이 2번씩 나오고 [1]번째 아이템을 장착하고 [0]번째 아이템도 장착이 가능하다. (반대로는 안 됨)

그래서 if (player.InvenItem[i].itemName != selectedItem.itemName)로 조건을 확실히 정리했다.

i번째 인벤 아이템 타입 == 현재 선택한 아이템 타입
i번째 인벤 아이템 이름 != 현재 선택한 아이템 이름

이렇게 조건을 만들면 내가 선택한 아이템을 제외한 현재 장착 중인 아이템만 남게 된다.

그 후 현재 장착 중인 아이템은 해제하고 선택한 아이템만 착용하게 만들어준다.

0개의 댓글