본문 바로가기

TIL

[TIL]2024-1-4 / 9일차 - 개인과제 : 텍스트 게임 기본 기능 구현

 

 

오늘은 시간이 많이 부족하다 생각하여 블랙잭과 이후 영상 과제들은 아쉽게도 미루고 4번 강의를 시청하며 개인과제에 돌입했다.

 

개인 과제 : 콘솔로 텍스트 게임 만들기

    기본 구현 조건

  1. 게임 시작 화면
    • 게임 시작시 간단한 소개 말과 마을에서 할 수 있는 행동을 알려줍니다.
    • 원하는 행동의 숫자를 타이핑하면 실행합니다. 1 ~ 3 이외 입력시 - 잘못된 입력입니다 출력
  2. 상태 보기
    • 캐릭터의 정보를 표시합니다.
    • 7개의 속성을 가지고 있습니다. 레벨 / 이름 / 직업 / 공격력 / 방어력 / 체력 / Gold
    • 처음 기본값은 이름을 제외하고는 아래와 동일하게 만들어주세요
    • 이후 장착한 아이템에 따라 수치가 변경 될 수 있습니다.
  3. 인벤토리
    • 보유 중인 아이템을 전부 보여줍니다. 이때 장착중인 아이템 앞에는 [E] 표시를 붙여 줍니다.
    • 처음 시작시에는 아이템이 없습니다.

           3 - 1. 장착 관리

더보기
  • 장착관리가 시작되면 아이템 목록 앞에 숫자가 표시됩니다.
  • 일치하는 아이템을 선택했다면 (예제에서 1~3선택시)
    • 장착중이지 않다면 → 장착 [E] 표시 추가
    • 이미 장착중이라면 → 장착 해제 [E] 표시 없애기
  • 일치하는 아이템을 선택했지 않았다면 (예제에서 1~3이외 선택시)
    • 잘못된 입력입니다 출력
  • 아이템의 중복 장착을 허용합니다.
    • 창과 검을 동시에 장착가능
    • 갑옷도 동시에 착용가능
    • 장착 갯수 제한 X
    • 아이템이 장착되었다면 1. 상태보기 에 정보가 반영되어야 합니다.

이후 상점 기능도 있지만 오늘은 여기까지 구현해 보도록 계획을 짰다.

 

사실 너무 많은 걸 새로 배우고 응용했어야 했기에 쓸 내용이 무지 많지만 피곤한 상태로 쓰기엔 너무 많기에

하면서 있었던 오류와 이를 해결하는 방법, 해결 후에 구현한 기능에 대해서 서술하려고 한다.

 

1. cs 구분하며 생긴 문제

 

이전까지는 내용이 짧은 코딩만 써왔기에 이렇게 구분해야 될 필요가 없었다.

하지만 이번에는 다양한 기능이 들어가야 하기에 하나의 cs파일에 모두 몰아넣고 쓰기에는 너무 지저분하고 복잡하다.

 

그래서 cs 파일을 구분하고 서로 호출할 수 있다는 것을 알게 되어 분리하게 되었다.

 

하지만 이때 모르던 것은 이전 강의 때 사용되거나 이전 과제들에서 쓰던 static이 문제가 될 것이란 것이었다.

서로 참조할 때 static이 끼치는 영향을 모른 채로 모두 static을 쓰고 있었고 그러던 중 리스트를 만들고 참조해야 할 때 문제가 터졌다. 이후 Main을 제외한 나머지 모든 곳에서 static을 없애고 코드를 수정하기 시작했다.

 

그렇게 다 클래스로 구분하고 생성자로 만드는데 점심부터 저녁까지 사이 시간을 모두 사용해야 했다.

하지만 덕분에 더 복잡해질 수 있던 여러 문제를 해결할 수 있었고

 

 

엄청 지저분하던 Main도 이렇게 짧아지게 되었다.

 

2. int로 받는 ReaLine()

처음 원하는 행동을 input 받을 때 이번에는 처음으로 제시된 행동 이외에 입력을 하게되면 

잘못된 행동이라는 문구를 출력하고 행동을 막아야한다.

 

이를 위해 처음 코드를 작성했을 때 작동은 했으나 이것이 int.parse를 이용했기에 숫자를 잘못 입력한 상황은 잘 됬지만

'아무것도 입력하지 않은 상황', '글자를 입력한 상황' 등 숫자 이외의 것에는 오류를 띄웠다.

 

그래서 방법을 알아보았고 TryParse를 이용해 애초에 int로 받을 수 있는 것에만 값을 입력 받도록 할 수 있게 되었다.

 

<처음 코드와 이후 변경된 코드>

 

 

3. switch case 문제

 

처음에 코드를 작성하며 각 인벤토리와 상태창을 여는데

다음과 같이 2번에서 작성한 CheckInput을 받는 메소드들이 있었는데 잘 작동했으나

인벤토리 화면에서 -> 장착 관리로 넘어가고 -> 다시 인벤토리 화면으로 나간 뒤

(CheckInventory는 인벤토리 내역만 띄우는 WriteLine()들의 모음이라 기능이 없다)

더이상 써야될 기능이 없어 프로그램이 끝나버리는 문제가 발생했다.

이를 해결해보려고 여러 생각을 해보았으나 너무 지저분하거나 어렵거나 비효율적이었고

이를 고민하다가 주변에 물어보아 while(true)를 통해 이전 내용들을 계속 돌려놓으면 뒤로 나가도 자연스럽게 이어갈 수 있다는 내용을 듣고

 

단순히 while(true)를 추가함에 따라 자연스럽게 문제가 고쳐졌다.

 

오늘 있었던 기억에 남는 문제들은 이 세가지 였고

다음은 구동한 화면을 남기며 기능 설명은 간략하게만 남기려고 한다. 뇌의 휴식이 필요하다ㅠㅠ

 

타이틀 화면

 

잘못된 입력 출력

 

캐릭터 상태 보기

이는 캐릭터 클래스를 만들고 스탯 값을 불러와 적용한 것을 출력하는 식으로 구현되었다.

현재 아이템으로 인해 생기는 변화 스탯 (+0) 부분이 아이템이 없어도 출력되는데 

이는 내일 해결해보려고 한다.

 

 

 

인벤토리와 장착 관리 모드(미완)

리스트에 추가된 아이템만 목록에 나오며 장착 상태일 시에는 [E]가 출력된다.

 

장착 관리 모드 돌입 부분은 bool isManage 값을 받아 true일 때 InventoryViewer() InventoryManage()중에서 받아

인벤토리 목록을 보여주는 방식이다.

 

위 아이템들은 아래와 같은 아이템 클래스를 따르며

<아이템 클래스의 모습 / Type을 구분해 공격력과 방어력을 구분했다>

 

 

캐릭터의 소유 장비 리스트에서 값을 받는다. 이 부분은 아직 미완성이라 Test로 남겨놓았다.

 

 

이렇게 오늘은 나름대로 목표한 부분까지 다 하지는 못했지만 많이 끝냈다고 생각하고

노베이스 코딩 9일차 답게 스파게티 코드가 되었지만 나름대로 cs 구분이라는 개인적인 목표를 이루며 열심히 한 날이라고 생각한다.

 

슬슬 제출일 금요일이 다가오며 피로가 누적되고 있는 기분이지만 어떻게든 기본기능은 다 완성한 뒤 제출하고 싶다.

상점은 인벤토리를 구현할 때 느끼던 어려움을 생각하면 강적이 될 것이라고 생각하기에 내일은 18시 전까지 많이 바쁠 것 같다. 으악

 

 

충성 또 충성