스토리지

과제 6 본문

Unity/수업과제

과제 6

ljw4104 2021. 3. 16. 00:41

Study06.exe
0.01MB

Q. 중간에 빈칸이 뚫렸을 때, 한 칸씩 앞으로 오도록 하는코드.

    - 처음은 마지막으로 삭제된 인덱스를 저장해 그 인덱스에 이미 값이 있다면 탐색

 

 

AddItem 부분 대신 삭제할 때 바로바로 땡겨오는 그런 코드를 작성하였다.

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
            {
                for (int i = 0; i < capacity; i++)
                {
                    //동일한 아이템이 이미 있는 경우
                    if (items[i] != null && items[i].GetName() == item.GetName())
                    {
                        items[i].SetNumber(items[i].GetNumber() + 1);
                        this.numOfItem++;
                        Console.WriteLine("{0}을(를) 인벤토리에 넣었습니다.", item.GetName());
                        return;
                    }
                }
                this.items[pointer++] = item;
                items[pointer - 1].SetNumber(items[pointer - 1].GetNumber() + 1);
                this.numOfItem++;
                Console.WriteLine("{0}을(를) 인벤토리에 넣었습니다.", item.GetName());
            }
        }

        public Item GetItem(string itemName)
        {
            Item item = FindItem(itemName);
            if (item != null)
            {
                //동일한 아이템이 여러개 있는 경우
                if (item.GetNumber() > 1)
                {
                    item.SetNumber(item.GetNumber() - 1);
                    numOfItem--;
                    return item;
                }
                for (int i = 0; i < items.Length; i++)
                {
                    if (items[i] != null && items[i].GetName() == itemName)
                    {
                        pointer = i;
                        items[i] = null;
                        numOfItem--;

                        for (int j = pointer; j < items.Length - 2; j++)
                        {
                            if (items[j + 1] != null)
                            {
                                items[j] = items[j + 1];
                            }
                            else
                            {
                                items[j] = null;
                                pointer = j;
                                break;
                            }
                        }
                        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;
        }

        //Inventory 안에 있는 아이템들 출력
        public void Print()
        {
            foreach (var i in items)
            {
                if (i != null)
                {
                    Console.WriteLine(i);   //Item 클래스내 ToString 메소드 오버라이딩으로 인해 객체 그대로 출력 가능
                }
            }
            Console.WriteLine("현재 인벤토리 내 아이템 갯수 : {0}", numOfItem);
        }
    }
}

나머지 소스코드는 수업내용의 코드와 동일함.

'Unity > 수업과제' 카테고리의 다른 글

과제 8  (0) 2021.03.17
과제 7  (0) 2021.03.17
과제 5  (0) 2021.03.14
과제 4  (0) 2021.03.12
과제3  (0) 2021.03.10
Comments