Unity/수업내용(C#)
[3.15] 배열, 클래스 심화 - 인벤토리 구현
ljw4104
2021. 3. 15. 16:05
using System;
namespace Study06
{
/*
* 인벤토리 Inventory
* ===============멤버 변수========================
* - 아이템 관리(아이템 배열) Item[] items
* - 관리하는 아이템의 수(수용량) capacity
* ================멤버 함수========================
* - 아이템 넣기 void AddItem(Item item)
* - 아이템 빼기(가져오기) Item GetItem(string itemName)
* - 아이템 검색 bool FindItem(string itemName)
* - 아이템 목록 출력 void Print()
*
* ****************************************************************
* 아이템 Item name
* ====================멤버 변수===================================
* - 이름 string name
* - 타입(무기, 방어구, 악세서리, 포션) eItemType itemType
*/
public class App
{
public App()
{
//용량이 5인 인벤토리 생성
Inventory inventory = new Inventory(5);
//아이템 5개 넣기
Item sword = new Item("장검", 0);
Item dagger = new Item("단검", 0);
Item armor = new Item("갑옷", 1);
Item earring = new Item("귀걸이", 2);
Item potion = new Item("일반 포션", 3);
inventory.AddItem(sword);
inventory.AddItem(dagger);
inventory.AddItem(armor);
inventory.AddItem(earring);
inventory.AddItem(potion);
//아이템 리스트 출력
inventory.Print();
Console.WriteLine();
//새로운 아이템 넣기 (이미 5개가 들어가 있어서 못들어감)
Item bow = new Item("활", 0);
inventory.AddItem(bow);
Console.WriteLine();
//장검 꺼내기
Item tmp = inventory.GetItem("장검");
if (tmp != null && tmp.GetName() == "장검")
{
Console.WriteLine("장검을 꺼냈습니다.\n");
}
inventory.Print();
Console.WriteLine();
//귀걸이 꺼내기
tmp = inventory.GetItem("귀걸이");
if (tmp != null && tmp.GetName() == "귀걸이")
{
Console.WriteLine("귀걸이를 꺼냈습니다.\n");
}
inventory.Print();
Console.WriteLine();
//하얀포션 넣기
Item whitePotion = new Item("하얀포션", 3);
inventory.AddItem(whitePotion);
inventory.Print();
Console.WriteLine();
//빨간포션 넣기
Item redPotion = new Item("빨간포션", 3);
inventory.AddItem(redPotion);
inventory.Print();
Console.WriteLine();
//파란포션 넣기(용량 초과)
Item bluePotion = new Item("파란포션", 3);
inventory.AddItem(bluePotion);
inventory.Print();
Console.WriteLine();
//빨간 포션 삭제
tmp = inventory.GetItem("빨간포션");
if (tmp != null && tmp.GetName() == "빨간포션")
{
Console.WriteLine("빨간포션을 꺼냈습니다.\n");
}
inventory.Print();
Console.WriteLine();
//주황 포션 삭제시도 (없는 아이템)
tmp = inventory.GetItem("주황버섯");
if (tmp != null && tmp.GetName() == "주황포션")
{
Console.WriteLine("주황포션을 꺼냈습니다.\n");
}
else
{
Console.WriteLine("주황포션은 인벤토리안에 없습니다.\n");
}
inventory.Print();
Console.WriteLine();
//단검 검색
tmp = inventory.FindItem("단검");
if(tmp != null)
{
Console.WriteLine("단검은 인벤토리 안에 있습니다.");
}
else
{
Console.WriteLine("단검은 인벤토리 안에 없습니다.");
}
Console.WriteLine();
}
}
}
using System;
namespace Study06
{
public class Inventory
{
private Item[] items;
private int capacity;
private int pointer;
private int numOfItem;
public Inventory(int capacity)
{
items = new Item[capacity];
pointer = 0;
numOfItem = 0;
this.capacity = capacity;
}
public void AddItem(Item item)
{
if (numOfItem >= capacity)
{
Console.WriteLine("용량을 초과했습니다.");
}
else
{
//pointer를 따라 갔는데 이미 아이템이 있으면
if (this.items[this.pointer] != null)
{
while (this.items[this.pointer] != null)
{
pointer++;
pointer %= capacity;
}
this.items[this.pointer++] = item;
}
else
{
this.items[this.pointer++] = item;
}
numOfItem++;
Console.WriteLine("{0}을(를) 인벤토리에 넣었습니다.", item.GetName());
}
}
public Item GetItem(string itemName)
{
Item item = FindItem(itemName);
if (item != null)
{
for (int i = 0; i < items.Length; i++)
{
if (items[i] != null && items[i].GetName() == itemName)
{
pointer = i;
items[i] = null;
numOfItem--;
break;
}
}
}
return item;
}
public Item FindItem(string itemName)
{
Item item = null;
foreach (var i in items)
{
if (i != null && i.GetName() == itemName)
{
item = i;
break;
}
}
return item;
}
public void Print()
{
foreach (var i in items)
{
if (i != null)
{
Console.WriteLine(i);
}
}
Console.WriteLine("현재 인벤토리 내 아이템 갯수 : {0}", numOfItem);
}
}
}
using System;
namespace Study06
{
public class Item
{
private string name;
private eItemType itemType;
public enum eItemType
{
Weapon,
Armor,
Accessory,
Potion
}
public Item(string name, int itemType)
{
this.name = name;
this.itemType = (eItemType)itemType;
}
public void SetName(string name)
{
this.name = name;
}
public void SetItemType(int itemType)
{
this.itemType = (eItemType)itemType;
}
public string GetName()
{
return this.name;
}
public eItemType GetItemType()
{
return itemType;
}
public override string ToString()
{
return this != null ? "아이템 이름: " + this.name + " \t타입 : " + this.itemType : "";
}
}
}