어제 만들었던 Text Rpg를 이어서 인벤토리를 구현해자
public interface Item
{
public string Name { get; }
public int State { get; }
public string ItemType { get; }
public string Description { get; }
}
public class Items
{
public string Name { get; set; }
public int State { get; set; }
public string ItemType { get; set; }
public string Description { get; set; }
public bool IsEquip;
public Items(string name, string itemType, int state, string description, bool isEquip)
{
Name= name;
State = state;
ItemType = itemType;
Description = description;
IsEquip = isEquip;
}
}
어제 플레이어를 만들때 사용했던 인터페이스를 다시 사용하여 아이템의 틀을 만들어 준다.
이제 만들어진 아이템의 정보를 담을 리스트를 만들어 주고 게임을 시작할 때 아이템 리스트를 초기화기능을 호출 할수 있게 만들어 준다.
public class Inventory
{
private List<Items> ItemList; //아이템 저장 리스트
public Inventory()
{
ItemList = new List<Items>(); // 아이템 리스트 초기화
}
public void AddItems(Items items) //아이템을 인벤토리에 추가하는 메서드
{
ItemList.Add(items);
}
public void ShowInven() // 인벤토리에 있는 아이템 출력
{
for (int i = 0; i < ItemList.Count; i++)
{
if (ItemList[i].IsEquip == true) Console.Write("[E] ");
Console.WriteLine($"{ItemList[i].Name} | {ItemList[i].ItemType} + {ItemList[i].State} | {ItemList[i].Description}");
}
}
public void ItemEquipManger(Player player)
{
//아이템 장착 관리
}
}
이렇게 만들어진 인벤토리는 Main에서 인벤토리 생성후 아이템 리스트를 초기화 해주고
class Program
{
static void Main(string[] args)
{
Console.WriteLine("무한의 던전에 오신 여러분 환영합니다.");
/*.... 처음 인트로 ...*/
Player player = new Player(name, select);
Inventory inventory = new Inventory();
MainStage mainStage = new MainStage(player, inventory);
mainStage.Start();
}
}
생성된 인벤토리 객채는 메인스테이지로 넘겨준다
public class MainStage(Player player, Inventory inventory)
{
bool game = true;
public void Start()
{
Items items1 = new Items("초보자 나무 목검", "공격력", 5, "초보자도 쉽게 다룰수 있는 나무 목검", false);
Items items2 = new Items("초보자 천갑옷", "방어력", 5, "초보자에게 처음 지급되는 천갑옷", false);
inventory.AddItems(items1);
inventory.AddItems(items2);
MainMenu();
}
public void InventoryUI()
{
while (game)
{
Console.Clear();
Console.WriteLine("인벤토리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
Console.WriteLine("[아이템 목록]\n");
inventory.ShowInven();
Console.WriteLine("1. 장착 관리");
Console.WriteLine("0. 나가기\n");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
string input = Console.ReadLine();
if (input == "1") ItemManagerUI();
else if (input == "0") MainMenu();
else
{
Console.WriteLine("잘못된 입력입니다. 계속하려면 아무 키나 누르세요...");
Console.ReadKey();
}
}
}
}
간단하게 아이템을 생성해주고 생성된 아이템은 인벤토리 리스트에 저장을 해주면 인벤토리UI를 통해 출력이 된다.
이어서 바로 장착 관리를 만들어 보자
public void ItemEquipManger(Player player) // 아이템 장착 관리
{
bool game = true;
while (game)
{
Console.Clear();
Console.WriteLine("인벤토리 - 장착 관리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
Console.WriteLine("[아이템 목록]\n");
for (int i = 0; i < ItemList.Count; i++)
{
Console.Write($"- {i + 1} ");
if (ItemList[i].IsEquip == true) Console.Write("[E] ");
Console.WriteLine($"{ItemList[i].Name} | {ItemList[i].ItemType} + {ItemList[i].State} | {ItemList[i].Description}");
}
Console.WriteLine("0. 나가기\n");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int select = int.Parse(Console.ReadLine());
if (select == 0) game = false;
else if (select > 0 && select <= ItemList.Count && ItemList[select - 1] != null )
{
if (ItemList[select - 1].IsEquip == true)//장비 해제
{
ItemList[select - 1].IsEquip = false;
if (ItemList[select - 1].ItemType == "공격력") player.EquipAttack -= ItemList[select - 1].State;
else if (ItemList[select - 1].ItemType == "방어력") player.EquipDefense -= ItemList[select - 1].State;
}
else //장비 장착
{
ItemList[select - 1].IsEquip = true;
if (ItemList[select - 1].ItemType == "공격력") player.EquipAttack += ItemList[select - 1].State;
else if (ItemList[select - 1].ItemType == "방어력") player.EquipDefense += ItemList[select - 1].State;
if (ItemList[select - 1].ItemType == "공격력")// 선택한 아이템이 공격력이면
{
//공격력 아이템은 모두 false로 변경
for (int i = 0; i < ItemList.Count; i++)
{
if (ItemList[i].ItemType == "공격력" && ItemList[i].IsEquip == true)
{
ItemList[i].IsEquip = false;
player.EquipAttack -= ItemList[i].State;
}
}
ItemList[select - 1].IsEquip = true;
player.EquipAttack += ItemList[select - 1].State;
}
else if (ItemList[select - 1].ItemType == "방어력")// 선택한 아이템이 공격력이면
{
//공격력 아이템은 모두 false로 변경
for (int i = 0; i < ItemList.Count; i++)
{
if (ItemList[i].ItemType == "방어력" && ItemList[i].IsEquip == true)
{
ItemList[i].IsEquip = false;
player.EquipDefense -= ItemList[i].State;
}
}
ItemList[select - 1].IsEquip = true;
player.EquipDefense += ItemList[select - 1].State;
}
}
}
else
{
Console.WriteLine("잘못된 입력입니다. 계속하려면 아무 키나 누르세요...");
Console.ReadKey();
}
}
}
현재 if문으로 도배를 해놔서 가독성이 엄청 떨어지고 중복으로 또 장착했다가 해제하는데 이렇게 구현된 이유가
장착된 아이템과 같은 타입의 장비가 장착 되어있으면 장착된 아이템을 해제하고 장착을 하기위해 이렇게 구현이 되었다.
사실 저도 이게 맞는지 모르겠지만 엄청 가독성이 떨어지고 문제가 많다는 것은 알고 있지만 일단 완성은 했으니....
이 짤처럼 어쨋든 작동하니까... 아무튼 작동은 하니까....
'내일배움캠프 > TIL' 카테고리의 다른 글
TEXT RPG 만들기(기본 틀 다지기, 상태창 만들기) (0) | 2025.02.03 |
---|---|
2025-01-23 Slider(슬라이더)로 오디오 볼륨 조절 (0) | 2025.01.23 |
2025-01-22 List<T>, Array, Dictionary(Tkey, TValue) 비교 (0) | 2025.01.22 |
2025-01-21 Dictionary(딕셔너리) (0) | 2025.01.21 |
2025-01-20 GitHub 사용일지 (0) | 2025.01.20 |