가짜 인벤토리 만들기
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
인벤토리 클래스를 추가하여 장비를 넣어보기
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()함수는 없지만 상속받아 사용한다.