EasyCastleUNITY

컬렉션을 활용한 아이템 및 인벤토리 본문

C#프로그래밍

컬렉션을 활용한 아이템 및 인벤토리

EasyCastleT 2023. 7. 26. 16:06

ItemData: 아이템의 정보를 가지고 있는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
using System.Xml.Linq;

namespace LearnDotnet
{
    //아이템의 정보를 나타내는 클래스 
    internal class ItemData
    {
        public ItemData data;

        public int id;
        public string name;
        public int damage;
        public int item_type;
        //생성자
        public ItemData(int id, string name,int item_type, int damage)
        {
            this.id = id;
            this.name = name;
            this.damage = damage;
            this.item_type = item_type;
        }


    }
}

Item: 실제로 아이템을 생성하는 클래스, Weapon, Potion, Armor의 부모클래스 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Item
    {
        public enum eItemType
        {
            WEAPON,ARMOR,POTION
        }
        public ItemData data;
        public eItemType itemType;
        //생성자 
        public Item()
        {

        }
        public Item(ItemData data)
        {
            this.data = data;
            this.itemType = (eItemType)data.item_type;
           // Console.WriteLine("{0}이 생성되었습니다", this.data.name);
        }
        public string GetName()
        {
            return this.data.name;
        }
        public eItemType GetItemType()
        {
            return this.itemType;
        }
    }
}

MonsterData: 몬스터의 정보를 저장하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    //몬스터의 정보를 나타내는 클래스 
    internal class MonsterData
    {
        public MonsterData monsterData;

        public int id;
        public string name;
        public int hp;
        public int item_id;

        //생성자
        public MonsterData(int id, string name,int hp,int item_id)
        {
            this.id = id;
            this.name = name;
            this.item_id = item_id;
            this.hp = hp;
        }
    }
}

Monster: 실제 몬스터를 생성하는 클래스 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Monster
    {
        public MonsterData monsterData;
        Dictionary<int, ItemData> dic;
        int hp;
        public Monster(Dictionary<int, ItemData> dic,MonsterData data)
        {
            this.monsterData = data;
            this.dic = dic;
            this.hp = data.hp;
        }

        public Item Die()
        {
         //   if (this.hp <= 0)
        //    {
                monsterData.hp = 0;
                Console.WriteLine("{0}이 죽었습니다", this.monsterData.name);
                Item item = new Item(dic[monsterData.item_id]);
                return item;
          //  }
           // else return null; 
        }

        public void Attack()
        {

        }
        public void HitDamage(int damage)
        {
            this.hp -= damage;
        }

        public void StateCheck()
        {

        }
    }
}

HeroData: 영웅의 정보를 저장하고 있는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class HeroData
    {
        public int id;
        public string name;
        public int damage;
        public int hp;

        public HeroData(int id, string name, int damage,int hp)
        {
            this.id = id;
            this.name = name;
            this.damage = damage;
            this.hp = hp;
        }
    }
}

Hero: 실제 영웅을 생성하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Hero
    {
        //멤버 변수
        public HeroData data;
        int hp;
        //생성자
        public Hero(HeroData data)
        {
            this.data = data;
        }
        //멤버 메서드
        public void Attack()
        {

        }
        public void Equip()
        {

        }

        public void HitDamage(int damage)
        {
            this.hp -= damage;
        }

        public void Die()
        {

        }
    }
}

Weapon: 아이템 중 weapon을 관리하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Weapon:Item
    {
        //생성자
        public Weapon(ItemData data ):base (data)
        {

        }
    }
}

Armor: 아이템 중 armor를 관리하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Armor:Item
    {
        public Armor(ItemData data): base (data){

        }
    }
}

Potion: 아이템 중 potion을 관리하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Potion:Item
    {
        public Potion(ItemData data): base(data)
        {

        }
    }
}

인벤토리

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    internal class Inventory
    {
        //멤버 변수
        List<Item> items;
        int capacity;
        int count;
        //생성자 
        public Inventory(int capacity)
        {
            this.capacity = capacity;
            this.items = new List<Item>();
            Console.WriteLine("{0}칸짜리 가방이 생성되었습니다  [({1})/({0})]", this.capacity, items.Count);
        }

        //아이템 저장
        public void AddItem(Item item)
        {
            items.Add(item);
            
            if (count >= this.capacity)
            {
                Console.WriteLine("공간이 부족합니다");
                count = this.capacity;
            }

            else
            {
                count++;
                Console.WriteLine("{0}이(가) 추가 되었습니다  [({1})/({2})]", item.data.name, items.Count, this.capacity);
            }

        }
        //인벤토리 현재 상태 보여줌
        public void PrintInventory()
        {
            Console.WriteLine("----아이템 목록-----");
            foreach (Item item in this.items)
            {
                Console.WriteLine("{0}", item.data.name);
            }
            Console.WriteLine();
        }

        //ID로 찾아서 꺼내기(가장 먼저 찾은)
        public Item GetItem(int id)
        {
            for(int i=0; i<this.items.Count; i++)
            {
                Item item = this.items[i];
                if(item.data.id == id)
                {
                    Console.WriteLine("{0} 아이템을 찾았습니다",item.data.name);
                    this.items.Remove(item);  //인벤토리 제거
                    count--;
                    return item;
                }
            }
            return null;
        }
        public int Count()
        {
            return this.count;
        }
    }
}

App: 실행

using System;
using System.Collections;
using System.Collections.Generic;
//using 지시문을 사용하면 네임스페이스에 정의된 형식을 해당 형식의 정규화된 네임스페이스를 지정하지 않고도 사용할 수 있습니다.
namespace LearnDotnet
{
    public class App
    {
        //생성자 
        public App()
        {
            //초기화
            Dictionary<int, ItemData> itemDic = new Dictionary<int, ItemData>(); ;
            itemDic.Add(100,new ItemData(100, "장검", 0,8));
            itemDic.Add(101,new ItemData(101, "단검", 0, 5));
            itemDic.Add(102,new ItemData(102, "활", 0, 6));
            itemDic.Add(103,new ItemData(103, "도끼", 0, 10));
            itemDic.Add(104,new ItemData(104, "사슬 갑옷", 0, 0));
            itemDic.Add(105,new ItemData(105, "체력 물약", 0, 0));

            //사전에서 키로 값을 가져오기 
            //고블린을 잡았다
            //장검이 나왔다!
            ItemData data = itemDic[100];
            Item item = new Item(data);
            //Console.WriteLine(item.data.id); //100
            //Console.WriteLine(item.data.name); //장검
            //Console.WriteLine(item.data.damage); //8

            //몬스터 데이터를 저장하는 컬렉션
            Dictionary<int, MonsterData> monsterDic = new Dictionary<int, MonsterData>();
            monsterDic.Add(1000, new MonsterData(1000, "고블린",15,100));
            monsterDic.Add(1001, new MonsterData(1001, "트롤",20,101));
            monsterDic.Add(1002, new MonsterData(1002, "오우거",30,102));
            //고블린 데이터 가져오기 
            MonsterData monsterData = monsterDic[1000];
            Monster monster = new Monster(itemDic,monsterData);
            //Console.WriteLine(monster.monsterData.id); //1000
            //Console.WriteLine(monster.monsterData.name); //고블린
            //Console.WriteLine(monster.monsterData.item_id); //100

            Item dropItem = monster.Die();
            Console.WriteLine(dropItem.data.name); //장검

            Inventory inven = new Inventory(3);
            inven.AddItem(new Item(itemDic[100])); //장검추가
            inven.AddItem(new Item(itemDic[101])); //단검추가
            inven.AddItem(new Item(itemDic[102])); //활 추가
            Item itemInven = inven.GetItem(100);
            Console.WriteLine(itemInven.GetName());
            //Console.WriteLine(inven.Count());
            inven.PrintInventory();
            //단검
            //활
            inven.AddItem(new Item(itemDic[100]));
            inven.AddItem(new Item(itemDic[103]));//공간이 부족합니다
            //상속 확인
            Weapon weapon = new Weapon(itemDic[100]);
            Armor armor = new Armor(itemDic[104]);
            Potion potion = new Potion(itemDic[105]);

            Inventory inven1 = new Inventory(3);
            inven1.AddItem(weapon);
            inven1.AddItem(armor);
            inven1.AddItem(potion);

            Weapon item2 = (Weapon)inven1.GetItem(100); //다운캐스팅
            Console.WriteLine(item2.GetItemType());


            //히어로 데이터를 저장하는 컬렉션 
            Dictionary<int, HeroData> heroDic = new Dictionary<int, HeroData>();
            //히어로 데이터 가져오기 
            heroDic.Add(1, new HeroData(10000, "Arthor", 2,25));

        }
    }
}

결과

'C#프로그래밍' 카테고리의 다른 글

디자인 패턴  (0) 2023.07.26
DataManager  (0) 2023.07.26
2048 (이동 까지만 구현)  (0) 2023.07.25
2차원 배열을 통한 맵 이동 (워프 히어로)  (0) 2023.07.25
2차원 배열 응용, 맵 만들기  (0) 2023.07.25