가짜 인벤토리 만들기
2023. 7. 26.

1.테이블 정의

테이블정의

2.

클래스생성

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class App
    {

        //생성자
        public App()
        {

            //아이템 인스턴스화
            ItemData data = new ItemData(100, "장검", 8);
            Item item = new Item(data);

            Console.WriteLine(item.data.name);
            Console.WriteLine(item.GetName());

        }


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

namespace Starcraft
{
    internal class Item
    {
        //멤버 변수
        public ItemData data;

        //생성자
        public Item(ItemData data)
        {
            this.data = data;
        }

        //메서드

        public string GetName()//아이템 데이터의 이름을 반환하는 메서드
        {
            return this.data.name;

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

namespace Starcraft
{
    internal class ItemData
    {
        public int id;
        public string name;
        public int damage;

        //생성자
        public ItemData(int id, string name, int damage) {


            this.id = id;
            this.name = name;
            this.damage = damage;
        }
    }
}

 

 

몬스터 데이터

몬스터 데이터를 추가해서 클래스 추가 및 수정하기

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class App
    {

        //생성자
        public App()
        {
            //아이템 저장하는 컬렉션
            //초기화
            Dictionary<int, ItemData> dic = new Dictionary<int, ItemData>();
            //key는 id이므로 int, ItemData를 값으로 받아옴
            dic.Add(100, new ItemData(100, "장검", 8)) ;
            dic.Add(101, new ItemData(101, "단검", 5));
            dic.Add(102, new ItemData(102, "활", 6));

            //사전에서 키로 값을 가져오기
            ItemData data = dic[100];
            Item item = new Item(data);
            Console.WriteLine(item.data.id);//100
            Console.WriteLine(item.data.name);
            Console.WriteLine(item.data.damage);

            //몬스터 데이터를 저장하는 컬렉션

            Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();
            //데이터 넣기
            dicMonsterDatas.Add(1000, new MonsterData(1000, "고블린",100,50));
            dicMonsterDatas.Add(1001, new MonsterData(1001, "트롤",101,45));
            dicMonsterDatas.Add(1002, new MonsterData(1002, "오우거",102,65));

            //고블린 데이터 가져오기
            MonsterData monsterData = dicMonsterDatas[1000];
            //dicMonsterDatas에서 1000번 키를 통해 데이터를 가져온다.
            Monster monster = new Monster(dic,monsterData);
            //몬스터 사망시 아이템을 획득하도록 하기위해 아이템 정보를 몬스터에 연결
            Console.WriteLine(monster.monsterdata.monsterid);
            Console.WriteLine(monster.monsterdata.monstername);
            Console.WriteLine(monster.monsterdata.monsterHp);
            Console.WriteLine("");
            Item dropItem = monster.Die();//몬스터 사망
            Console.WriteLine("{0}을 획득하였습니다",dropItem.GetName());
        }


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

namespace Starcraft
{
    internal class Item
    {
        //멤버 변수
        public ItemData data;

        //생성자
        public Item(ItemData data)
        {
            this.data = data;
        }

        //메서드

        public string GetName()//아이템 데이터의 이름을 반환하는 메서드
        {
            return this.data.name;

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

namespace Starcraft
{
    internal class ItemData
    {
        public int id;
        public string name;
        public int damage;

        //생성자
        public ItemData(int id, string name, int damage) {


            this.id = id;
            this.name = name;
            this.damage = damage;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    
    internal class Monster
    {
        Dictionary<int, ItemData> dicitemDatas;
        public Item item;
        public MonsterData monsterdata;
        public int monsterHp;
        //생성자
        public Monster(Dictionary<int, ItemData> dicItemDatas,MonsterData monsterdata) { 
            this.monsterdata = monsterdata;
            this.dicitemDatas = dicItemDatas;
            this.monsterHp = monsterdata.monsterHp;
        }

        //메서드

        public Item Die()
        {
            Console.WriteLine("{0}이 죽었습니다.",this.monsterdata.monstername);
            ItemData itemData = this.dicitemDatas[this.monsterdata.item_id];
            item = new Item(itemData); 
            return item;
        }

        public void HitDamage(int damage)
        {
            this.monsterHp -= damage;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class MonsterData
    {
        public int monsterid;
        public string monstername;
        public int item_id;
        public int monsterHp;

        public MonsterData(int monsterid, string monstername,int item_id,int monsterHp) { 
        
            this.monsterid = monsterid;
            this.monstername = monstername;
            this.item_id = item_id;
            this.monsterHp = monsterHp;
        }
    }
}

고블린이 죽는 코드 수정: hitdamage로 hp감소하다가 hp가 0이하가 되면 die

App.cs
Monster.cs

인벤토리 클래스를 추가하여 장비를 넣어보기

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class App
    {

        //생성자
        public App()
        {
            //아이템 저장하는 컬렉션
            //초기화
            Dictionary<int, ItemData> dic = new Dictionary<int, ItemData>();
            //key는 id이므로 int, ItemData를 값으로 받아옴
            dic.Add(100, new ItemData(100, "장검", 8)) ;
            dic.Add(101, new ItemData(101, "단검", 5));
            dic.Add(102, new ItemData(102, "활", 6));
            dic.Add(103, new ItemData(103, "도끼", 10));

            Inventory inven = new Inventory(3);
            inven.Additem(new Item(dic[100]));
            inven.Additem(new Item(dic[101])); 
            inven.Additem(new Item(dic[102]));
            Console.WriteLine("");

            Item item = inven.GetItem(100);//인벤토리에서 아이템 꺼내기 
                                           //   Console.WriteLine(inven.GetName());
                                           // Console.WriteLine(inven.Count()); //2
            inven.Count();
            Console.WriteLine("\n");
            //사전에서 키로 값을 가져오기
            ItemData data = dic[100];
            //Item item = new Item(data);
         //   Console.WriteLine(item.data.id);//100
          //  Console.WriteLine(item.data.name);
         //  Console.WriteLine(item.data.damage);

            //몬스터 데이터를 저장하는 컬렉션

            Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();
            //데이터 넣기
            dicMonsterDatas.Add(1000, new MonsterData(1000, "고블린",100,50));
            dicMonsterDatas.Add(1001, new MonsterData(1001, "트롤",101,45));
            dicMonsterDatas.Add(1002, new MonsterData(1002, "오우거",102,65));

            //고블린 데이터 가져오기
            MonsterData monsterData = dicMonsterDatas[1000];
            //dicMonsterDatas에서 1000번 키를 통해 데이터를 가져온다.
            Monster monster = new Monster(dic,monsterData);
            //몬스터 사망시 아이템을 획득하도록 하기위해 아이템 정보를 몬스터에 연결
            Console.WriteLine(monster.monsterdata.monsterid);
            Console.WriteLine(monster.monsterdata.monstername);
            Console.WriteLine(monster.monsterdata.monsterHp);
            Console.WriteLine("");
            monster.HitDamage(5);
            Console.WriteLine(monster.GetHp());
            monster.HitDamage(45);
            Console.WriteLine(monster.GetHp());
            if (monster.GetHp() <= 0)
            {
                Item dropItem = monster.Die();//몬스터 사망

                Console.WriteLine("{0}을 획득하였습니다", dropItem.GetName());
            }
        }


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

namespace Starcraft
{
    internal class Inventory
    {
        List<Item> items;
        int capacity;

        public Inventory(int capacity) {

            this.capacity = capacity;  
            //컬렉션은 사용 전 인스턴스화
            this.items = new List<Item>();
            Console.WriteLine("{0}칸 짜리 가방이 생성되었습니다.({1}/{2})", this.capacity,this.items.Count,this.capacity);
        }

        public void Additem(Item item)
        {
            this.items.Add(item);
            Console.WriteLine("{0}이 추가되었습니다.({1}/{2})", item.GetName(),this.items.Count,this.capacity);
        }

        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.GetName());
                    this.items.Remove(item);//인벤토리 제거
                    return item;
                }
            }
            return null;
        }

        public void GetName()
        {
            
        }

        public int Count()
        {
            Console.Write("인벤토리 잔여 칸: {0}/{1}",this.items.Count,this.capacity);
            return this.items.Count;
        }

    }
}

인벤토리 추가 후

인벤토리에 리스트로 넣기

 

상속관계

위의 진행상황에서 상속관계를 추가하여 코드를 수정하였다.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class App
    {

        //생성자
        public App()
        {
            //아이템 저장하는 컬렉션
            //초기화
            Dictionary<int, ItemData> dic = new Dictionary<int, ItemData>();
            //key는 id이므로 int, ItemData를 값으로 받아옴
            dic.Add(100, new ItemData(100, "장검",0, 8)) ;
            dic.Add(101, new ItemData(101, "단검",0, 5));
            dic.Add(102, new ItemData(102, "활",0, 6));
            dic.Add(103, new ItemData(103, "도끼",0, 10));
            dic.Add(104, new ItemData(104, "사슬 갑옷", 1, 0));
            dic.Add(105, new ItemData(105, "사슬 갑옷", 2, 0));

            Weapon weapon = new Weapon(dic[100]);//장검
            Armor armor = new Armor(dic[104]);
            Potion potion = new Potion(dic[105]);

            Inventory inven = new Inventory(3);
            inven.Additem(weapon);//아이템 추가
            inven.Additem(armor); 
            inven.Additem(potion);
            Console.WriteLine("");

            Item item = inven.GetItem(100);//인벤토리에서 아이템 꺼내기 
                                          
            inven.Count();
            Console.WriteLine("\n");

            Weapon item2 = (Weapon)inven.GetItem(100); //다운캐스팅
            Console.WriteLine(item.GetItemType()); //WEAPON
            Console.WriteLine("\n");

            //사전에서 키로 값을 가져오기
            ItemData data = dic[100];     

            //몬스터 데이터를 저장하는 컬렉션

            Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();
            //데이터 넣기
            dicMonsterDatas.Add(1000, new MonsterData(1000, "고블린",100,50));
            dicMonsterDatas.Add(1001, new MonsterData(1001, "트롤",101,45));
            dicMonsterDatas.Add(1002, new MonsterData(1002, "오우거",102,65));

            //고블린 데이터 가져오기
            MonsterData monsterData = dicMonsterDatas[1000];
            //dicMonsterDatas에서 1000번 키를 통해 데이터를 가져온다.
            Monster monster = new Monster(dic,monsterData);
            //몬스터 사망시 아이템을 획득하도록 하기위해 아이템 정보를 몬스터에 연결
            Console.WriteLine(monster.monsterdata.monsterid);
            Console.WriteLine(monster.monsterdata.monstername);
            Console.WriteLine(monster.monsterdata.monsterHp);
            Console.WriteLine("");
            monster.HitDamage(5);
            Console.WriteLine(monster.GetHp());
            monster.HitDamage(45);
            Console.WriteLine(monster.GetHp());
            if (monster.GetHp() <= 0)
            {
                Item dropItem = monster.Die();//몬스터 사망

                Console.WriteLine("{0}을 획득하였습니다", dropItem.GetName());
            }
        }


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

namespace Starcraft
{
    internal class Inventory
    {
        List<Item> items;
        int capacity;

        public Inventory(int capacity) {

            this.capacity = capacity;  
            //컬렉션은 사용 전 인스턴스화
            this.items = new List<Item>();
            Console.WriteLine("{0}칸 짜리 가방이 생성되었습니다.({1}/{2})", this.capacity,this.items.Count,this.capacity);
        }

        public void Additem(Item item)
        {
            this.items.Add(item);
            Console.WriteLine("{0}이 추가되었습니다.({1}/{2})", item.GetName(),this.items.Count,this.capacity);
        }

        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.GetName());
                    this.items.Remove(item);//인벤토리 제거
                    return item;
                }
            }
            return null;
        }

        public void GetName()
        {
            
        }

        public int Count()
        {
            Console.Write("인벤토리 잔여 칸: {0}/{1}",this.items.Count,this.capacity);
            return this.items.Count;
        }

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

namespace Starcraft
{
    public class Item
    {
        //멤버 변수
        public enum eItemType
        {
            WEAPON,ARMOR,POTION
        }
        public eItemType itemType;

        public ItemData data;

        //생성자
        public Item(ItemData data)
        {
            this.data = data;
            this.itemType = (eItemType)data.item_type;
        }

        //메서드

        public string GetName()//아이템 데이터의 이름을 반환하는 메서드
        {
            return this.data.name;

        }

        //아이템의 타입을 가져옴 
        public eItemType GetItemType()
        {
            return this.itemType;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class ItemData
    {
        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;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class Weapon:Item
    {       

        //생성자
        public Weapon(ItemData data) : base(data)
        {
          
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

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

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

        }
    }
}

매개변수가 있는 클래스(Item클래스)를 상속받아야 하므로 Weapon, Armor, Potion 클래스를 다음과 같이 작성하였다.

매개변수가 있는 클래스를 상속받을때의 생성자

- 파생클래스의 생성자에 base 키워드를 사용한다.

다운캐스팅

item2 변수에 inven.GetItem(100)을 넣을 때 다운캐스팅.

Weapon 클래스에 실제로 GetItem()함수는 없지만 상속받아 사용한다.

Weapon클래스. Item을 상속받음

 

'C# 기초' 카테고리의 다른 글

대리자  (0) 2023.07.27
개체 이니셜라이저  (0) 2023.07.26
namespace, 컬렉션,  (0) 2023.07.26
다차원배열  (0) 2023.07.25
배열 연습  (0) 2023.07.25
myoskin