📝 24.01.03
오늘은 컨디션이 지나치게 좋지 않아 집중이 너무 힘들었다. 코피도 나고 두통도 있고 여러모로 고달픈 날이었다. 그래서 그런지 뭔가 완성한 것이 없어서 너무 아쉽다.
오전 시간에는 3주차의 배열과 컬렉션 부분을 다시 공부했다. 개인 과제의 텍스트 RPG 만들기에 어떤 방식으로 어떤 것을 사용할 지 고민하면서 공부하였다. 점심 후 집중 코딩 시간에는 앞서 공부한 내용을 바탕으로 개인 과제인 텍스트 RPG 게임 만들기를 이어서 진행하였다.
여기서 오늘 주요하게 만든 부분들을 정리해보겠다.
어떠한 행동을 입력받고 출력하는 일은 매우 반복적으로 일어난다. 그리고 행동 입력에서 잘못된 값을 입력 받았을 때는 다시 입력을 받는 것도 반복적으로 일어난다. 그래서 이를 함수로 만들었다.
static int CheckAction(string start, int min, int max)
{
while(true)
{
Console.WriteLine(start);
Console.Write(">> ");
int ans;
if(int.TryParse(Console.ReadLine(), out ans))
{
if(ans >= min && ans <= max)
{
return ans;
}
}
Console.WriteLine("\n잘못된 입력입니다. 다시 선택해주십시오.");
}
}
먼저 어떤 행동을 요구할 것인지를 start라는 문자열로 받아 출력하도록 하였고, 최솟값과 최댓값도 입력받아 입력값의 범위를 한정해주었다. 그 범위를 벗어나는 입력값일 때는 다시 입력받도록 설계하였다.
범위 내의 입력값이 들어왔을 경우에는 해당 입력값을 return 하여 이에 대한 출력을 반영할 수 있도록 하였다.
행동 요구 지시문이 한번만 출력되어야 하는 경우에는 start 문자열을 비우면 된다.
예시)
Console.WriteLine(" 직업을 선택해주세요.\n");
Console.WriteLine(" | 1. 전사 | 2. 용병 | 3. 마법사 ");
Console.WriteLine("---------|--------------|--------------|--------------");
Console.WriteLine(" 공격력 | 10 | 8 | 12 ");
Console.WriteLine("---------|--------------|--------------|--------------");
Console.WriteLine(" 방어력 | 7 | 10 | 5 ");
Console.WriteLine("---------|--------------|--------------|--------------");
Console.WriteLine(" 체 력 | 100 | 80 | 50 ");
Console.WriteLine("---------|--------------|--------------|--------------");
Console.WriteLine(" 골 드 | 1500 | 1200 | 2000 ");
int job = CheckAction("", 1, 3);
character = new Warrior(name, job);
참고로 해당 부분은 용사의 직업군을 선택하는 부분이다.
인벤토리 관리는 캐릭터가 보유한 장비를 확인할 수 있는 부분이다.
static void ManageInven(Warrior character)
{
TextColor("\n인벤토리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
character.ShowInven(false);
Console.WriteLine("1. 장착 관리");
Console.WriteLine("0. 나가기\n");
int cmd = CheckAction("원하는 행동을 입력해주세요.", 0, 1);
if(cmd == 0)
{
//마을 광장으로 나가기
Village(character);
} else
{
// 장착 관리
int max = character.ShowInven(true);
int itemNum = CheckAction("장착/장착 해제할 아이템을 선택해주세요.", 1, max);
//아이템 장착 character.EquipItem() 아마 번호 파라미터로넣을듯?
}
}
캐릭터 클라스의 showinven 메소드를 호출하는 방식으로 인벤토리 내의 아이템 목록을 확인하고, 이를 장착/해제 할 수 있도록 하였다. 하지만 아직 캐릭터에 장비를 장착하는 부분(character.EquipItem())은 아직 구현 전이라서 미완성이다.
상점에서는 레벨별 구매할 수 있는 목록을 다르게 출력하도록 하였다.
static void Store(Warrior character)
{
Item[] lv1 = { new Item("수련자 갑옷", 0, 0, 5, "초보자를 위한 수련에 도움을 주는 갑옷.", 500),
new Item("낡은 검", 1, 2, 0, "쉽게 부서질 것 같은 낡은 검.", 300),
new Item("청동 도끼", 1, 4, 0, "방금까지도 나무를 벤 것 같은 흔한 도끼.", 900)};
Item[] lv2 = { new Item("무쇠 갑옷", 0, 0, 10, "숙련자가 만든 튼튼한 갑옷.", 1200),
new Item("가벼운 은검", 1, 7, 0, "휴대하기 좋은 날카로운 은검.", 1200)};
Item[] lv3 = { new Item("장인의 갑옷", 0, 0, 15, "장인이 만든 갑옷. 1년에 단 1개만 제작된다고 한다.", 2000),
new Item("장인의 검", 1, 10, 0, "장인이 만든 검. 스치기만 해도 치명상을 입는다.", 1600),
new Item("장인의 활", 1, 7, 3, "장인이 만든 활. 먼 거리에서도 화살이 올곧게 날아간다.", 1600)};
//전설의 전용 무기
Item[] lv5 = { new Item("이카본의 쌍검", 2, 20, 10, "초대 군주 이카본이 기사단장에게 수여했다고 전해지는 전설의 검. 기사만이 사용할 수 있다.", 5000),
new Item("용병왕의 대검", 3, 15, 15, "사라진 용병왕의 대검. 용병이 아닌 자는 들 수 없다.", 5000),
new Item("아나로즈의 망토", 4, 10, 10, "수천년을 산 마녀 아나로즈의 망토. 마법사가 아닌 자는 그 용도를 알 수 없다.", 5000)};
List<Item> shopItem = new List<Item>();
if(character.Level == 1)
{
for(int i = 0; i < lv1.Length; i++)
{
shopItem.Add(lv1[i]);
}
} else if(character.Level == 2)
{
for (int i = 0; i < lv2.Length; i++)
{
shopItem.Add(lv2[i]);
}
} else if( character.Level == 3)
{
for (int i = 0; i < lv3.Length; i++)
{
shopItem.Add(lv3[i]);
}
} else if(character.Level == 5)
{
for (int i = 0; i < lv5.Length; i++)
{
shopItem.Add(lv5[i]);
}
}
TextColor("\n[상점]");
Console.WriteLine("필요한 아이템을 얻을 수 있는 상점입니다.");
Console.WriteLine("\n[보유 골드]");
TextColor(character.Gold + " G\n");
foreach (Item item in shopItem)
{
string equipTxt = "- ";
equipTxt += ItemList(item);
equipTxt += " | " + item.ItemGold.ToString() + " G";
Console.WriteLine(equipTxt);
}
}
특히 이중에서 레벨이 5가 되면 해금이 되는 직업 전용 무기를 공들여 만들었는데, 해당 장비들은 장착 위치 분류를 다르게 하여 구분하였다. 아직 이를 반영하여 장착할 수 있는 부분은 존재하지 않지만 추후 추가할 수 있도록 할 것이다.