오늘은 단시간에 가장 머리 아팠던 날이 아니었을까? 18:00시 제출 마감시간에 맞추어 아침부터 기능 구현을 위해 달려야 했다.
어제의 상태정보와 인벤토리 진입에 이어서
오늘 구현한 기능은 다음과 같다.
기본기능
1. 인벤토리 기본적 장착 관리 모드 (아이템 장착 / 해제 - 장착 표시 <- 이때는 중복 장착 가능)
1-2 플레이어 스텟에 장착 아이템 수치만큼 추가
2. 상점 구현 (아이템 구매 가능 - 구매한 물건은 가격을 구매 완료로 표시)
추가기능
1. 인벤토리 장착 관리 개선 (무기와 방어구 하나씩만 장비 가능, 새로 장비 시도 시에는 장비 중이던 장비 해제)
2. 상점 판매 기능 구현 (판매 가격 85%)
3. 아이템 추가 (재미용)
구현한 방법과 코드를 다 적어놓기에는 오늘 너무 피로하다 (ㅠㅠ)
어제처럼 기능 구현 장면과 어려웠던 부분 정도만 설명하면서 넘어가고자 한다
우선 상점 등 표현하며 텍스트량이 많아져서 화면 크기 늘리는 기능을 알아보았고 Console.SetWindowSize(105, 43);로 좀 늘려서 고정했다.
1. 인벤토리 관리 모드
어제 인벤토리 출력을 만들며 많은 부분 이를 위해 준비해둔 것이 많아 금방 할 줄 알았었다.
하지만 Input을 받는데 문제가 생겨 고민을 해야했다.
일단 itemEquipping()이라는 메소드에서 아이템의 장착과 해제를 담당하게 했다.
우선 관리 모드에 들어가면 원래 아이템 리스트와 달리 숫자를 띄워주어 그 번호를 입력하여 장착 해제를 관리해야 한다.
이 숫자를 띄워주는 부분은 어제 완성해뒀기에 이 숫자를 Input을 주는 Title.cs에서 추가로 입력할 수 있게 했어야 하는데
아이템 리스트의 숫자는 변동되므로 switch() case: 로 미리 입력 받는 내용을 만들어 두는데 문제가 생겼다.
그래서 여러 방법을 고민해 보다가 결국 구조를 바꾸기로 했다.
이런 추가적인 input이 필요하거나 리스트가 있는 곳에서는 if문으로 어제 쓰던 CheckInput()을 받는 방식으로 변경했다.
이런 식으로 바뀌었다. 해결되었다.
이전에 임시로 지정해둔 장비들 대신 다른 장비들을 장착한 모습
ownedItems라는 리스트에 캐릭터의 아이템들이 관리된다.
상태 창에서 추가 스탯이 있다면 AddAtk / AddDef가 출력 되도록 하고 아니면 빈칸이 들어가는 3항 연산자를 이용했다.
이런 식으로 추가 스텟이 있다면 뜨고
해제 시에는 뜨지 않는다.
2. 상점 추가
상점은 인벤토리 구현 방법과 비슷하게 구현했다.
상점의 아이템 리스트를 만들고 구매 모드는 장비 관리 모드를 구현 하는 방법과 유사하게 구현했다.
그리고 위와 같이 이미 구매한 상품, 돈이 부족한 상황, 구매했을 때 돈이 차감 되고 상점 아이템의 리스트에서 캐릭터의 리스트에 해당 아이템이 넘어가는 메소드를 만들어 Title에서 BuyingInput(장비 관리에 쓴 ManageInput과 같은 방식이다)을 받았다.
상점창 구동 화면
제대로 작동한다. 사실 저 '확인을 위해 아무 키나 눌러주세요'는 꼼수였는데 WriteLine()이 출력 되지만 while(true)로 인해 기능이 끝난 뒤 계속 초기화면으로 돌아가 출력을 볼 수 없었고 여기에 ReadLine()을 단순히 집어넣어 화면을 멈춰두기 위함이었다.
여기까지 기본 기능 구현을 마쳤고 이 시간이 15시~16시 사이였던 것으로 기억한다. 끝났다는 기쁨에 흥분되어 추가 기능들 중 금방 할 수 있을 것 같은 자신있는 부분들을 제출 직전까지 해보고자 하여 추가 기능 구현에 들어갔다.
추가 기능
1. 인벤토리 장착 관리 개선
이건 제시된 설명에 비해 구현하는데 어려움이 많았다.
- 각 타입별로 하나의 아이템만 장착가능 - ( 방어구 / 무기 )
- 방어구를 장착하면 기존 방어구가 있다면 해제하고 장착
- 무기를 장착하면 기존 무기가 있다면 해제하고 장착
이 부분은 해결하는데 기존 코드를 많이 수정해야 했다.
우선 각 타입 별로 구분해야 했고 나는 여기서 기존에 item마다 가지고 있는 iType ("공격력" or "방어력" string을 가지고 있다.)을 구분해 방어구와 무기를 구분할 수 있을 것 같았다.
그리고 여기서 장착 중인 아이템에 대한 정보가 있어야 장착이 되었는지 체크하고 해제할 수 있었다.
그렇기 때문에 아이템을 가지는 Character.cs에서 기존 생성자 목록에 장착 중이라는 의미의 Weapon과 Armour를 주고 null값을 넣어 두었다. 아이템을 장착하는 코드에다가 이 부분에 해당 아이템을 저장 시켜두고 새로 장착 시도 시에 이것과 비교하는 방법으로 구현에 성공했다.
이 부분은 코드가 조건문이 많아지며 많이 길어졌다. 분명 어떻게 간소화 할 수 있었겠지만 도저히 시간이 부족할 것 같아 이대로 넘어가야 했다. 내용이 길기에 접은 글에 적어둔다.
public void ItemEquipping(int EquipInput) //아이템 장착 해제 교체를 담당하는 메서드
{
var itemInfo = character.ownedItems[EquipInput - 1];
if (itemInfo.isEquipped == true)
{
// 장착 해제
if (itemInfo.iType == "공격력")
{
character.Weapon.isEquipped = false;
character.Weapon = null;
character.AddAtk -= itemInfo.iStat;
}
else if (itemInfo.iType == "방어력")
{
character.Armour.isEquipped = false;
character.Armour = null;
character.AddDef -= itemInfo.iStat;
}
}
else if (itemInfo.isEquipped == false && itemInfo.iType == "공격력")
{
// 무기 장착
if (character.Weapon == null) //null일때 무기
{
character.Weapon = itemInfo;
character.AddAtk += itemInfo.iStat;
character.Weapon.isEquipped = true;
}
//장착 중 무기 교체
else if (character.Weapon.isEquipped == true)
{
character.Weapon.isEquipped = false;
character.AddAtk -= character.Weapon.iStat;
character.Weapon = itemInfo;
character.Weapon.isEquipped = true;
character.AddAtk += itemInfo.iStat;
}
}
// 방어구 장착
else if (itemInfo.isEquipped == false && itemInfo.iType == "방어력")
{
if (character.Armour == null) //null일때 방어구
{
character.Armour = itemInfo;
character.AddDef += itemInfo.iStat;
character.Armour.isEquipped = true;
}
//장착 중 방어구 교체
else if (character.Armour.isEquipped == true)
{
character.Armour.isEquipped = false;
character.AddDef -= character.Armour.iStat;
character.Armour = itemInfo;
character.Armour.isEquipped = true;
character.AddDef += itemInfo.iStat;
}
}
}
2. 상점 판매 기능 구현
오히려 이 부분은 상점 구매 모드와 같이 판매 모드 메소드를 만들고 아이템 리스트 띄우는 것을 캐릭터 소유 인벤토리 리스트만 띄우면 되서 어려울 것이 없었다.
하지만 주의할 점이 하나 있었으니 장비 중인 아이템을 판매 시에 캐릭터의 추가 스텟을 초기화 시켜줘야 했고 해당 아이템의 isEquipped()상태 이외에도 캐릭터의 장착 중인 Weapon과 Armour에서도 제거해줘야 했다.
생각보다 훨씬 간단했다. 물론 85%의 가격으로 판매를 구현하면서 int값이던 가격이 float로 바뀌었다.
3번 아이템 추가야 뭐 서술할 것 없는 내용이라 넘어가겠다.
판매창 구동 화면
85%만 들어오는 것도 제대로 작동하는 것을 위 보유 골드에서 확인 가능하다
이렇게 추가 기능들도 일부 구현하는데 성공한 채로 18시가 되기 직전에 제출하는데 성공했다.
다음 주에는 해설 영상을 통해 내용을 수정하고 팀플을 대비해야한다.
이번 주차는 솔직히 많이 힘들고 어려웠다.
베이스가 없는, 이번에야 갓 코딩에 도전한 입장으로서
사실상 기본만 배웠던 사전캠프 이후 본캠프 고작 10일차에 이렇게 만들려니 피곤하고 머리가 많이 아팠다.
시간에 쫓기고 부담감을 느끼며 진행했다.
대학 기말시험이 끝날 당일부터 후다닥 달려와 시작한 본캠프로
매일 12시간씩 커리큘럼을 진행하려니 정말 그만하고 쉬고 싶은 생각도 많이 들었다.
하지만 주변에 도움이 없었더라면 해온 것들 모두 하나도 혼자서 못했을 것이다.
이렇듯 여럿이 도와주고 있는 만큼 그 노력들을 헛되이 되게 하면 안될 것이다.
벽에 막혀 쓰러지더라도 포기하는 것은 못할 짓 일 것이다.
그러니까 못난 코드이더라도 훗날 보고 되새기기 위해서 깃허브 링크로 남겨 놓는다.
'TIL' 카테고리의 다른 글
[TIL]2024-1-9 / 12일차 - 팀플 준비의 날 (0) | 2024.01.09 |
---|---|
[TIL]2024-1-8 / 11일차 - 인터페이스&열거형, 알고리즘 자습시간 (1) | 2024.01.08 |
[TIL]2024-1-4 / 9일차 - 개인과제 : 텍스트 게임 기본 기능 구현 (0) | 2024.01.04 |
[TIL]2024-1-3 / 8일차 - '또' 어려웠던 스네이크 게임 만들기 (1) | 2024.01.03 |
[TIL]2024-1-2 / 7일차 - 어려웠던 틱택토 게임 만들기 (1) | 2024.01.02 |