24.01.12 TIL - [C#] Text RPG 팀 프로젝트 (2) : 추가 기능 , 개선 | FirstOrDefault

JJwoo·2024년 1월 12일
post-thumbnail

약 50% 정도 구현 한 것 같은데 확실히 팀원들의 실력이 많이 좋아진 듯 하다.
오늘도 내가 담당한 기능을 추가 및 개선을 좀 해보았다.

추가 기능 , 개선

1. 회복 아이템 사용으로 HP/MP 회복하는 기능

 public int HpPotion { get; set; }
 public int MpPotion { get; set; }
 public List<Item> Inventory { get; set; }

먼저 플레이어 클래스의 속성에 체력, 마나포션 속성과 아이템을 인벤토리에 보관하기 위한 속성을 추가해주고,
플레이어 자식 클래스(직업)들에게도 초기화.

            HpPotion = 3; // 기본 갯수
            MpPotion = 1;
            Inventory = new List<Item>();
            //직업 별로 각각의 인벤토리

코드 구현 및 수정 과정

스크린샷을 보면 각각 1 2 3의 번호에 체력 계산 관련 코드를 추가해주어서 해결했다.


2. 인벤토리 아이템 저장 기능

현재 인벤토리 메뉴가 존재하지 않아서 획득한 아이템을 저장 해 줄 인벤토리를 만들고 전투로 획득한 아이템을 저장 할 계획.

플레이어 클래스에 Inventory라는 아이템 리스트 속성을 만들고, 자식(여기서는 직업)이 여러 개기 때문에 각각 Inventory = new List(); 를 생성해 줌.

          public class Player
        {

			// 기존 코드...
  
            public List<Item> Inventory { get; set;}
  
            // 기존 코드,,,

        }
  
  public class Warrior : Player
{
    public Warrior()
    {
        Name = "이름";
        Class = "전사";
        Level = 1;
        Atk = 10;
        Def = 5;
        SkillAtk = 0;
        MaxHp = 100;
        Hp = 100;
        MaxMp = 50;
        Mp = 50;
        Gold = 1500;
        Exp = 0;
        MaxExp = 30;
        HpPotion = 3;
        MpPotion = 1;
        AvailableSkill = new List<bool>();
        Skill = new List<string>();
        Inventory = new List<Item>();
    }
}
   public class Item
 {
     public string Name { get; }
     public int Type { get; }
     public int Atk { get; set; }
     public int Def { get; set; }
     public int Gold { get; set; }
     public int Quantity { get; set; } // 아이템 수량

     public Item(string name, int type, int atk, int def, int gold, int quantity = 1)
     {
         Name = name;
         Type = type;
         Atk = atk;
         Def = def;
         Gold = gold;
         Quantity = quantity;
     }
 }

아이템 갯수도 세어야하기 때문에 "public int Quantity { get; set; }" 속성과 "Quantity = quantity;" 생성자까지 선언




                void GetRewards() // 던전 보상 메서드
                {
                    Console.Clear();
                    Random r = new Random(); // 랜덤 객체 생성, 랜덤 숫자를 생성하려고
                    int totalGold = 0; //획득 골드 표시하려고, 일단 초기화

                    for (int i = 0; i < monsters.Count; i++) // 몬스터 리스트 수 만큼 반복
                    {
                        totalGold += monsters[i].Gold;  // 몬스터의 골드를 획득 골드에 추가
                        if (items.Count > 0) // 아이템 리스트에 아이템이 있는지 확인
                        {
                            int itemIdx = r.Next(items.Count); // 아이템 리스트 내에서 랜덤한 인덱스 선택
                            Item dropItem = items[itemIdx]; // 선택한 인덱스에 해당하는 아이템 가져 옴

                            //
                            var existingItem = player.Inventory.FirstOrDefault(it => it.Name == dropItem.Name);
                            // 플레이어 인벤토리에서 dropItem과 이름이 같은 아이템 찾아서 저장
                            // FirstOrDefault : 조건 만족하는 첫 번째 요소만 반환 (existingItem에다가), 아니면 null
                            if (existingItem != null) // null이 아니면 = 조건이 맞으면
                            {
                                existingItem.Quantity++; // 이미 있는 아이템이면 수량 증가
                            }
                            else
                            {
                                player.Inventory.Add(new Item(dropItem.Name, dropItem.Type, dropItem.Atk, dropItem.Def, dropItem.Gold)); // 새 아이템 추가
                            }
                        }
                    }

보상 아이템을 얻는 메서드인데, 인벤토리 속성을 만들어 주었으니 여기에도 수정을 가했다.

- FirstOrDefault 메서드

FirstOrDefault LINQ(Language Integrated Query)의 일부, 컬렉션 또는 시퀀스에 대해 특정 조건을 만족하는 첫 번째 요소를 찾는데 사용.

  • 조건을 만족하는 요소가 없다면? ==> 해당 요소 타입의 기본 값을 반환 (참조형 null , 값형 0 혹은 false)

예시)


방패 라는 이름을 가진 첫번째 아이템을 찾고 싶음.  
  

List<Item> items = new List<Item>
{
    new Item("검", 100),
    new Item("방패", 150),
    new Item("포션", 50)
};

// "방패" 라는 이름을 가진 첫 번째 아이템을 찾음.
Item getItem = items.FirstOrDefault(item => item.Name == "방패");

if (shield != null)
{
    // "방패" 아이템을 찾으면
    Console.WriteLine($"아이템: {getItem.Name}, 가격: {getItem.Price}");
}
else
{
    // "방패" 아이템이 리스트에 없으면
    Console.WriteLine("방패 아이템을 찾을 수 없습니다.");
}

다만 실제 활용에서는 dropItem.Name 이라는, 사냥을 하여 획득한 dropItem의 이름으로 찾아주었다.

그렇게 찾은 아이템을 "var existingItem" 이라는 암시적 타입 변수에게 저장 해주고, != null과 if, else문으로 조건이 맞는지 확인을 하여 (이름이) 이미 있는 아이템이라면 수량을 추가하거나, 없는 아이템이라면 drapItem을 매개로 하여 아이템을 생성하게 해주었다.


profile
개발 모코코

0개의 댓글