
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번째 인벤 아이템 이름 != 현재 선택한 아이템 이름
이렇게 조건을 만들면 내가 선택한 아이템을 제외한 현재 장착 중인 아이템만 남게 된다.
그 후 현재 장착 중인 아이템은 해제하고 선택한 아이템만 착용하게 만들어준다.