오늘도 개인과제를 진행했다. 과제에 추가적으로 기능을 구현하고 싶으면 해도된다고 목록을 줬는데, 다른 기능들을 다 추가하고 나니까 난이도 별 6개짜리인 게임 저장하기도 해보고 싶은 욕심이 났다.
따라서 오늘 구현한 던전입장, 간단한 텍스트 전투 시스템을 정리해보고, 게임저장하기를 만들다가 어려웠던 점 등을 정리해보기로 했다.
던전의 정보를 관리하기 위해 구조체를 하나 만들었다.
public struct DungeonInfo
{
public int ID { get; }
public string Name { get; }
public int Level { get; }
public int NeedDef { get; }
public int ClearGold { get; }
public string[] Monsters { get; }
public int HP { get; }
public static int MaxPad { get; private set; }
public DungeonInfo(int id, string name, int level, int needDef, int clearGold, string[] monsters, int hp)
{
ID = id;
Name = name;
Level = level;
NeedDef = needDef;
ClearGold = clearGold;
Monsters = monsters;
HP = hp;
}
public void SetMaxPad()
{
MaxPad = Math.Max(MaxPad, Encoding.Default.GetBytes(Name).Length);
}
}
던전 이름, 요구 방어력, 보상 골드량, 등장할 몬스터들의 이름, 전투에 쓸 HP 등등을 넣어줬다.
SetMaxPad()
메서드는 Console에서 가장 긴 던전의 이름을 기준으로 정렬하기 위해 가장 긴 던전의 이름을 static 필드에 저장하는 메서드이다.
던전 메뉴를 선택하면, 플레이어가 현재 수준에 알맞는 던전을 선택 할 수 있게 먼저 플레이어의 정보를 간략하게 보여주고, 던전의 리스트를 보여줬다.
위 화면에서 1번을 누르면 던전을 선택하는 창으로 넘어간다. Console.ReadLine()
으로 번호를 입력받아서 예외처리 후에, 입력한 번호에 맞는 던전으로 들어가도록 해줬다.
현재 입장한 던전, 만난 몬스터의 체력, 플레이어의 체력, 그리고 체력바를 보여준다. 또 전투를 하기 위한 공격 키 정보도 보여준다.
전투에서 승리하면 얼마를 얻었는지, 레벨업을 했다면 레벨이 몇이 됐는지 등을 보여준다.
전투에서 패배하면 몬스터에게 당했다는 출력과 함께 씁쓸한 패배의 문구가 나온다.
간단한 전투 시스템도 구현했는데, A, S, D 3가지 랜덤한 키가 10개 나열되고, 가장 왼쪽에 있는 키를 순서대로 입력하면 몬스터의 HP가 줄어들고, 잘 못 입력하면 플레이어의 HP가 줄어들게 해봤다.
시작하자마자 한 대 맞고 다크스톤골렘을 잡아봤다.
게임 데이터 저장/불러오기를 구현하기 위해 JSON을 만지작 거려봤다.
현재 게임에 추가한 아이템들의 정보는 Dictionary
에 ID
값을 키로, Item
클래스를 밸류로 저장해뒀다. 따라서 상점에서 아이템을 구매할 때도 이 Dictionary에서 깊은 복사로 아이템 객체를 만들어서 플레이어의 인벤토리에 넣어주고 있다.
지금은 프로그램 실행 시에 Dictionary를 코드로 초기화하고 있는데, 이걸 먼저 코드 대신 JSON 데이터를 받아와서 Dictionary를 초기화 해보기로 했다.
그런데 문제가 발생했다. Dictionary를 JSON string으로 serialize 하는덴 문제가 없었는데, 이 JSON string으로 deserialize하면 오류가 난다...
오류를 읽어보니 Item
클래스는 추상클래스여서 인스턴스를 가질 수 없댄다...
튜터님에게 질문도 해봤다. Item
클래스를 추상클래스가 아닌 일반 클래스로 만들고, 필드를 통일해보라는 조언도 해주셨다.
그리고 이건 내가 생각해본 방법인데, JSON string을 deserialize 할 때, Item
형이 아니라 object
형으로 받아와서 Weapon
이나 Armor
로 언박싱해도 될것같다. 근데 이 방법이 시간복잡도나 공간복잡도 면에서 좋은지는 모르겠어서, 내일 다시 질문해봐야겠다.
JSON은 써보기는 했지만, 간단한 형태의 데이터들만 파싱해본적이 전부라서, 파생클래스가 있는 클래스들을 역직렬화하는건 처음이라 많이 어렵다.