반응형
SMALL
문제
구현
App Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace study01
{
internal class App
{
public App()
{
Inventory inventory = new Inventory(5);
inventory.AddItem(new Weapon("장검"));
inventory.PrintItem();
inventory.DeleteItem("장검");
inventory.PrintItem();
inventory.AddItem(new Weapon("장검"));
inventory.PlusCapacity(6);
inventory.PrintItem();
inventory.AddItem(new Weapon("장검"));
inventory.AddItem(new Weapon("장검"));
inventory.AddItem(new Weapon("창"));
inventory.AddItem(new Weapon("철퇴"));
inventory.AddItem(new Weapon("채찍"));
inventory.AddItem(new Armor("황금 왕의 헬멧"));
inventory.AddItem(new Armor("도적의 상의"));
inventory.AddItem(new Armor("도적의 상의"));
inventory.AddItem(new Weapon("십문자치도"));
inventory.AddItem(new Weapon("시산혈하"));
inventory.AddItem(new Weapon("뱀눈장도"));
inventory.AddItem(new Weapon("곡검"));
inventory.AddItem(new Armor("파워 글러브"));
inventory.AddItem(new Weapon("대검"));
inventory.PrintItem();
inventory.SerchItem("곡검");
inventory.DeleteItem("곡검");
inventory.DeleteItem("도적의 상의");
inventory.DeleteItem("도적의 상의");
inventory.PrintItem();
inventory.SerchItem("곡검");
inventory.SerchItem("도적의 상의");
inventory.PrintItem();
inventory.ItemSerchByType();
inventory.PlusCapacity(6);
inventory.PrintItem();
inventory.ArrangeInventory();
}
}
}
Inventory Class
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace study01
{
internal class Inventory
{
Item[] inven;
int capacity;
int index;
public Inventory(int capacity)
{
this.capacity = capacity;
inven = new Item[this.capacity];
}
public void AddItem(Item item)
{
bool isAdded = false;
if (!inven.Contains(null))
{
Console.WriteLine($"인벤토리가 꽉차 아이템 [{item.Name}]을 넣을수 없습니다.");
}
else
{
foreach (Item newitem in inven)
{
if (newitem != null)
{
if (newitem.Name == item.Name)
{
Console.WriteLine("{0}은(는) 이미 인벤토리에 있습니다.", item.Name);
isAdded = true;
break;
}
}
}
if (!isAdded)
{
for (int i = 0; i < capacity; i++)
{
if (inven[i] == null)
{
inven[i] = item;
Console.WriteLine("{0}을(를) 추가하였습니다.", item.Name);
break;
}
}
}
}
}
public void PrintItem()
{
int sum = 0;
Console.WriteLine("\n******인벤토리 목록******\n");
for (int i = 0; i < inven.Length; i++)
{
if (inven[i] == null)
{
Console.WriteLine("[ - ]");
}
else
{
Console.WriteLine("[{0}]", inven[i].Name);
sum++;
}
}
Console.WriteLine("\n현재 인벤토리의 아이템 수량 {0}개\n\n전체 저장 가능 아이템 수량 : {1}개\n", sum,this.capacity);
Console.WriteLine("*************************\n");
}
public void DeleteItem(string name)
{
Console.WriteLine($"\n{name}을 지우기위해 인벤토리에서 찾는중....\n");
bool isRemoved = false;
for (int i = 0; i < inven.Length; i++)
{
if (inven[i] != null)
{
if (inven[i].Name == name)
{
Console.WriteLine("{0} 을(를) 삭제하였습니다.", inven[i].Name);
inven[i] = null;
isRemoved = true;
break;
}
}
}
if (!isRemoved)
{
Console.WriteLine("{0}은 인벤토리에 없어 지울수 없습니다.", name);
}
}
public void PlusCapacity(int num)
{
this.capacity += num;
Console.WriteLine("\n인벤토리 용량이 +{0} 만큼 증가하였습니다. 현재 인벤토리 최대 수량 {1} \n", num, this.capacity);
Item[] tempInven = new Item[this.capacity];
for(int i = 0; i < inven.Length; i++)
{
if (inven[i] != null)
{
tempInven[i] = inven[i];
}
}
inven= tempInven;
}
public void SerchItem(string name)
{
bool isItem = false;
Console.WriteLine($"{name} 찾는중....\n");
foreach(Item items in inven)
{
if(items !=null)
{
if (items.Name == name) isItem = true;
}
}
if(isItem)
Console.WriteLine("{0}은(는) 인벤토리에 있습니다.", name);
else
Console.WriteLine("{0}은(는) 인벤토리에 없습니다.", name);
}
public void ItemSerchByType()
{
List<Item> items = new List<Item>();
Console.WriteLine("찾고자 하는 아이템타입을 입력하세요\n[ Weapon : 1 } or [ Armor : 2 ]");
string input = Console.ReadLine();
if (input == "1")
{
foreach (Item weapon in inven)
{
if(weapon != null)
{
if (weapon.GetType().ToString().Contains("Weapon"))
{
Console.WriteLine("[ {0} ]", weapon.Name);
items.Add(weapon);
}
}
}
}
else if (input == "2")
{
foreach (Item armor in inven)
{
if(armor != null)
{
if (armor.GetType().ToString().Contains("Armor"))
{
Console.WriteLine("[ {0} ]", armor.Name);
items.Add(armor);
}
}
}
}
else
Console.WriteLine("잘못된 입력입니다.");
}
public void ArrangeInventory()
{
Console.WriteLine("\n인벤토리 아이템 정렬중.....\n");
Item[] tempInven = new Item[this.capacity];
int num = 0;
for(int i = 0; i < inven.Length; i++)
{
if(inven[i] != null)
{
tempInven[num] = inven[i];
num++;
}
}
inven = tempInven;
Console.WriteLine("\n아이템 정렬을 완료하였습니다.\n");
PrintItem();
}
}
}
Item Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace study01
{
internal class Item
{
public string Name { get; set; }
}
}
Weapon Class & Armor Class(Item Class 상속)
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace study01
{
internal class Weapon : Item
{
public Weapon(string name)
{
this.Name = name;
}
}
}
결과창은 (너무 길어서 직접 돌려보시는걸 추천드립니다 ;; ㅎㅎ.)
리스트로 했다면 좀더 편하게 했을것이라는걸 격하게 공감한 과제였습니다.
아이템 클래스 상속 관련해서도 좀 더 유연하고 많은 기능을 넣는걸 고민해보았는데 (아이템 클래스 내부에 맴버 변수 추가나 아이템들만이 가질수 있는 메서드 추가 등)
해당 기능들은 좀더 생각해볼 여지가 있을듯합니다.
반응형
LIST
'C# > 수업 과제' 카테고리의 다른 글
이분탐색 (0) | 2023.01.29 |
---|---|
무방향 그래프 2차원 배열로 구현하기 (1) | 2023.01.27 |
Jason 직렬화 역직렬화 과제 (0) | 2023.01.12 |
List<T> 와 프로퍼티, 상속을 이용한 인벤토리 과제 (0) | 2023.01.10 |
인벤토리 만들기 (클래스 배열 이용) (0) | 2023.01.09 |