Notice
Recent Posts
Recent Comments
Link
스토리지
과제 6 본문
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);
}
}
}
나머지 소스코드는 수업내용의 코드와 동일함.
Comments