[TIL] 배열과 리스트, 아이템 드랍 테이블
📕학습 개요
유니티 캠프 12일차.
TRPG 팀 프로젝트 2주차. 게임 기능 구현이 생각보다 순조롭게 되고 있는 것 같다. 아마 내일 쯤이면 도전 기능의 대부분까지 구현 가능하지 않을까 싶다. 팀원들 간 소통이 조금 원활하지 않다는 느낌이 들어서 걱정했는데 다행인 것 같다.
오늘의 C#강의에서는 배열과 리스트 사용법에 대해 설명해주셨다. 코딩 테스트 문제를 풀 떄 아래에서 위로 읽어보라는 꿀팁을 전수받을 수 있었다.
날이 슬슬 더워지는데 오늘은 비까지 와서 굉장히 습한 하루였다. 덕분에 두 배는 피곤한 기분이다.
📖학습 내용
배열 vs 리스트
- 배열(Array) : 동일한 데이터 타입의 요소들을 고정된 크기로 저장하는 자료구조.
- 리스트(List) : 배열과 유사하나 크기가 동적으로 변하는 자료구조.
배열과 리스트의 가장 큰 차이점은 크기를 자유롭게 조정할 수 있냐 없냐에 있다. 코딩을 배운 지 얼마 되지 않았을 때는 리스트가 사용하기 편해서 맨날 리스트만 쓰다가, 배열의 존재를 잊어버렸던 기억이 있다. 물론 일반적으로 크기가 자동으로 확장되는 리스트를 사용해야 하는 경우가 많지만, 그만큼 메모리를 더 많이 사용하기에 크기가 고정된 자료구조가 필요하다면 배열을 선택하는 편이 좋을 수 있다.
튜터님께서 하신 말씀이 떠오른다. 자료구조 선택에 정답은 없지만, 본인의 생각과 방향성이 중요하다. 내가 어떤 자료구조를 택한 합당한 이유가 존재한다면, 그게 맞는 방향성이 되는 것이다.
TRPG - 아이템 드랍 테이블 구현
플레이어가 던전에서 뜨거운 전투를 치른 뒤, 이제 경험치 보상 뿐만 아니라 아이템 보상을 지급해야 한다. 자세한 기능은 다음과 같다.
- 처치한 몬스터 수에 따라 보상이 달라짐
- 아이템의 종류, 개수는 랜덤으로 정해짐
- 아이템 종류와 개수를 자세히 표기
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}");
}
댓글남기기