📕학습 개요

유니티 캠프 12일차.

TRPG 팀 프로젝트 2주차. 게임 기능 구현이 생각보다 순조롭게 되고 있는 것 같다. 아마 내일 쯤이면 도전 기능의 대부분까지 구현 가능하지 않을까 싶다. 팀원들 간 소통이 조금 원활하지 않다는 느낌이 들어서 걱정했는데 다행인 것 같다.

오늘의 C#강의에서는 배열과 리스트 사용법에 대해 설명해주셨다. 코딩 테스트 문제를 풀 떄 아래에서 위로 읽어보라는 꿀팁을 전수받을 수 있었다.

날이 슬슬 더워지는데 오늘은 비까지 와서 굉장히 습한 하루였다. 덕분에 두 배는 피곤한 기분이다.


📖학습 내용

배열 vs 리스트

  • 배열(Array) : 동일한 데이터 타입의 요소들을 고정된 크기로 저장하는 자료구조.
  • 리스트(List) : 배열과 유사하나 크기가 동적으로 변하는 자료구조.

배열과 리스트의 가장 큰 차이점은 크기를 자유롭게 조정할 수 있냐 없냐에 있다. 코딩을 배운 지 얼마 되지 않았을 때는 리스트가 사용하기 편해서 맨날 리스트만 쓰다가, 배열의 존재를 잊어버렸던 기억이 있다. 물론 일반적으로 크기가 자동으로 확장되는 리스트를 사용해야 하는 경우가 많지만, 그만큼 메모리를 더 많이 사용하기에 크기가 고정된 자료구조가 필요하다면 배열을 선택하는 편이 좋을 수 있다.

튜터님께서 하신 말씀이 떠오른다. 자료구조 선택에 정답은 없지만, 본인의 생각과 방향성이 중요하다. 내가 어떤 자료구조를 택한 합당한 이유가 존재한다면, 그게 맞는 방향성이 되는 것이다.

TRPG - 아이템 드랍 테이블 구현

플레이어가 던전에서 뜨거운 전투를 치른 뒤, 이제 경험치 보상 뿐만 아니라 아이템 보상을 지급해야 한다. 자세한 기능은 다음과 같다.

  1. 처치한 몬스터 수에 따라 보상이 달라짐
  2. 아이템의 종류, 개수는 랜덤으로 정해짐
  3. 아이템 종류와 개수를 자세히 표기

1번 사항을 지키기 위해서는 각 몬스터가 고유 아이템 드랍 테이블을 가져야 한다. 그리고 몬스터 처치 시, 드랍 테이블의 아이템 종류, 드랍 확률, 최소/최대 개수에 맞춰 무작위 범위의 아이템을 추출하여 보상 아이템 리스트에 추가한다.

  • 드랍 테이블 클래스
[Serializable]
public class DropTableEntry
{
    public int itemID;      //아이템 고유번호
    public float DropChance;    //아이템 드랍 확률
    public int MaxQuantity;     //최대 드랍 개수
    public int MinQuantity;     //최소 드랍 개수
}

[Serializable]
public class DropTable
{
    public List<DropTableEntry> Drops = new List<DropTableEntry>();
}

각 몬스터 객체는 고유의 드랍 테이블을 하나씩 가지고 있다.

  • 드랍 테이블에서 아이템 무작위로 추출후 반환하는 메서드
 public static List<ItemInfo> GetDroppedItems(DropTable table)
        {
            List<ItemInfo> droppedItems = new List<ItemInfo>();

            Random rand = new Random();

            foreach (var entry in table.Drops)
            {
                int quantity = rand.Next(entry.MinQuantity, entry.MaxQuantity);
                for (int i = 0; i < quantity; i++)
                {
                    droppedItems.Add(ItemDataBase.Items[entry.itemID]);
                }
            }
            return droppedItems;
        }

이제 전투 중 처치한 몬스터 리스트를 기반으로 아이템을 추출한 뒤 인벤토리에 추가해주면 끝이다.

Dictionary<string, int> itemCounts = new Dictionary<string, int>(); //드랍 아이템 정리용 딕셔너리

foreach (Monster monster in killedMonsters) //처치한 몬스터 경험치, 드랍 아이템 정리
         {
             player.GetEXP(monster.ExpReward);
             //몬스터 드랍 테이블에서 랜덤 아이템 추출
             foreach (ItemInfo itemInfo in Utils.GetDroppedItems(monster.DropTable))
             {
                 if (itemCounts.ContainsKey(itemInfo.Name))
                 {
                     itemCounts[itemInfo.Name]++;
                 }
                 else
                 {
                     itemCounts[itemInfo.Name] = 1;
                 }
                 player.Inventory.AddItem(ItemFactory.CreateItem(itemInfo));
             }
         }
         Console.Clear();
         Console.WriteLine("[획득 아이템]");
         foreach (var entry in itemCounts)
         {
             Console.WriteLine($"{entry.Key} x {entry.Value}");
         }

태그: ,

업데이트:

댓글남기기