내일배움캠프 - TIL/내일배움캠프 - TIL

내일배움캠프 11일차 - Text RPG 구현 거의(?) 완료

rudals4469 2025. 4. 24. 20:43

Text RPG

  • 프로젝트 명 : Text Maple RPG
  • 프로젝트 소개 :
    • Text RPG 라는 기본 틀에 우리에게 친숙한 온라인 게임인 Maple Story를 더하여 몰입감 있는 Text RPG 구현하기
    • 기본적인 객체 지향 프로그래밍 준수하여 구현하기
    • 코드 컨벤션, 깃 컨벤션 준수하여 협업하기
  • 클래스 다이어 그램

 

  • 와이어 프레임

 


오늘은 진도가 좀 팍팍 나가서 기능 구현이 거의 완료 되었다. 사실 기본 기능과 도전 기능을 나누지 않고 설계할 때 확장을 다 시켜놓고 구현을 시작했기 때문에 기본 기능과 도전 기능이 거의 동시에 완성되는 쾌거를 이루었다.

하루 종일 포션 출력에 애를 먹었다.

 

Console.WriteLine("\n[포션]\n");

var potions = from potion in player.Inventory.Potions
              orderby potion.Name ascending
              group potion by potion.Name into g
              select new
              {
                  Name = g.Key,
                  Count = g.Count(),
                  Text = g.First().Text,
                  Potion = g.First().PotionType
                  
              };
foreach (var potion in potions)
{
    Console.WriteLine($"-  {potion.Name,-18} | {potion.Text} | x{potion.Count}");
}

 

위 구문이 포션 출력 구문이다. 우리 팀은 포션을 포션 클래스에 포션 리스트를 만들어 포션을 관리했다.

또한 포션은 체력포션/마나포션으로 타입을 나누어 관리했기 때문에 출력을 리스트를 돌게 만드니 포션의 갯수만큼 출력이 되어 상당히 애를 먹었다. 내가 원했던건 hp x1 mp x3 처럼 1줄 출력에 카운트를 세주는 형식이었다.

처음에 어떻게 할 지 정말 막막하다가 결국 해결을 못하고 튜터님께 질문을 하였다.

정답은 Linq 구문이었는데

 

Linq는 C#에서 제공하는 기능 중 하나이며 데이터를 가공하여 처리 할 수 있는 문법이다.

배열형식이나 데이터 형식들을 가공할때 쿼리처럼 사용할 수 있어 직관적이고 편리하게 사용 할 수 있는 문법이라고 한다.

필터링, 매핑, 정렬등의 기능들을 활용하여 데이터들을 보다 쉽게 가공할 수 있습니다.

 

위의 구문은 일단 player.inventory.potions를 다 순회합니다. 그런 뒤 orderby 문을 통해 Name으로 오름차순(ascending)으로 정렬하며 potion을 potion.Name으로 그룹하여 그것을 g로 저장한다. g에 저장하는 내용은 Name, Count, Text, Potion이다.

 

그 뒤 foreach 문으로 potions를 순회하여 출력을 하는데 posions에는 이미 potion.Name이 같은 오브젝트(?)는 하나로 묶여(?) 있기 때문에 Hp포션,  Mp포션 각 1개씩 카운트를 달아서 출력이 된다.

 

위 구문은 처음 실전에서 써봤는데 쓸 일이 많진 않아도 확실히 알아 놓으면 편한 기능인 것은 확실하다고 생각합니다.