Unity/수업내용(C#)

[3.16] List 컬렉션 연습 1 - 수정(주석추가)

ljw4104 2021. 3. 16. 13:14
using System;
using System.Collections.Generic;

namespace Study07
{
    public class App
    {
        private readonly Inventory inventory;
        public App()
        {
            //Item 리스트 선언 및 할당
            List<Item> items = new List<Item>
            {
                //요소 추가
                new Item("장검", 20, eItemType.WEAPON),
                new Item("단검", 10, eItemType.WEAPON),
                new Item("투구", 15, eItemType.ARMOR)
            };

            inventory = new Inventory(items);

            while (true)
            {
                int menu = PrintMenu();
                switch (menu)
                {
                    case 1:
                        InsertItem();
                        break;
                    case 2:
                        SearchItem();
                        break;
                    case 3:
                        DeleteItem();
                        break;
                    case 4:
                        ChangeItem();
                        break;
                    case 5:
                        PrintItem();
                        break;
                    case 6:
                        Gambling();
                        break;
                    case 7:
                        return;
                    default:
                        Console.WriteLine("다시 입력해주세요.\n");
                        break;
                }
            }
        }

        private int PrintMenu()
        {
            int menu;
            Console.WriteLine("1: 삽입, 2: 검색, 3: 삭제, 4: 수정, 5: 출력, 6: 도박, 7: 종료");
            Console.Write("숫자를 입력해주세요 : ");

            //숫자 이외에 다른 값이 들어가는가?
            try
            {
                menu = Convert.ToInt32(Console.ReadLine());
            }
            catch (FormatException e)
            {
                Console.WriteLine("에러발생 : {0}", e.Message);
                menu = 9;
            }
            

            return menu;
        }

        private void InsertItem()
        {
            Console.Write("\n아이템 이름을 입력하세요 : ");
            string itemName = Console.ReadLine();

            Console.Write("아이템의 가격을 입력하세요 : ");
            int itemPrice = Convert.ToInt32(Console.ReadLine());

            Console.Write("아이템 타입을 입력하세요(WEAPON:0, ARMOR:1, ACCESSORY:2, POTION:3) : ");
            int itemType = Convert.ToInt32(Console.ReadLine());

            inventory.AddItem(new Item(itemName, itemPrice, (eItemType)itemType));
            Console.WriteLine();
        }

        private void SearchItem()
        {
            Console.Write("\n아이템 이름을 입력하세요. : ");
            string itemName = Console.ReadLine();

            if (inventory.FindItem(itemName) != null)
            {
                Console.WriteLine("{0}은(는) 인벤토리 안에 있습니다.", itemName);
            }
            else
            {
                Console.WriteLine("{0}은(는) 인벤토리 안에 없습니다.", itemName);
            }
            Console.WriteLine();
        }

        private void DeleteItem()
        {
            Console.Write("\n아이템 이름을 입력하세요. : ");
            string itemName = Console.ReadLine();

            if (inventory.GetItem(itemName))
            {
                Console.WriteLine("{0}이(가) 삭제되었습니다.", itemName);
            }
            else
            {
                Console.WriteLine("존재하지 않는 아이템입니다.");
            }
            Console.WriteLine();
        }

        private void ChangeItem()
        {
            Console.Write("\n변경할 아이템 이름을 입력하세요.");
            string oldItemName = Console.ReadLine();

            Console.Write("새로운 아이템 이름을 입력하세요 : ");
            string itemName = Console.ReadLine();

            Console.Write("새로운 아이템의 가격을 입력하세요 : ");
            int itemPrice = Convert.ToInt32(Console.ReadLine());

            Console.Write("새로운 아이템 타입을 입력하세요(WEAPON:0, ARMOR:1, ACCESSORY:2, POTION:3) : ");
            int itemType = Convert.ToInt32(Console.ReadLine());

            if (inventory.ChangeItemValue(oldItemName, new Item(itemName, itemPrice, (eItemType)itemType)))
            {
                Console.WriteLine("변경이 완료되었습니다.");
            }
            else
            {
                Console.WriteLine("변경이 실패했습니다.");
            }
            Console.WriteLine();
        }

        private void PrintItem()
        {
            Console.WriteLine(inventory);
        }

        private void Gambling()
        {
            Random rnd = new Random();
            int prob = rnd.Next(1, 101);

            Console.Write("\n담보 아이템 이름을 입력해주세요 : ");
            string itemName = Console.ReadLine();

            Item item = inventory.FindItem(itemName);
            if (item == null)
            {
                Console.WriteLine("없는 아이템입니다.");
                return;
            }

            if (prob >= 50)
            {
                Console.WriteLine("도박 성공, 금액 : {0} => {1}", item.price, item.price * 30);
                item.price *= 30;
            }
            else
            {
                inventory.GetItem(itemName);
                Console.WriteLine("도박실패, 담보는 뺏겼습니다.");
            }
            Console.WriteLine();
        }
    }
}
using System;
using System.Collections.Generic;

namespace Study07
{
    public class Inventory
    {
        private List<Item> items;

        //기본생성자
        public Inventory()                  
        {
            items = new List<Item>();                                   //기본생성자 : 새로운 List 인스턴스를 생성
        }

        //매개변수가 있는 생성자
        public Inventory(List<Item> items)
        {
            this.items = items;                                         //원래 있던 리스트를 대입
        }

        //List 맨 뒤에 아이템 추가하는 함수
        public void AddItem(Item item)
        {
            if (item != null)                                           //Item이 null이면 아무것도 안함
            {
                items.Add(item);                                        //List의 맨마지막에 삽입
            }
        }

        //List안에 있는 아이템을 성공적으로 뺐는가 여부를 반환하는 함수
        public bool GetItem(string itemName)
        {
            Item item = FindItem(itemName);                             //itemName을 멤버변수로 가진 인스턴스를 찾음
            return items.Remove(item);                                  //위에서 찾은 인스턴스를 반환. 그런 이름이 없을 때에는 null을 반환
        }

        //List안에 해당 이름을 가진 아이템이 있는지 확인하고 반환하는 함수
        public Item FindItem(string itemName)
        {
            Item item = items.Find(x => x.name == itemName);        //x.name(현 인스턴스의 이름)과 itemName이 같은 인스턴스를 반환
            return item;                                            //찾은 인스턴스를 반환
        }

        //List 안에 있는 아이템을 새로운 아이템으로 교체하고 성공여부를 반환하는 함수
        public bool ChangeItemValue(string oldItem, Item newItem)
        {
            int index = items.FindIndex(x => x.name == oldItem);    //x.name(현 인스턴스의 이름)과 itemName이 같은 인스턴스의 List 안에서의 인덱스를 반환
            items[index] = newItem;                                 //위에서 반환받은 인덱스에 새로운 인스턴스를 대입. 원래것은 사라짐
            return newItem.name == items[index].name;               //제대로 교체 됐는가 여부를 반환
        }

        //ToString() 함수의 오버라이딩, 객체의 출력방식을 미리 정해놓음.
        public override string ToString()
        {
            string s = String.Empty;
            foreach(var i in items)
            {
                s += i.ToString() + '\n';
            }
            return '\n' + s;
        }
    }
}
using System;

namespace Study07
{
    public enum eItemType
    {
        WEAPON,
        ARMOR,
        ACCESSORY,
        POTION
    }
    public class Item
    {
        public string name;
        public int price;
        public eItemType itemType;
        public Item()
        {

        }

        public Item(string name, int price, eItemType itemType)
        {
            this.name = name;
            this.price = price;
            this.itemType = itemType;   
        }

        public override string ToString()
        {
            return this.name + " => 가격 : " + this.price + " 타입 : " + this.itemType;
        }
    }
}

도박으로 담보인 아이템이 다 뺏겨서 마지막에 출력에 아무것도 나오지 않는 상황.
아이템 삽입
아이템 삭제. List는 요소 삭제 시, 자동으로 빈칸이 정렬이 됨.

Inventory 클래스의 ToString() 메소드를 오버라이딩해서 Inventory 객체 자체를 출력하면 안에 있는 List를 출력할 수 있게 해놓았다.

 

* List.FindIndex (predicate <T>) : 매개변수의 조건에 만족하는 객체의 인덱스를 반환한다. 매개변수는 람다식이 들어감.

람다식 : docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions