c# 퀘스트에서의 Dictionary(딕셔너리) 사용예시
1. Quest 클래스에서의 딕셔너리 사용예시
public class Quest
{
public Dictionary<string, int> Objectives { get; set; } // 퀘스트 목록
public Dictionary<string, int> Progress { get; set; } // 퀘스트의 현재 진행도만 따로
public QuestStatus Status { get; set; } // 퀘스트 상태
public Quest(Dictionary<string, int> objectives)
{
Objectives = objectives;
Progress = new Dictionary<string, int>();
foreach (var objective in objectives)
{
Progress[objective.Key] = 0;
}
Status = QuestStatus.NotStarted;
}
}
//퀘스트 상태를 나타내는 코드
public enum QuestStatus
{
NotStarted, //진행되지 않은 퀘스트
InProgress, //진행중인 퀘스트
Completed // 완료된 퀘스트
}
위 코드에서 Objectives와 Progress는 각각 퀘스트의 목표와 현재 진행 상태를 나타냅니다. 딕셔너리를 사용함으로써 몬스터의 이름(키)과 목표 수치(값)를 쉽게 매핑할 수 있습니다.
2. Quest 클래스의 IsCompleted 메서드
public bool IsCompleted()
{
foreach (var objective in Objectives) //var = var를 사용하면 컴파일러가 변수의 타입을 자동으 로 추론하므로, 변수의 타입을 명시적으로 지정할 필요가 없다.
{
if (!Progress.ContainsKey(objective.Key) || Progress[objective.Key] < objective.Value)
{
return false; // 모든 목표가 완료되지 않았다면 false 반환
}
}
return true; // 모든 목표가 완료되었다면 true 반환
}
IsCompleted 메서드는 모든 목표가 완료되었는지를 확인합니다. 각 목표가 Progress 딕셔너리에 존재하는지, 그리고 목표 수치에 도달했는지를 체크합니다. 만약 목표가 존재하지 않거나 목표 수치에 미달인 경우, false를 반환합니다.
이 메서드는 퀘스트의 완료 여부를 판단하는 중요한 역할을 하며, 딕셔너리를 사용하여 효율적으로 목표 상태를 확인할 수 있습니다.
3. Quest 클래스의 UpdateProgress 메서드
public void UpdateProgress(string objective, int amount) //현재 진행량을 업데이트함
{
if (Progress.ContainsKey(objective)) // 진행 중인 목표인지 확인
{
Progress[objective] += amount; // 목표에 대한 진행 수치를 증가시킴
// 완료 여부 확인
if (IsCompleted())
{
Status = QuestStatus.Completed; // 완료 상태로 변경
}
}
}
위의 UpdateProgress 메서드는 퀘스트 진행 상황을 업데이트합니다. 이 메서드에서 Progress 딕셔너리를 사용하여 각 목표의 진행 상황을 관리를 해서 만약 목표가 존재한다면, 해당 목표의 진행 수치를 증가시키고, 퀘스트가 완료되었는지 확인합니다.
여기서 딕셔너리를 사용한 이유는 각 목표의 진행 상황을 쉽게 업데이트하고, 목표 이름(키)으로 빠르게 접근할 수 있기 때문입니다.(Dictionary로 만든 변수에서 값을 가져오기 위해서는 인덱스형식으로 작성한다음에 안에 숫자가 아닌 키를 넣으면 값을 불러올 수 있다. ex) Progress[objective] += amount )
그런다음에 이제 QuestManager클래스든 다른 클래스에서 밑에와 같이 코드를 작성해서 사용하면 됩니다.
public List<Quest> availableQuests; //진행 가능한 퀘스트
public List<Quest> activeQuests; //진행중인 퀘스트
이 다음부터는 리스트와 마찬가지로 사용하면된다. 다만 값을 가져올때만 위에서 설명한대로 해야지 가져올 수 있습니다.
딕셔너리 생성 예시
private void AddQuests()
{
Quest quest1 = new Quest
(
new Dictionary<string, int> { { "미니언", 5 } },
);
}
위와같이 입력하면 키는 "미니언" 이고 값은 5이다.