[내일배움캠프 7일차] TextRPG 제작기 2
1. 오늘의 할 일
어제는 각 부분에 대한 대략적인 함수를 만들었다.
버튼을 누르면 해당 버튼이 있는 곳으로 가는 것으로, 일종의 [맵 이동]이나 [창 열기] 가 구현된 것이다.
하지만 어제는 상점에 들어있을 아이템의 내역을 단순한 string값, 즉 "문자열"로 표기했다.
이렇게 해두면 데이터값은 하나도 얻지 못하므로, 이것을 데이터값으로 변환해서 동일하게 표시되도록 해야한다.
목표: Item의 List만들기
2. 작업 개시🛠️
일단, 아이템을 구성하는 클래스를 만들어야한다.
또한, 시작에 Player를 구성하는 내용물이 너무 지저분하게 놓여있던 것 같으므로, Player를 정의하는 클래스도 별개로 만들어줘야 한다.
일단, 아이템보다도 우선되는 Player 생성을 위해 class 로 만들어준다. 기존값을 그대로 이동시킨다고 생각하면 된다.
(아이템 class 만들기 전 연습)
플레이어 클래스 코드
//플레이어 스탯 초기화
class Player
{
//레벨, 이름, 직업, 공격력, 방어력, 체력, 골드
public int level;
public string name;
public string job;
public int attack;
public int defense;
public int hp;
public int gold;
//생성자
public Player(string name, string job, int level, int attack, int defense, int hp, int gold)
{
this.name = name;
this.job = job;
this.level = level;
this.attack = attack;
this.defense = defense;
this.hp = hp;
this.gold = gold;
}
}
static Player player = new Player("이름", "직업", 1, 10, 5, 100, 1500); //플레이어 객체 생성
class 부분을 확인하면 job이 있는데, job도 enum을 이용하여 정할 수 있도록 만들었다.
아직 직업에 따라 status를 다르게 적용하지 않았기 때문에, 기본 값만 가져간다.
enum 과 메인에서 직업 선택 코드
enum Job
{
전사 =1, //전사를 1번부터 시작하도록
마법사,
궁수
}
static void Main(string[] args)
{
Console.Clear(); //콘솔창 초기화
//시작 화면
Console.WriteLine("게임을 시작합니다.\n 플레이어의 이름을 입력해주세요.");
Console.Write("이름: ");
string name = Console.ReadLine(); //이름 입력
Console.WriteLine("직업을 선택해주세요.\n 1. 전사\n 2. 마법사\n 3. 궁수");
Console.Write("직업: ");
//번호에 따라 맞는 직업을 job에 입력, enum 사용
Job job = (Job)Enum.Parse(typeof(Job), Console.ReadLine());
Console.WriteLine($"{name}님, 게임을 시작합니다.");
player.name = name; //플레이어 이름 설정
player.job = job.ToString(); //플레이어 직업 설정
GameStart(player); //게임 시작
}
작성했다면, 이 내용이 잘 적용되었는지 확인해야한다.
실컷 class 다 작성했는데 저장되지 않으면 안되잖아!
결과
걱정과는 달리 무사히 직업까지 잘 적용되어 들어간 모습이다. ( ^^)9
기세를 몰아 아이템의 class까지 제작해보도록 한다.
아이템은 특히 상호작용이 많기 때문에, 구매와 판매 메서드, 장착 메서드도 추가했다.
class Item
{
//soldout이 true이면 판매 완료, false이면 판매 가능(Player 클래스의 gold와 비교)
//equipped가 true이면 장착 중, false이면 장착 안함
//아이템 이름, 가격, 공격력, 방어력, 설명, 판매여부, 착용여부
public string Name { get; set; }
public int Price { get; set; }
public int Attack { get; set; }
public int Defense { get; set; }
public string Description { get; set; }
public bool SoldOut { get; set; }
public bool Equipped { get; set; }
//생성자
public Item(string name, string description, int price, int attack, int defense)
{
Name = name;
Price = price;
Attack = attack;
Defense = defense;
Description = description;
SoldOut = false;
Equipped = false;
}
//판매 메소드
public void Buy()
{
if (SoldOut == false)
{
Console.WriteLine($"{Name}을(를) 구매하였습니다.");
SoldOut = true;
player.gold -= Price; //구매 후 골드 감소
ItemPurchase(player); //구매 후 상점으로 이동
}
else
{
Console.WriteLine($"{Name}은(는) 이미 판매되었습니다.");
ItemPurchase(player); //상점으로 이동
}
}
//구매 메소드
public void Sell()
{
//판매할 수 있는 조건: SoldOut이 true이고 Equipped가 false일 때
//Equipped가 true일 때: 장착 해제 후 판매 가능
//판매가는 구매가의 80%로 설정
if (SoldOut == true && Equipped == false)
{
Console.WriteLine($"{Name}을(를) 판매하였습니다.");
Console.WriteLine($"{Name}의 판매가는 {Price * 0.8}G입니다.");
player.gold += (int)(Price * 0.8); //판매 후 골드 증가
SoldOut = false;
ItemSell(player); //판매 후 상점으로 이동
}
else if (SoldOut == true && Equipped == true)
{
Console.WriteLine($"{Name}은(는) 장착 중입니다.");
Console.WriteLine(Name + "을(를) 장착 해제 하고 판매하시겠습니까? (Y/N)");
string answer = Console.ReadLine();
switch (answer) //답변에 따라 결과 출력
{
case "Y":
Console.WriteLine($"{Name}을(를) 장착 해제 하였습니다.");
Console.WriteLine($"{Name}을(를) 판매하였습니다.");
player.attack -= Attack; //플레이어의 공격력 감소
player.defense -= Defense; //플레이어의 방어력 감소
player.gold += (int)(Price * 0.8);
Equipped = false;
SoldOut = false;
ItemSell(player); //판매 후 상점으로 이동
break;
case "N":
Console.WriteLine($"{Name}을(를) 장착 해제 하지 않았습니다.");
Console.WriteLine($"{Name}은(는) 판매되지 않았습니다.");
ItemSell(player);
break;
default:
Console.WriteLine("잘못된 입력입니다.");
ItemSell(player);
break;
}
}
else
{
Console.WriteLine($"{Name}은(는) 판매할 수 없습니다.");
}
}
//장착 및 장착 해제 메소드
public void Equip()
{
if (SoldOut && !Equipped)
{
Console.WriteLine($"{Name}을(를) 장착하였습니다.");
//플레이어의 공격력과 방어력 증가
player.attack += Attack;
player.defense += Defense;
//장착된 아이템의 리스트 넘버링을 [E]로 출력
//아이템의 장착 여부를 true로 설정
Equipped = true;
}
else if (Equipped)
{
Console.WriteLine($"{Name}의 장착을 해제하였습니다.");
Equipped = false;
}
}
일단 이렇게 아이템 클래스와 메서드를 잡아보았다.
다른 부분은 이름만 바뀌었으며, 큰 변경점이 없어 무리가 없는 상태.
하지만 좀 더 정돈하고 다듬어야 할 곳이 있다.
(가령, 구매와 판매 메서드의 각 조건마다 돌아가게 하는 것이 아닌, 조건문이 끝난 후 반환되도록 하는 것이다. 쓰다보니까 정리가 하나도 안되어있었음을 깨달았다.)
하지만 구현할 것은 이것뿐만이 아니다.
상점을 구현하려면 꼭 있어야하는 『아이템 리스트』
이걸 구현해야 아이템 메서드에 있는 요소들을 더하고 빼기라도 한다!!!
그리고 이 아이템 메서드를 만드는데에는 List를 사용했다.
//아이템 리스트 생성
// 이름, 설명, 가격, 공격력, 방어력 순서로 작성됨.
public static List<Item> itemList = new List<Item>()
{
new Item("수련자 갑옷", "수련에 도움을 주는 갑옷입니다.", 1000, 0, 5),
new Item("무쇠갑옷", "무쇠로 만들어져 튼튼한 갑옷입니다.", 1800, 0, 9),
new Item("스파르타의 갑옷", "스파르타 전사들이 입던 갑옷입니다.", 3500, 0, 15),
new Item("낡은 검", "쉽게 볼 수 있는 낡은 검입니다.", 600, 2, 0),
new Item("청동 도끼", "청동으로 만들어진 도끼입니다.", 1500, 5, 0),
new Item("스파르타의 창", "스파르타 전사들이 사용하던 창입니다.", 2000, 7, 0)
};
이제 이것을 상점칸에 넣어 사용해야한다.
Item의 List가 0번부터 5번까지 총 6개로 작성이 완료되었다.
new Item으로 0번에 가짜 Item을 만드는 건 어떨까?
잘 될지는 모르곘지만, 한 번 시도해보는 것도 좋을 것 같다.
3. 해야할 일
1. List 를 이용해 생성한 아이템을 상점에 넣고, 구매하면 구매한 순서대로 인벤토리에 들어가야한다.
2. 쓰다보니 점점 길어지는 함수의 길이를 단축해야한다. (중복 코드 제거, 정리)
3. 완료되면 던전을 구현해야 한다. (우선 필수 과제를 충족할 정도로 만든다.)