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 : "";
        }
    }
}