EasyCastleUNITY

JSON 파일 및 대리자 응용 연습 본문

C#프로그래밍

JSON 파일 및 대리자 응용 연습

EasyCastleT 2023. 7. 28. 13:12

-------------------------------------------------------------------데이터-----------------------------------------------------------------------------

ItemData

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

namespace LearnDotnet
{
    //기초 정보 -> 생성자 생성 안 함
    public class ItemData
    {
        public int id;
        public string name;
        public int damage;
    }
}

MonsterData

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

namespace LearnDotnet
{
    //기초 정보 -> 생성자 없음
    public class MonsterData
    {
        public int id;
        public string name;
        public int item_id;
        public int maxHp;
    }
}

HeroData

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

namespace LearnDotnet
{
    public class HeroData
    {
        public int id;
        public string name;
        public int damage;
        public int maxHp;
        public HeroData(int id, string name, int damage)
        {
            this.id = id;
            this.name = name;
            this.damage = damage;
            this.maxHp = 30;
        }
    }
}

---------------------------------------------------------------------객체 생성 클래스---------------------------------------------------------------------

Item

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

namespace LearnDotnet
{
    public class Item
    {
        private ItemData data;

        public string Name
        {
            get
            {
                return this.data.name;
            }
        }
        public Item(ItemData data)
        {
            this.data = data;
        }
        public int GetID()
        {
            return this.data.id;
        }
        public int GetDamage()
        {
            return this.data.damage;
        }
    }
}

Monster

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

namespace LearnDotnet
{
    public class Monster
    {
        private MonsterData data;
        private int maxHp;
        private int hp;
        public Action onDie;
        public Monster(MonsterData data)
        {
            this.data = data;
            this.maxHp = data.maxHp;
            this.hp = this.maxHp;

            Console.WriteLine("{0} , 체력 : {1}/{2}",data.name,hp,maxHp);
        }

        public void HitDamage(int damage)
        {
            this.hp -= damage*100;
            if (this.hp <= 0)
            {
                this.hp = 0;
            }
            Console.WriteLine("{0}이(가) 공격받았습니다. \n {0}의 체력 : {1}/{2}"
                , this.data.name,hp,maxHp);
           //죽으면 Die 함수 실행
           if(this.hp <= 0)
            {
                this.Die();
            }
        }

        public int GetMonsterItemId()
        {
            return this.data.item_id;
        }

        public string GetMonsterName()
        {
            return this.data.name;
        }
		//Die에서 대리자 onDie 불러옴 ---> Game 클래스로 넘어감 
        private void Die()
        {
            Console.WriteLine("몬스터 {0}가(이) 죽었습니다", this.data.name);
            //대리자 호출
            this.onDie(); 
        }
    }
}

Hero

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

namespace LearnDotnet
{
    public class Hero
    {
        private HeroData data;
        private int maxHp;
        private int hp;
        private int damage;
        private Inventory bag;
        private Item equipItem;

        public Hero(HeroData data)
        {
            this.data = data;
            this.maxHp = data.maxHp;
            this.hp = this.maxHp;
            this.damage = data.damage;

            Console.WriteLine("{0}, 공격력 : {3} /체력 : {1}/{2}", data.name, hp, maxHp,data.damage);
        }

        public void HitDamage(int damage)
        {
            this.hp -= damage;
            Console.WriteLine("{0}이(가) 공격받았습니다. \n {0}의 체력 : {1}/{2}"
                , this.data.name, hp, maxHp);
        }

        public void Equip(int id)
        {
            //가방에서 아이템이 있는지 검색
            if (this.bag.Exist(id))
            {
                //착용
                equipItem = this.bag.GetItem(id);
                this.damage += equipItem.GetDamage();
                Console.WriteLine("{0}을 착용했습니다. 공격력 +{1} 현재공격력: {2}", equipItem.Name, equipItem.GetDamage(), this.damage);
            }
            else
            {
                Console.WriteLine("아이템 {0}을 찾을 수 없습니다");
            }
        }
        public void Attack(Monster monster)
        {
            monster.HitDamage(this.damage);
        }

        public void SetBag(Inventory inven)
        {
            this.bag = inven;
            Console.WriteLine("{0}칸 짜리 가방을 지급받았습니다",this.bag.GetCapacity());
        }

        public void SetItem(Item item)
        {
            bag.AddItem(item);
            Console.WriteLine("{0}을 가방에 저장했습니다", item.Name);
        }

        public int GetItemCount()
        {
            return this.bag.Count;
        }

    }
}

Inventory

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

namespace LearnDotnet
{
    public class Inventory
    {
        private int capacity;
        private List<Item> items = new List<Item>();
        public int Count
        {
            get
            {
                return this.items.Count;
            }
        }
        //생성자
        public Inventory(int capacity)
        {
            this.capacity = capacity;
        }

        public void AddItem(Item item)
        {
            this.items.Add(item);
            Console.WriteLine("{0} {1} 이 가방에 들어갔습니다.", item.GetID(), item.Name);
        }

        public int GetCapacity()
        {
            return this.capacity;
        }

       public bool Exist(int id) //inventory에 해당 아이템이 있는지 검색
        {
            //2개동일
            Item item = this.items.Find(x => x.GetID() == id);
            if (item == null) return false;
            else return true;

            //for(int i=0; i<this.items.Count; i++)
            //{
            //    if (this.items[i].GetID() == id)
            //    {
            //        Console.WriteLine("찾았다");
            //        return true;
            //    }
            //}
            //return false;
        }
        public Item GetItem(int id) //inventory에서 아이템을 받아옴
        {
         //   return this.items.Find(x => x.GetID() == id);
            Item foundItem = null;
            for(int i=0; i<this.items.Count; i++)
            {
                if (this.items[i].GetID() == id)
                {
                    foundItem = this.items[i];
                    //리스트에서 제거
                    this.items.Remove(foundItem);
                    break;
                }
            }
            return foundItem;
        }
    }
}

-----데이터 관리 클래스 DataManager---------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace LearnDotnet
{
    //싱글톤 패턴 이용
    public class DataManager
    {
        public static readonly DataManager instance = new DataManager();
        Dictionary<int, ItemData> itemDic = new Dictionary<int, ItemData>();
        Dictionary<int, MonsterData> monsterDic = new Dictionary<int, MonsterData>();
        ItemData[] itemDatas;
        MonsterData[] monsterDatas;

        //생성자
        private DataManager()
        {

        }

        public void LoadItemData()
        {
            string itemJson = File.ReadAllText("./item_data.json");
            //역직렬화 하면 ItemData객체들을 요소로 하는 배열 객체가 나온다. 
            itemDatas = JsonConvert.DeserializeObject<ItemData[]>(itemJson);
            foreach(ItemData itemData in itemDatas)
            {
      //          Console.WriteLine("item's id: {0}, item's name: {1}, item's damage: {2}", itemData.id, itemData.name, itemData.damage);
                itemDic.Add(itemData.id, itemData);
            }
            //Console.WriteLine(itemDic.Count);
        }

        public void LoadMonsterData()
        {
            string monsterJson = File.ReadAllText("./monster_data.json");
            monsterDatas = JsonConvert.DeserializeObject<MonsterData[]>(monsterJson);
            foreach(MonsterData monsterData in monsterDatas)
            {
            //    Console.WriteLine("Monster's id: {0}, Monster's name: {1}, Monster's item_id: {2}, Monster's maxHp: {3}", 
             //       monsterData.id, monsterData.name, monsterData.item_id, monsterData.maxHp);
                monsterDic.Add(monsterData.id, monsterData);
            }
            //Console.WriteLine(monsterDic.Count);

        }

        public MonsterData GetMonsterData(int id)
        {
            return this.monsterDic[id];
        }

        public ItemData GetItemData(int id)
        {
            return this.itemDic[id];
        }
    }
}

-------------Game----------

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

namespace LearnDotnet
{
    public class Game
    {
        private Hero hero;
        private Monster monster;
        public Game()
        {

        }

        public void Start()
        {
            Console.WriteLine("게임이 시작되었습니다");
            this.hero = this.CreateHero(); //영웅 생성
            this.monster = this.CreateMonster(1000); //몬스터 생성
            //대리자 실행 
            this.monster.onDie = () =>
            {
                //아이템 생성
                int itemId = this.monster.GetMonsterItemId();
                Item dropitem = this.CreateItem(itemId);
                Console.WriteLine("{0}이 죽었습니다 \n {1} 아이템이 나왔습니다", monster.GetMonsterName(), dropitem.Name);
                //아이템 획득
                this.hero.SetItem(dropitem);

                int itemCount = this.hero.GetItemCount();
                Console.WriteLine(itemCount);
            };

            //가방 만들어서 영웅에게 지급 
            Inventory bag = new Inventory(5);
            this.hero.SetBag(bag);
            //무기 지급 (장검)
            Item item = this.CreateItem(100);
            this.hero.SetItem(item);
            //장비 착용하기
            this.hero.Equip(100);
            //몬스터 공격하기
            this.hero.Attack(this.monster);

        }

        private Hero CreateHero()
        {
            return new Hero(new HeroData(10000,"Arthor",3));
        }

        private Monster CreateMonster(int id)
        {
            MonsterData data = DataManager.instance.GetMonsterData(id);
            return new Monster(data);
        }

        private Item CreateItem(int id)
        {
            ItemData data = DataManager.instance.GetItemData(id);
            return new Item(data);
        }

        private void MonsterAttack()
        {
            Console.WriteLine("몬스터 {0} 이(가) 영웅{1}을 공격했다");
        }

        private void HeroAttack()
        {

        }
    }
}

실행

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Newtonsoft;
using Newtonsoft.Json;

namespace LearnDotnet
{
    //형식 정의
    public class App
    {
        private Game game;
        public App()
        {
            // ------------------게임 준비 -----------------
            DataManager.instance.LoadItemData();
            DataManager.instance.LoadMonsterData();
            //----------------------------------------------

            //----------게임 시작 ----------------
            this.game = new Game();
            this.game.Start();

        }
    }

}