K-digital traning/C#프로그래밍

1차원 배열 인벤토리

내꺼블로그 2023. 7. 25. 09:25

(1)Item.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Item
    {
        //멤버변수
        public string ItemName { get; set; }
        
        
        //생성자
        public Item(string ItemName)
        {
            this.ItemName = ItemName;
        }
    }
}

 

 

 

(2)Inventory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace LearnDotnet
{
    
    internal class Inventory
    {
        //멤버변수
        int capacity;
        Item[ , ] items;
        int[] itemIndex;
        int index=-1;

        //생성자
        public Inventory(int capacity) 
        {
            this.capacity = capacity;
            items = new Item[this.capacity, this.capacity];
            itemIndex = new int[this.capacity];
        }

        
        //아이템 저장 메서드
        public void AddItem(Item item)
        {
            int foundItemIndex = GetItemIndex(item.ItemName);
            if (foundItemIndex < 0) { foundItemIndex = ++index; }       //아이템 존재하지 않을 시 새로운 인덱스에 저장
            items[foundItemIndex, itemIndex[foundItemIndex]] = item;
            itemIndex[foundItemIndex]++;        //아이템 갯수
        }
        

        //찾고자 하는 아이템의 인덱스 탐색
        int GetItemIndex(string itemName)
        {
            int getItemIndex= -1;           //찾고자 하는 아이템이 존재하지 않으면 -1을 반환
            for (int i = 0; i <= index; i++)
            {
                if (itemName == items[i, 0].ItemName)
                {
                    getItemIndex = i;
                    break;
                }
            }
            return getItemIndex;
        }

        //아이템 꺼내는 메서드
        public Item GetItemByName(string name) 
        {
            Item foundItem = null;      //아이템이 존재하지 않을 시 null 반환
            int foundItemIndex = GetItemIndex(name);

            if(foundItemIndex >= 0)
            {
                foundItem = items[foundItemIndex, 0];
                itemIndex[foundItemIndex]--;
                items[foundItemIndex, itemIndex[foundItemIndex]] = null;
                if (itemIndex[foundItemIndex] == 0)         //꺼내고 남은 아이템이 없을 시 재정렬
                {
                    for (int i = foundItemIndex; i < this.index; i++)
                    {  
                       for(int j = 0; j < itemIndex[i+1]; j++)
                        {
                            items[i, j] = items[i + 1, j];
                        }
                        itemIndex[i] = itemIndex[i + 1];
                    }
                    for(int i = 0; i < itemIndex[this.index]; i++)
                    {
                        items[this.index, i] = null;
                    }
                    itemIndex[this.index--] = 0;
                       
                }
            }
            return foundItem;
        }


        //아이템 출력
        public void PrintAllItems()
        {
            for(int i=0;i< this.capacity; i++)
            {
                if (itemIndex[i]> 0)
                    Console.WriteLine("{0} X {1}", this.items[i, 0].ItemName, this.itemIndex[i]);
                else Console.WriteLine("[        ]");
            }
        }
    }
}

 

 

 

 

(3)App.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class App
    {
        
        //생성자
        public App() 
        {
            Inventory inven = new Inventory(5);
            inven.AddItem(new Item("장검"));
            inven.AddItem(new Item("단검"));
            inven.AddItem(new Item("활"));
            inven.AddItem(new Item("장검"));
            inven.AddItem(new Item("단검"));
            inven.AddItem(new Item("단검"));
            inven.AddItem(new Item("활"));

            inven.PrintAllItems();

            for (int i = 0; i < 1; i++)
            {
                string searchName = "장검";
                Item item = inven.GetItemByName(searchName);
                if (item != null)
                {
                    Console.WriteLine("{0}을 꺼냈습니다.", item.ItemName);
                }
                else
                {
                    Console.WriteLine("{0}을 찾을수 없습니다.", searchName);
                }

                inven.PrintAllItems();
            }

            for (int i = 0; i < 4; i++)
            {
                string searchName = "단검";
                Item item = inven.GetItemByName(searchName);
                if (item != null)
                {
                    Console.WriteLine("{0}을 꺼냈습니다.", item.ItemName);
                }
                else
                {
                    Console.WriteLine("{0}을 찾을수 없습니다.", searchName);
                }

                inven.PrintAllItems();
            }
        }
    }
}

 

 

 

 

결과