C#/연습장

배열을 이용한 인벤토리 만들기 2

Game Client Lee Hwanguk 2023. 1. 19. 17:35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inventory3
{
    internal class App
    {
        //1.AddItem 아이템 추가
        //2.GetItemCount 들어있는 아이템 갯수 출력
        //3.PrintItems 인벤토리 시각화
        //4.FintItemId 인덱스의 id 로 name과 damage 정보 불러오기
        //5.Arrange 인덱스 요소를 제거한 후 정렬해준다
        public App()
        {
            Inventory inventory = new Inventory(5);
            Console.WriteLine();

            inventory.AddItem(new Item(100,"장검",8)); //AddItem 메서드 호출과 Item의 속성을 부여했다
            //index가 증가하고 다음칸에 잘 들어가는지 확인해보자
            inventory.AddItem(new Item(101, "단검", 3));
            inventory.AddItem(new Item(102, "도끼", 9));
            
            Console.WriteLine();

            int itemsCount=inventory.GetItemCount();
            Console.WriteLine("{0}개의 아이템이 들어있습니다.",itemsCount);
            Console.WriteLine();

            inventory.PrintItems();
            Console.WriteLine();

            inventory.FindItemId(100);
            Console.WriteLine();
            
            inventory.Arrange(101);
            Console.WriteLine();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inventory3
{
    internal class Inventory
    {
        public Item[] items;
        public int capacity;
        public int index = 0;
        int count=0;
        public Inventory(int capacity) 
        {
            this.capacity = capacity;
            this.items = new Item[capacity];
            Console.WriteLine("{0}칸 인벤 생성",items.Length);
        }

        public void AddItem(Item item)
        {
            //메서드 호출 시 Item 인스턴스 생성 후 속성을 매개변수로 부여
            //App에서 추가할때 Item의 속성을 부여해주자(이렇게 하면 AddItem메서드는 매번 장검만 추가한다)
            //items[0] = item0; //매서드가 호출될때마다 배열의 다음 인덱스에 넣고싶다. 지금은 호출될때마다 [0]에 덮어 씌우기
            //this.items[index] = item0; //맴버로 지정된 index=0에 요소를 추가하고
            this.items[index] = item; //매개변수로 받은 item을 index에 추가
            index++; //다음 칸에 넣기 위해 index를 1 증가시켜준다
            Console.WriteLine("아이템 추가 ID:{0} NAME:{1} DAMAGE:{2}",item.id, item.name, item.damage); //잘들어갔나 확인
            
        }
        public int GetItemCount() //반환할 값을 타입을 void에 대신 넣어주자 여기를 잘 까먹는다
        {
            ////items.Length를 return 한 후 App 에서 itemsCount를 출력해보자
            //int cnt = items.Length;
            //return cnt; //반환값

            //itmes 요소가 null 이 아니라면 count 맞다면 break로 갯수를 세보자
            for(int i=0; i<items.Length; i++) 
            {
                if (items[i] != null) //만약 items[i]의 요소가 null(비어있다)가 아니라면 ? 
                {
                    count++; //매개변수인 count를 1 증가하며 반복
                }
                else
                {
                    break;
                }

            }
            return count; //for 반복이 끝난 후 증가된 count의 값 반환
            
        }

        public void PrintItems()
        {
            //for문 , foreach문을 통해 모든 아이템 출력
            //요소가 있다면 items.name 없다면 [  ]출력
            for(int i=0; i< items.Length; i++)
            {
                if (items[i] != null)
                {
                    Console.WriteLine(items[i].name);
                }
                else
                {
                    Console.WriteLine("[    ]");
                }
            }
            
        }

        public void FindItemId(int id) //id(매개변수로받은)로 item 의 name과 damage 출력
        {
            for (int i=0; i< items.Length; i++)
            {
                if (id == items[i].id)
                {
                    Console.WriteLine("아이템을 찾았다 NAME:{0} DAMAGE:{1}", items[i].name, items[i].damage);
                    break;
                }
                else if (id != items[i].id)
                {
                    Console.WriteLine("아이템이 없음");
                    break;
                }
            }
        }

        public void Arrange(int id) //만약 배열의 순서대로 아이템이 들어오는게 아닌 랜덤하게 들어온다면? 정렬해주기
        {
            //1.매개변수로 들어온 아이템(int id)을 제거
            for (int i=0; i< items.Length; i++)
            {
                if(id== items[i].id)
                {
                    items[i] = null;
                    break;
                }
            }
            //2.다시 PrintItems 메서드를 호출하여 확인
            PrintItems();
            Console.WriteLine("인벤토리 정렬중...");
            Console.WriteLine();

            //Item[]arr= new Item[items.Length]; //새로운 배열을 만들고
            //int arrIdx = 0; //초기화할 값 할당
            //for(int i=0; i<this.items.Length; i++) //for문을 돌리며 null 체크와 동시에 값을 할당
            //{
            //    if (this.items[i]!=null) //null이 아니라면
            //    {
            //        arr[arrIdx++]= this.items[i]; //arr에 추가
            //    }
            //    this.items = arr; //arr배열을 items에 할당
            //}

            for(int i=0; i< items.Length; i++) 
            {
                if (items[i] != null) //[0] != null//[1] ==null
                {
                    int index = i; //index=0
                    for(int j=0; j<i; j++) 
                    {
                        index--; //1 0
                        items[index]=items[i];  // item[1] null==  item[2] : 도끼
                        items[i]=null;
                        break;
                        // item[1] 도끼 = item[2] : null
                    }                              // item[0] 검 == item[2] : null
                }
            }
            //for(int i=0; i<items.Length; i++)
            //{
            //    if (items[i]==null)
            //    {
            //        this.index = i;
            //        break;
            //    }
            //}
            PrintItems(); //다시 PrintItems 메서드 호출하고 확인
        }

    }
}

#아이탬을 추가하고,출력하고,갯수세는건 어렵지않았다

#정렬이 어렵다 옮긴 인덱스의 값을 null로 초기화 하지 않으면 복사되는 오류가 있었다

#Arrange 메서드에서 빈배열을 만들고 정렬하는 방법도 있지만 for문을 돌리며 해결해 보았다