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문을 돌리며 해결해 보았다